0034-使用OpenCV的函数findContours提取轮廓并绘制轮廓

OpenCV里提取目标轮廓的函数是findContours,它的输入图像是一幅二值图像,输出的是每一个连通区域的轮廓点的集合。

下面介绍相关函数的用法
findContours函数:
原型如下
C++: void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset=Point())
C++: void findContours(InputOutputArray image, OutputArrayOfArrays contours, int mode, int method, Point offset=Point())
参数意义如下
image:源图像,8位的单通道二值图像。
contours:检测到的轮廓。每个轮廓都存存储为一组点向量。
hierarchy:可选输出参数。它记录着图像的拓扑结构信息。有多少个轮廓这个参数就有多少个元素。对于第i个轮廓,hierarchy[i][0]表示下一个轮廓;hiearchy[i][1]表示前一个轮廓 , hiearchy[i][2]表示第一个子轮廓 , hiearchy[i][3] 表示第一个父轮廓。如果没有相应的轮廓,则值为负。
mode:拓朴检测模式,有以下可选参数:
  CV_RETR_EXTERNAL:只返回外轮廓。这种模式下没有子轮廓和父轮廓了。
  CV_RETR_LIST:返回所有的轮廓。但是不建立轮廓的拓扑关系,所以hierarchical为空。
  CV_RETR_CCOMP:返回所有的轮廓,而且把这些轮廓分为两层拓扑结构。第一层,是所有物体的外边界。第二层,是所有洞(hole)的边界。如果洞(hole)中还有其它连通的物体,那么这个物体也被划分到第一层中。
  CV_RETR_TREE:返回所有的轮廓,并且建立完整的拓扑结构。
method:轮廓近似方法,有以下可选参数:
  CV_CHAIN_APPROX_NONE:存储所有的轮廓点。这种方法下,两个连续的轮廓点,满足max(abs(x1-x2),abs(y2-y1))==1. 
  CV_CHAIN_APPROX_SIMPLE:压缩掉轮廓的中间点。比如说一个矩形只需要知道四个端点即可。
  CV_CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS:使用eh-Chin chain approximation 算法!
offset:这个参数用来设置轮廓偏移值。

drawContours函数:
这个函数用来绘制轮廓或填充轮廓
原型如下
C++: void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness=1, int lineType=LINE_8, InputArray hierarchy=noArray(), int maxLevel=INT_MAX, Point offset=Point() )
参数意义如下
image:目标图像。
contours: 待画图的轮廓,每个轮廓被存储为一个矢量。
contourIdx:指定哪些轮廓需要被绘制。如果这个值为负,则表示所有的轮廓都需要绘制。
color:轮廓颜色。
thickness:轮廓线宽。
lineType:线类型。
hierarchy:可选参数,表示轮廓的拓扑结构。
maxLevel:在参数hierarchy有效的情况下,这个参数为0表示只绘制指定的轮廓;为1表示绘制所有的外轮廓和内嵌轮廓;为2表示维持所有的外轮廓、内嵌轮廓和内嵌轮廓之间的联接轮廓。
offset:轮廓偏移值。

示例代码如下:

代码请加Q2034196302获取
代码请加Q2034196302获取
代码请加Q2034196302获取

运行结果截图如下

猜你喜欢

转载自blog.csdn.net/opencv_source/article/details/78779345