如何寻找第二大轮廓

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)

youcans 的 OpenCV 例程200篇194.寻找图像轮廓(cv.findContours)

如何寻找已知轮廓的最大内接圆

如何在excel中找出除去最大值以外的第二大值

找出一个整形数组中第二大的数字

EmgnCv进行轮廓寻找和计算物体凸包