OpenCV C ++:按轮廓面积对轮廓进行排序

时间:2012-11-21 14:17:17

标签: c++ sorting opencv contour

如何根据轮廓区域的大小对轮廓进行排序?我怎样才能获得最大/最小的一个?

2 个答案:

答案 0 :(得分:28)

您可以将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];

答案 1 :(得分: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]以获得具有最大区域的轮廓,因为轮廓按升序排序。