OpenCV C ++: ordinamento dei contorni in base al loro profilo

Come posso ordinare i contorni in base alla dimensione delle loro aree di contorno? E come posso ottenere il più grande / più piccolo?

È ansible utilizzare std::sort con un object funzione di confronto personalizzato

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

Uso:

 [...] // find contours std::vector > contours; std::vector 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 biggestContour = contours[contours.size()-1]; std::vector smallestContour = contours[0]; 

Basta dare una soluzione usando la funzione lambda se è disponibile C ++ 11.

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

Quindi è ansible accedere ai contours[0] per ottenere il contorno con l'area più piccola ei contours[contours.size()-1] per ottenere quello con l'area più grande perché i contorni sono ordinati in ordine ascendente.