OpenCV学习笔记(十七):查找并绘制轮廓:findContours()
1、findContours() 函数
该函数使用Suzuki85算法从二值图像中检索轮廓。轮廓线是一种用于形状分析、目标检测和识别的有效工具。
opencv轮廓检测之FindContours函数算法解释
该函数从二值图像中检索轮廓,并返回检索到的轮廓数。函数将填充指针first_contour。它将包含指向第一个最外层轮廓的指针,如果没有检测到轮廓,则为空(如果图像是完全黑色的)。可以使用h_next和v_next链接从first_contour到达其他轮廓。绘制等值线讨论中的示例说明了如何使用等值线进行连接组件检测。轮廓还可以用于形状分析和对象识别-请参阅OpenCV示例目录中的squares.c。
void findContours(
InputOutputArray image, // 要绘制轮廓的图像,8位单通道的图像(256级灰度图)
OutputArrayOfArrays contours, // 所有输入的轮廓,找到的轮廓,其中每个轮廓会被存储为vector<Point>,
// 所以contours的类型就是vector<vector<Point>>。
OutputArray hierarchy, // 层次结构,可选的输出向量,包含关于图像的拓扑结构信息。
// 其具有跟轮廓数相同的元素个数,类型为vector<Vec4i>
// 后一个轮廓、前一个轮廓、第一个子轮廓、父轮廓的索引编号,如果没有对应项,该值设置为-1
int mode, // 检索轮廓的模式分别表示
int method, // 为轮廓的近似办法
Point offset=Point() // 代表轮廓点的偏移量,可以设置为任意值。
);
==mode==
RETR_EXTERNAL 表示只检测外轮廓
RETR_LIST 检测的轮廓不建立等级关系
RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边 界信息。
如果内孔内还有一个连通物体,这个物体的边界也在顶层。
RETR_TREE 建立一个等级树结构的轮廓。具体参考contours.c这个demo
==method==
CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS 使用teh-Chinl chain 近似算法
2、drawContours()函数
该函数使用算法从二值图像中检索轮廓。绘制轮廓线或填充轮廓线。如果厚度≥0,该函数在图像中绘制轮廓轮廓;如果厚度<0,则填充轮廓边界区域。
参考博客:
轮廓的层级关系详解
OpenCV中findcontours函数hierarchy轮廓层级详解
void drawContours(
InputOutputArray image, // 要绘制轮廓的图像
InputArrayOfArrays contours, // 所有输入的轮廓,每个轮廓被保存成一个point向量(vector<vector<Point>>)
int contourIdx, // 指定要绘制轮廓的编号,如果是负数,则绘制所有的轮廓
const Scalar& color, // 绘制轮廓所用的颜色
int thickness=1, // 绘制轮廓的线的粗细,如果是负数,则轮廓内部被填充(CV_FILLED 填充内部)
int lineType=8, // 绘制轮廓的线的连通性(LINE_AA 抗锯齿线形)
InputArray hierarchy=noArray(), // 关于层级的可选参数,只有绘制部分轮廓时才会用到(hierarchy=hierarchy,绘制所有轮廓)
int maxLevel=INT_MAX, // 绘制轮廓的最高级别,这个参数只有hierarchy有效的时候才有效
Point offset=Point() // 代表轮廓点的偏移量,可以设置为任意值
)
==maxLevel==
maxLevel=0,绘制与输入轮廓属于同一等级的所有轮廓即输入轮廓和与其相邻的轮廓
maxLevel=1, 绘制与输入轮廓同一等级的所有轮廓与其子节点。
maxLevel=2,绘制与输入轮廓同一等级的所有轮廓与其子节点以及子节点的子节点
3、approxPolyDP()函数
以指定的精度近似生成多边形曲线。
函数逼近一条曲线或另一条曲线/顶点较少的多边形,使它们之间的距离小于或等于指定的精度。它使用Douglas-Peucker算法
void approxPolyDP(
InputArray curve, // 输入的点集(存储在std::vector或Mat中的二维点的输入向量)
OutputArray approxCurve, // 输出的点集,当前点集是能最小包容指定点集的。draw出来即是一个多边形;<