【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参数,这样,轮廓就能画在与原定义的绝对坐标系不同的地方。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`findContours` 和 `drawContours` 是 OpenCV 库中用于轮廓检测和绘制轮廓函数。 `findContours` 函数用于在图像中查找轮廓。它接受输入图像、轮廓检测模式和轮廓近似方法作为参数,并返回检测到的轮廓轮廓检测模式决定了如何处理输入图像和输出轮廓的关系,而轮廓近似方法则决定了如何近似表示检测到的轮廓。 一般来说,使用 `findContours` 的基本步骤如下: 1. 首先,准备一个二值化图像,其中包含你想要检测轮廓的对象。 2. 调用 `findContours` 函数,传入二值化图像以及其他参数。 3. `findContours` 函数会返回一个包含所有检测到的轮廓的向量。 4. 可以通过遍历这个向量,对每个轮廓进行进一步的处理或绘制。 `drawContours` 函数用于绘制轮廓。它接受输入图像、待绘制轮廓轮廓的索引、绘制颜色和线宽等参数。通过调用 `drawContours` 可以将检测到的轮廓绘制在图像上。 使用 `drawContours` 的基本步骤如下: 1. 准备一个空图像作为绘制目标。 2. 调用 `drawContours` 函数,传入目标图像、待绘制轮廓轮廓的索引、绘制颜色和线宽等参数。 3. `drawContours` 函数会将轮廓绘制在目标图像上。 总结起来,`findContours` 用于检测轮廓,而 `drawContours` 用于绘制轮廓。这两个函数常用于图像处理和计算机视觉任务中,如目标检测、图像分割等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值