图像处理(OpenCV 4.1.0 +Visual Studio 2019)

第四节:轮廓提取

一、轮廓提取的一般步骤:

1、图像去噪,并进行高斯模糊

2、二值化

3、去除噪点,进行形态学操作,去除小的噪点

4、进行轮廓查找

二、轮廓提取

1、对下面图片进行轮廓提取(图片来源于网络)

图像处理(OpenCV 4.1.0 +Visual Studio 2019)

备注:https://blog.csdn.net/Lemon_jay/article/details/89349006(图片来自此链接,链接中的轮廓提取代码经测试并不可靠,于是自行查阅资料并进行修改,确认无误)

2、代码测试

图像处理(OpenCV 4.1.0 +Visual Studio 2019)

3、测试结果

图像处理(OpenCV 4.1.0 +Visual Studio 2019)

二值化处理结果

图像处理(OpenCV 4.1.0 +Visual Studio 2019)

形态学操作处理结果

图像处理(OpenCV 4.1.0 +Visual Studio 2019)

最终轮廓

4、代码同时计算了轮廓的周长与面积,如下图所示:

图像处理(OpenCV 4.1.0 +Visual Studio 2019)

三、相关函数

1、轮廓查找函数

findContours(InputOutputArray image,OutputArrayOfArrays contours,int mode, int method, Point offset=Point());

第一个参数是输入的二值图

第二个参数是检测到的轮廓(vector<<vector>Point>contours),第一个<>里面的vector是一个轮廓所有点的向量数组,外面的vector是检测到的所有轮廓向量(以单个轮廓作为向量元素)/<vector>

第三个参数是轮廓检索模式

CV_RETR_EXTERNAL=0-----表示只检测最外层轮廓--常用

CV_RETR_LIST=1------提取所有轮廓并放置在list中, 轮廓不建立等级关系

CV_RETR_CCOMP=2------提取所有轮廓并组织为双层结构

CV_RETR_TREE=3------提取所有轮廓并重新建立网状轮廓结构

第四个参数是轮廓近似方法

CHAIN_APPROX_NONE--常用--提取连续的轮廓线

CHAIN_APPROX_SIMPLE--只显示线段端点

第五个参数是偏移量,可以不设置

2、轮廓绘制函数

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() );

第一个参数是要绘制轮廓的图像,由于findContours会改变原图,所以这个绘制图像一般选择findContours前clone()的图像

第二个参数是轮廓信息

第三个参数若为负值则表示绘制所有轮廓,若为正数则表示绘制第i个轮廓

for(int i=0;i<counters.size>

{

drawcounters(tempImage,counters,i,Scalar(0,0,255))//这个效果相当于循环counters.size()次每次绘制第i个图像,及绘制所有轮廓

}

谢谢支持,欢迎交流

"/<counters.size>


分享到:


相關文章: