2012-11-21 16 views

उत्तर

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

तुलनात्मक रूप से यह कब कानूनी है जब ConcourAreas को 2 तर्कों के साथ परिभाषित किया गया है? – Zypps987

2

बस एक समाधान लैम्ब्डा समारोह का उपयोग कर यदि सी ++ 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] साथ समोच्च मिलता है।

संबंधित मुद्दे