opencv使用cv2.findContours()和cv2.drawContours()实现轮廓检测

cv2.findContours()函数

cv2.findContours(image, mode, method[, contours[, hierarchy[, offset ]]])

返回两个值:contours:hierarchy。

参数
1、image:寻找轮廓的图像;
2、mode:表示轮廓的检索模式,有四种:
cv2.RETR_EXTERNAL:表示只检测外轮廓,包含在外围轮廓内的内围轮廓被忽略;
cv2.RETR_LIST:检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系;
cv2.RETR_CCOMP:检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层;
cv2.RETR_TREE:建立一个等级树结构的轮廓外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓。
3、method:轮廓的近似办法
cv2.CHAIN_APPROX_NONE:存储所有的轮廓点到contours向量内,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1。
cv2.CHAIN_APPROX_SIMPLE:仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留,例如一个矩形轮廓只需4个点来保存轮廓信息。
4、offset:Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在所有检测出的轮廓点上加上该偏移量,并且Point还可以是负值。
5、contours:一个list,list中每个元素都是图像中的一个轮廓,用numpy中的ndarray表示。
6、hierarchy:这是一个ndarray,其中的元素个数和轮廓个数相同,每个轮廓contours[i]对应4个hierarchy元素hierarchy[i][0] ~hierarchy[i][3],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号,如果没有对应项,则该值为负数。opencv3.0版本以后变了,第三个是内嵌的第一个子轮廓,第四个是父轮廓。

cv2.drawCountours()函数

cv2.drawCountours(img, contours, contourIdx, color, thickness)

参数说明:
1、img:表示输入的需要画的图片;
2、contours:findContours函数返回的轮廓;
3、contourIdx:轮廓的索引,-1表示绘制所有轮廓;
4、color:绘制的轮廓的颜色;
5、thickness:绘制的轮廓的线条厚度;

img = cv2.imread('contours.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
cv_show(thresh,'thresh')

在这里插入图片描述

contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
# 传入绘制图像,轮廓,轮廓索引,颜色模式,线条厚度
# 使用copy是为了不修改原图
#这里是绘制所有轮廓
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, -1, (0, 0, 255), 2)
cv_show(res,'res')

在这里插入图片描述

##只绘制第一个轮廓
draw_img = img.copy()
res = cv2.drawContours(draw_img, contours, 0, (0, 0, 255), 2)
cv_show(res,'res')

在这里插入图片描述

发布了27 篇原创文章 · 获赞 20 · 访问量 1548

猜你喜欢

转载自blog.csdn.net/qq_39507748/article/details/104549798