如何寻找第二大轮廓
Posted GreenOpen专注图像处理
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何寻找第二大轮廓相关的知识,希望对你有一定的参考价值。
在有背景的图像处理中,往往你关注的区域并不是最大的轮廓(那是背景),而是第二大轮廓之前我们有这样的函数:
//寻找最大的轮廓
VP FindBigestContour(Mat src){
int imax = 0; //代表最大轮廓的序号
int imaxcontour = -1; //代表最大轮廓的大小
std::vector<std::vector<Point>>contours;
findContours(src,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
for (int i=0;i<contours.size();i++){
int itmp = contourArea(contours[i]);//这里采用的是轮廓大小
if (imaxcontour < itmp ){
imax = i;
imaxcontour = itmp;
}
}
return contours[imax];
}
使用的是冒泡方法。实际上vector肯定是可以有排序算法的,能否将其融入进去?
肯定是可以的,我采用了这样的方法,效果很好。
//寻找第nth的轮廓
//ith = 0代表最大,ith=1 代表第2个,以此类推
bool sortfunction (std::vector<Point> c1,std::vector<Point> c2) { return (contourArea(c1)>contourArea(c2)); }
VP FindnthContour(Mat src,int ith ){
std::vector<std::vector<Point>>contours;
findContours(src,contours,CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE);
std::sort(contours.begin(),contours.end(),sortfunction);
return contours[ith];
}
以上是关于如何寻找第二大轮廓的主要内容,如果未能解决你的问题,请参考以下文章
youcans 的 OpenCV 例程200篇194.寻找图像轮廓(cv.findContours)