【问题标题】:OpenCV C++: Sorting contours by their contourAreaOpenCV C++:按轮廓区域对轮廓进行排序
【发布时间】:2012-11-09 19:39:24
【问题描述】:

如何按轮廓区域的大小对轮廓进行排序?我怎样才能得到最大/最小的?

【问题讨论】:

    标签: c++ sorting opencv contour


    【解决方案1】:

    您可以将std::sort 与自定义比较函数对象一起使用

    // comparison function object
    bool compareContourAreas ( std::vector<cv::Point> contour1, std::vector<cv::Point> contour2 ) {
        double i = fabs( contourArea(cv::Mat(contour1)) );
        double j = fabs( contourArea(cv::Mat(contour2)) );
        return ( i < j );
    }
    

    用法:

    [...]
    
    // find contours
    std::vector<std::vector<cv::Point> > contours;
    std::vector<cv::Vec4i> hierarchy;
    cv::findContours( binary_image, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, cv::Point(0, 0) );
    
    // sort contours
    std::sort(contours.begin(), contours.end(), compareContourAreas);
    
    // grab contours
    std::vector<cv::Point> biggestContour = contours[contours.size()-1];
    std::vector<cv::Point> smallestContour = contours[0];
    

    【讨论】:

    • 当 compareContourAreas 用 2 个参数定义时,这怎么合法?
    【解决方案2】:

    如果 C++11 可用,只需使用 lambda 函数给出解决方案。

        sort(contours.begin(), contours.end(), [](const vector<Point>& c1, const vector<Point>& c2){
        return contourArea(c1, false) < contourArea(c2, false);
    });
    

    然后你可以访问contours[0]得到面积最小的轮廓,contours[contours.size()-1]得到面积最大的轮廓,因为轮廓是按升序排列的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-20
      • 2021-09-14
      • 2013-05-29
      • 2017-01-17
      • 2015-12-16
      • 2014-07-12
      • 2015-06-24
      相关资源
      最近更新 更多