opencv 轮廓提取
轮廓指的是将连续的点连接在一起的曲线,具有相同的灰度值或颜色,提取轮廓就是提取这些具有相同颜色或灰度值的曲线
寻找轮廓应该用二值图,这样更明显
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相当于二维数组
)
}
}
代码
代码效果