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
未完待续!!!