13

輪郭領域のサイズで輪郭を並べ替えるにはどうすればよいですか?そして、どうすれば最大/最小のものを入手できますか?

4

2 に答える 2

35

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];
于 2012-11-21T14:17:16.913 に答える
5

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]

于 2015-12-07T14:20:19.250 に答える