目录
查找并绘制轮廓:
1. findContours() 函数。查找轮廓。函数原型如下:
void findContours(InputOutputArray image, OutputArrayOfArrays contours, OutputArray hierarchy, int mode, int method, Point offset = Point());
(1)第一个参数,InputArray 类型的 image,源图像。8位单通道。图像的非零元素被视为 1,0 像素值保留为 0,所以图像为二进制。也可以使用 compare()、inrange()、threshold()、adaptivethreshold()、canny() 等函数由灰度图或彩色图创建二值图。此函数将会在提取图像轮廓的同时修改图像的内容。如果第四个参数为cv::RETR_CCOMP或cv::RETR_FLOODFILL,输入图像可以是32-bit整型图像(CV_32SC1) 。
(2)第二个参数,OutputArrayOfArrays 类型的 contours、检测到的轮廓、函数调用后的运算结果存在这里。每个轮廓存储为一个点向量,即用 Point 类型的 vector 表示。
(3)第三个参数,OutputArray 类型的 hierarchy,可选的输出向量,包含图像的拓扑信息。其作为轮廓数量的表示,包含了很多元素。每个轮廓 contours[ i ] 对应 4 个 hierarchy 元素 hierarchy[ i ][ 0 ] ~ hierarchy[ i ][ 3 ],分别表示后一个轮廓、前一个轮廓、父轮廓、内嵌轮廓的索引编号。如果没有对应项,对应的 hierarchy[ i ] 值设置为负数。
(4)第四个参数,int 类型的 mode,轮廓检索模式,如下所示:
RETR_EXTERNAL,表示只检索最外层轮廓。对所有轮廓,设置 hierarchy[i][2] = hierarchy[i][3] = -1。
RETR_LIST,提取所有的轮廓,并且放置在 list 中。检测的轮廓不建立等级关系。
RETR_CCOMP,提取所有轮廓,并且将其组织为双层结构(顶层为连通域的外围边界,次层为孔的内层边界)。
RETR_TREE,提取所有轮廓,并重新建立网状的轮廓结构。
(5)第五个参数,int 类型的 method,为轮廓的近似方法。如下所示:
CHAIN_APPROX_NONE,获取每个轮廓的每个像素,相邻的两个点的像素位置差不超过1。
CHAIN_APPROX_SIMPLE,压缩水平、垂直、对角线方向的元素,只保留该方向的终点坐标。如矩形只留四个点。
CHAIN_APPROX_TC89_L1 和 CHAIN_APPROX_TC89_KCOS, 使用 Teh-Chinl 链逼近算法中的一个。
2. drawContours() 函数,绘制轮廓。函数原型如下:
void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness = 1, int lineType = 8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point());
(1)第一个参数,InputArray 类型的 image,输入输出图像。
(2)第二个参数,InputArrayOfArrays 类型的 contours,所有的输入轮廓,findContours() 查找到的。
(3)第三个参数,int 类型的 contourIdx,轮廓绘制的指示变量。若为负值,则绘制全部轮廓。
(4)第四个参数,const Scalar& 类型的 color,轮廓的颜色。
(5)第五个参数,int 类型的 thickness,轮廓线条的粗细度,默认值为 1。若为负值,便会绘制在轮廓的内部。可选为FILLED 宏变量。
(6)第六个参数,int 类型的 lineType,线条的类型,默认值为 8。有如下类型:
8, 8 联通线型;
4,4 联通线型;
LINE_AA, 抗锯齿线型。