2012-11-21 16 views

Antwort

28

Sie können std::sort mit einer benutzerdefinierten Vergleichsfunktion Objekt verwenden

// 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); 
} 

Verbrauch:

[...] 

// 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]; 
+0

Wie ist das zulässig, wenn die compareContourAreas mit 2 Argumenten definiert ist? – Zypps987

2

einfach eine Lösung geben Funktion mit dem Lambda, wenn C++ 11 zur Verfügung steht.

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

Dann können Sie contours[0] Zugriff auf die Kontur mit dem kleinsten Bereich zu bekommen und contours[contours.size()-1] das mit der größten Fläche zu erhalten, weil die Konturen in aufsteigender Reihenfolge sortiert werden.

Verwandte Themen