【发布时间】:2012-11-09 19:39:24
【问题描述】:
如何按轮廓区域的大小对轮廓进行排序?我怎样才能得到最大/最小的?
【问题讨论】:
标签: c++ sorting opencv contour
如何按轮廓区域的大小对轮廓进行排序?我怎样才能得到最大/最小的?
【问题讨论】:
标签: c++ sorting opencv contour
您可以将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];
【讨论】:
如果 C++11 可用,只需使用 lambda 函数给出解决方案。
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]得到面积最大的轮廓,因为轮廓是按升序排列的。
【讨论】: