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() //点偏移量
                   );
©️2020 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页