opencv 轮廓提取

来源:互联网 发布:企业注册域名 编辑:程序博客网 时间:2024/06/05 08:09

轮廓指的是将连续的点连接在一起的曲线,具有相同的灰度值或颜色,提取轮廓就是提取这些具有相同颜色或灰度值的曲线

寻找轮廓应该用二值图,这样更明显

findcontours会改变原图,应该用copyto保存原图

查找轮廓应该是在黑色背景中找到白色物体



一:轮廓查找函数findContours( InputOutputArray image, OutputArrayOfArrays contours,int mode, int method, Point offset=Point());

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

第二个参数是检测到的轮廓(vector<<vector>Point>contours),第一个<>里面的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--只显示线段端点


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


二:轮廓绘制函数---drawContours(tempImage,contours,-1,Scalar(0,0,255),2,8);

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

{

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

}

第四个参数是绘制轮廓的线性颜色



三:轮廓个数读取

cout<<"轮廓个数"<<contours.size()<<endl;

由于vector是向量,.size()表示的是向量的个数,而外层的vector表示的是所有轮廓信息,及counter.size()保存的是轮廓个数

内层的vector向量保存的是单个轮廓的点信息,那么counters[i].size()表示的是单个轮廓的信息,及单个轮廓点的个数


四:轮廓访问

for(int i=0;i<counters.size();i++)//counters.size()表示的是轮廓的个数,counters相当于一个二维数组

{

for(int j=0;j<counters[i].size();j++)//counters[i].size()表示的是第i个轮廓所包含点的个数

{

circle(img,Point(counters[i][j].x,counter[i][j].y,100,Scalar(0,0,255))//counters[i][j]是第i个轮廓的第j个点,counters相当于二维数组

)

}

}


代码




代码效果




原创粉丝点击