【OpenCV】findContours()和drawContours轮廓的查找和绘制

虽然Canny之类的边缘检测算法可以根据像素间的差异检测出轮廓边界的像素,但是它并没有将轮廓作为一个整体进行处理。
函数findContours():可以将这些边缘像素合成轮廓。一个轮廓对应一系列点,这些点以某种方式表示图像中的一条曲线。
1)在opencv中,轮廓用标准模板库(STL)向量vector<>表示;
2)它处理的图像可以是Canny()函数得到的有边缘像素的图像,或者是threshold()/adaptiveThreshold()函数得到的图像(处理边缘图像和二值图像的方式有细微差别。findContours()函数并不理解边缘图像,这意味着对于findContours函数,一条“边缘”只是一块非常窄的“白色区域”,因此对于每一条外部轮廓,总有一条几乎完全相同的孔轮廓。实际上,这个孔就是外部边界的内部区域。可以把它当作从白色到黑色的过渡区域,同时也表示边缘曲线的内部边界),这是边缘是正负区域之间的边界。
3)区分内部和外部边界
使用threshold之后findContours,结果如下

threshold(xxxx, xxxx, solderjointthreshold, 255, CV_THRESH_BINARY_INV);
vector<vector<Point>> xxxcontours;
vector<Vec4i>xxxhierarchy;
findContours(xxxx, xxxcontours, xxxhierarchy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point(0, 0));

函数的原型

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

运行时,输入图像会被直接涂改,如果将来还有用的图像,应该复制一张。
第一个参数是输入图像,必须是8位单通道图像,并且应该被转化成二值的;
第二个参数是一组数组,数组中contours[i]是一条特定轮廓,而contours[i][j]则是contour[i]中的一个点;
第三个参数hierarchy是可选的,hierarchy输出的是一个数组,每条轮廓对应数组中的一个值,数组中的每个值都是一个四元数组,每个元素代表一个与当前节点有特定链接额节点。
第四个参数mode

cv::RETR_EXTERNAL              
cv::RETR_LIST
cv::RETR_CCOMP
cv::RETR_TREE

第五个参数method

cv::CHAIN_APPROX_NONE
cv::CHAIN_APPROX_SIMPLE
cv::CHAIN_APPROX_TC89_L1 or cv::CHAIN_APPROX_TC89_KC05

第六个参数offset,该参数是可选项,给定一个参数,返回的轮廓中所有点都会根据参数值发生偏移。

函数drawContours用于绘制出findContours所找到的多个轮廓。
void drawContours(InputOutputArray image,InputArrayOfArrays contours,int contourIdx,const Scalar& colot,int thickness=1,int lineType=8,InputArray hierarchy=noArray(),int maxLevel=INT_MAX,Point offset=Point())
参数解释:
1.img-----代表输入的图像矩阵,将轮廓画在该图上;
2.contours-----代表多个轮廓;
3.contourIdx-----代表绘制contours中的第几个轮廓;
4.color-----代表绘制的颜色;
5.thickness—代表绘制的粗细,如果该参数值小于0,则表示填充整个轮廓内的区域。
当thickness>=0时,绘制轮廓线;
当thickness<0时,填充由轮廓包围的部分,等同于CV_FILLED
6.line type-----可以是4或8,代表绘制的线将是四连通线(不美观)、八连通线(较美观)或是cv::AA线(美观)。
7.hierarchy-----对应函数findContours()函数输出的层次。
8.maxLevel-----限制将在图上绘制的轮廓层次深度。将maxLevel设为0表示只绘制第0层(最高层次)的轮廓;设为其它非0正数,则表示绘制最高层以下相同数量层级的轮廓。
9.offset-----绘制轮廓时可以设置Offset参数,这样,轮廓就能画在与原定义的绝对坐标系不同的地方。

猜你喜欢

转载自blog.csdn.net/weixin_42104289/article/details/85048735