分享

opencv学习笔记十四:使用cv2.findContours()和cv2.drawContours()实现轮廓检测...

 行走在理想边缘 2021-08-06

一、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

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多