(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)

相关推荐

  • findContours()函数

    函数原型 findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int m ...

  • opencv笔记(二十九)——提取轮廓相关函数使用方法

    opencv中常用的跟轮廓相关的操作有:findContours()查找轮廓:drawContours()画轮廓:轮廓填充:计算轮廓的面积和周长:提取轮廓凸包,矩形,最小外接矩形,外接圆等.它们都有相 ...

  • OpenCV学习28

    查找轮廓 什么是轮廓:一个轮廓是由图像中的一系列点组成的,也就是图像中的一条曲线.在OpenCV中一般用序列来存储轮廓信息.序列中的每个元素是曲线中每个点的位置. 关于序列:序列是内存存储器中可以存储 ...

  • OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标

    OPENCV之寻找并绘制轮廓以及提取轮廓重心坐标 1.寻找轮廓 声明:在寻找图像轮廓之前需要对图像进行阈值分割或者Canny.拉普拉斯等边缘检测算子处理. 寻找轮廓的算子: findContours( ...

  • OpenCV C++ 简单小技巧

    查找和绘制轮廓findContours 会找到vector<vector<cv::Point>> contours;vector<Vec4i> hierarchy; ...

  • 【从零学习OpenCV 4】轮廓发现与绘制

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<OpenCV 4开发详解>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • OpenCV图像处理教程C++(二十)轮廓发现、凸包、轮廓周围绘制圆和矩形

    轮廓发现–边缘 轮廓发现是基于图像边缘提取的基础寻找对象轮廓的方法,所以边缘提取的阈值选定会影响最终轮廓结果拓扑:就是把实体抽象成与其大小.形状无关的点,而把连接实体的线路抽象成"线&quo ...

  • 【从零学习OpenCV 4】图像矩的计算与应用

    重磅干货,第一时间送达 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4入门书籍<从零学习OpenCV 4>.为了更让小伙伴更早的了解最新版的OpenCV 4,小白与出版社沟通 ...

  • 基于OpenCV实战:绘制图像轮廓(附代码)

    重磅干货,第一时间送达 山区和地形图中海拔高的区域划出的线称为地形轮廓,它们提供了地形的高程图.这些线条可以手动绘制,也可以由计算机生成.在本文中,我们将看到如何使用OpenCV在简单图像上绘制轮廓线 ...

  • opencv3/C++轮廓的提取与筛选

        版权声明:本文为博主原创文章. https://blog.csdn.net/akadiao/article/details/78843773 <div class="markd ...