Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV C++;:按等高线面积排序等高线_C++_Sorting_Opencv_Contour - Fatal编程技术网

C++ OpenCV C++;:按等高线面积排序等高线

C++ OpenCV C++;:按等高线面积排序等高线,c++,sorting,opencv,contour,C++,Sorting,Opencv,Contour,如何根据轮廓区域的大小对轮廓进行排序?如何获得最大/最小值?您可以与自定义比较函数对象一起使用 // comparison function object bool compareContourAreas ( std::vector<cv::Point> contour1, std::vector<cv::Point> contour2 ) { double i = fabs( contourArea(cv::Mat(contour1)) ); doubl

如何根据轮廓区域的大小对轮廓进行排序?如何获得最大/最小值?

您可以与自定义比较函数对象一起使用

// 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 );
}
//比较函数对象
布尔比较区域(标准::矢量轮廓1,标准::矢量轮廓2){
双i=fabs(轮廓面积(cv::Mat(轮廓1));
双j=fabs(轮廓面积(cv::Mat(轮廓2));
返回(i
用法:

[...]

// 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];
[…]
//寻找轮廓
矢量轮廓;
向量层次;
cv::findContours(二值图像、轮廓、层次结构、cv\ RETR\ U外部、cv\链\近似\简单、cv::Point(0,0));
//等高线排序
std::sort(contours.begin()、contours.end()、compareContourAreas);
//抓取等高线
std::vector biggestContour=轮廓[contours.size()-1];
std::vector smallestContour=等高线[0];

如果C++11可用,只需使用lambda函数给出一个解决方案即可

    sort(contours.begin(), contours.end(), [](const vector<Point>& c1, const vector<Point>& c2){
    return contourArea(c1, false) < contourArea(c2, false);
});
排序(等高线.begin(),等高线.end(),[](常量向量和c1,常量向量和c2){
返回轮廓区域(c1,假)<轮廓区域(c2,假);
});

然后,您可以访问
等高线[0]
以获取具有最小面积的等高线,并访问
等高线[courts.size()-1]
以获取具有最大面积的等高线,因为等高线是按升序排序的

当compareContourAreas用2个参数定义时,这是如何合法的?