2012-11-21 104 views

答えて

28

あなたはカスタム比較関数オブジェクトを

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

使用std::sortを使用することができます:C++ 11が利用可能な場合だけでラムダ関数を使用して溶液を得

[...] 

// 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

compareContourAreasが2つの引数で定義されている場合、どのようにこの法律が有効ですか? – Zypps987

2

を。

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

その後、輪郭が昇順にソートされているので、最大面積と1を取得するために最小の面積とcontours[contours.size()-1]との輪郭を取得するためにcontours[0]にアクセスすることができます。