OpenCV C ++: сортировка контуров по их контуру

Как я могу отсортировать контуры по размеру их контурных областей? И как я могу получить самый большой / самый маленький?

10

Решение

Ты можешь использовать 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];
28

Другие решения

Просто дайте решение с использованием лямбда-функции, если доступен C ++ 11.

    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] чтобы получить тот с самой большой площадью, потому что контуры отсортированы в порядке возрастания.

2