(11条消息) opencv学习笔记十四:使用cv2.findContours()和cv2.drawContours()实现轮廓检测
一、cv2.findContours()函数
contours, hierarchy=cv2.findContours(image, mode,
method[, contours[,
hierarchy[, offset ]]])
参数
1、image:寻找轮廓的图像;
2、mode:表示轮廓的检索模式,有四种:
mode | 含义 |
---|---|
cv2.RETR_EXTERNAL | 表示只检测外轮廓,包含在外围轮廓内的内围轮廓被忽略 |
cv2.RETR_LIST | 检测所有的轮廓,包括内围、外围轮廓,但是检测到的轮廓不建立等级关系,彼此之间独立,没有等级关系 |
cv2.RETR_CCOMP | 检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层 |
cv2.RETR_TREE | 建立一个等级树结构的轮廓外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓 |
3、method:轮廓的近似办法
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')
赞 (0)