OpenCV--提取轮廓findContours()函数和轮廓填充drawContours()

findContours函数原型

void findContours( InputOutputArray image, 
				   //图像源,8位单通道图像。非零像素被视为1。0像素保持为0,因此图最好为二值图像,边缘检测算子处理的二值图像。如果mode等于#RETR_CCOMP或#RETR_FLOODFILL,则输入也可以是标签的32位整数图像(CV_32SC1)。
				   OutputArrayOfArrays contours,
				   //轮廓检测到的轮廓。每个轮廓都存储为一个点向量vector<vector<Point> >
                   OutputArray hierarchy, 
                   //hierarchy定义为“vector<Vec4i> hierarchy”,hierarchy是一个向量;向量内每个元素都是一个包含4个int型的数组;向量hierarchy内的元素和轮廓向量contours内的元素是一一对应的,向量的容量相同;hierarchy内每个元素的4个int型变量,分别表示当前轮廓 i 的后一个轮廓、前一个轮廓、父轮廓和内嵌轮廓的编号索引,如果当前轮廓没有对应的后一个轮廓、前一个轮廓、内嵌轮廓和父轮廓,则相应的hierarchy[i][*]被置为-1。
                   int mode,
                   //轮廓的检索模式
                   int method, 
                   //轮廓的近似方法
                   Point offset = Point()
                   //Point偏移量,所有的轮廓信息相对于原始图像对应点的偏移量,相当于在每一个检测出的轮廓点上加上该偏移量,并且Point还可以是负值!
                   );
第二个参数contours:

vector<vector<Point>> contours,储存轮廓的位置信息,由点组成的线条或者顶点信息;

第三个参数hierarchy:

vector<Vec4i> hierarchy,Vec4i是用于表示具有4维的向量的结构,每个值为int,分别表示当前轮廓 i 的后一个轮廓、前一个轮廓、父轮廓和内嵌轮廓的编号索引,访问方法为hierarchy[i][*].

第四个参数mode:
模式作用
RETR_EXTERNAL仅检索外部轮廓。它为所有的轮廓设置
hierarchy[i][2]=hierarchy[i][3]=-1
RETR_LIST在不建立任何层次关系的情况下检索所有轮廓
hierarchy[i][0]=hierarchy[i][1]=hierarchy[i][2]=hierarchy[i][3]=-1
RETR_CCOMP检测所有的轮廓,但所有轮廓只建立两个等级关系,外围为顶层,若外围内的内围轮廓还包含了其他的轮廓信息,则内围内的所有轮廓均归属于顶层
RETR_TREE检测所有轮廓,所有轮廓建立一个等级树结构。外层轮廓包含内层轮廓,内层轮廓还可以继续包含内嵌轮廓
hierarchy[i][1]=hierarchy[i][1]=hierarchy[i][2]=hierarchy[i][3] !=-1

以RETR_TREE举例,下图找到4个轮廓,关系如图:
在这里插入图片描述
层级关系:轮廓1:

hierarchy[1][0] 表示contours[3];
hierarchy[1][1] 表示contours[0];
hierarchy[1][2] 表示contours[0];
hierarchy[1][3] 表示contours[3];

在这里插入图片描述

第五个参数method:
近似方法作用
CV_CHAIN_CODE用freeman链码输出轮廓contours->v_next或h_next,其他方法输出多边形(顶点的序列)
CV_CHAIN_APPROX_NONE保存物体边界上所有连续的轮廓点到contours向量内
CV_CHAIN_APPROX_SIMPLE仅保存轮廓的拐点信息,把所有轮廓拐点处的点保存入contours向量内,拐点与拐点之间直线段上的信息点不予保留
CV_CHAIN_APPROX_TC89_L1或CV_CHAIN_APPROX_TC89_KCOSTen-Chin链逼近算法中的一个
CV_LINK_RUNS,连接所有水平层次的轮廓.此方法只可与RETR_LIST搭配使用

drawContours函数原型

void drawContours( InputOutputArray image, //目标图片
				   InputArrayOfArrays contours,//绘制轮廓需要的点集合 vector<vector<Point>>
                   int contourIdx, //需要绘制的轮廓序号,为负时绘制所有轮廓
                   const Scalar& color,//轮廓颜色
                   int thickness = 1, //轮廓的线宽,如果为负值或CV_FILLED表示填充轮廓内部
                   int lineType = LINE_8,//线型
                   InputArray hierarchy = noArray(),//轮廓结构信息
                   int maxLevel = INT_MAX, //绘制轮廓的最大级别。如果为0,则仅绘制指定的轮廓。如果为1,函数将绘制轮廓和所有嵌套轮廓。如果是2,则函数绘制轮廓、所有嵌套轮廓、所有嵌套到嵌套轮廓等。这个只有当有可用的层次结构时才考虑参数。
                   Point offset = Point() //点偏移量
                   );
  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值