图像连通域findContours和drawContours函数详解

void findContours( InputOutputArray image, OutputArrayOfArrays contours,
                              OutputArray hierarchy, int mode,
                              int method, Point offset = Point());

函数功能:在二值图像中查找轮廓。

轮廓检测的作用:轮廓检测常用于形状分析以及物体检测与识别。可参考opencv示例程序squares.cpp

opencv3.2之前,该函数功能没有改变。

第一个参数image: 输入的二值图像。

第二个参数contours: 检测得到的轮廓,轮廓保存在二维向量中。

第三个参数hierarchy: 对于检测到的每一个轮廓,都包含4个轮廓结构关系。我暂时理解为轮廓之间的对应关系,具体什么作用没有仔细研究过。所使用的代码只是用于保存轮廓关系,还没有使用到这个轮廓关系。

第四个参数mode: 轮廓检索模式。一般使用枚举的数据类型,参数为0-4总共5中模式。RETR_EXTERNAL=0只检索极端的外部轮廓, 它为[hierarchy] [i] [2] = hierarchy [i] [3] = - 1设置所有的轮廓。RETR_LIST= 1,检索所有轮廓而不建立任何轮廓关系。模式2  , 检索所有轮廓,并将它们组织成两级分层结构。在顶部级别,组件的外部边界。 在第二级,有洞的边界。如果在连接组件的孔内还有另一个轮廓,仍然处于最高水平。模式3,检测所有轮廓,并且重建嵌套轮廓的完整层次结构。

第五个参数method: 等值逼近。 method=2, 压缩水平线,垂直线,和对角线线段。例如:一个矩形轮廓只用4个点编码。

第六个参数offset:每个点的可选偏移量。如果图像在ROI中选取,对于分析整个图像有用。一般情况下不用设置。


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

opencv示例中contours2.cpp,有使用drawContours。segment_objects.cpp是一个使用drawContours来清理背景分割结果的例子

第一个参数image: 是输入输出的目标图像。

第二个参数contours: 将所有查找到的轮廓作为输入。存储方式是二维向量,每个轮廓都存储为一个点向量。

第三个参数contourldx: 要绘制轮廓的参数,如果是负,则绘制所有的轮廓。参数为i则绘制第i个轮廓

第四个参数color:绘制轮廓的颜色。

第五个参数thickness : 绘制轮廓线的粗细,如果是负数,则绘制内部轮廓。默认值为1


未完待续!!!


猜你喜欢

转载自blog.csdn.net/weixin_37703648/article/details/79141689