第四节:轮廓提取
一、轮廓提取的一般步骤:
1、图像去噪,并进行高斯模糊
2、二值化
3、去除噪点,进行形态学操作,去除小的噪点
4、进行轮廓查找
二、轮廓提取
1、对下面图片进行轮廓提取(图片来源于网络)
备注:https://blog.csdn.net/Lemon_jay/article/details/89349006(图片来自此链接,链接中的轮廓提取代码经测试并不可靠,于是自行查阅资料并进行修改,确认无误)
2、代码测试
3、测试结果
4、代码同时计算了轮廓的周长与面积,如下图所示:
三、相关函数
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>閱讀更多 縮手回頭 的文章