OpenCV C++ 按降序对轮廓点向量进行排序

OpenCV C++ Sorting a vector of contour point in decending order

我正在尝试按降序对轮廓点的向量进行排序,但每当我使用时:

sort(contours.begin(), contours.end() , greater<>()),

弹出错误。
如何对包含轮廓点的向量进行降序排序?

    Mat img;
    im.copyTo(img);
    vector<vector<Point>>contours;
    vector<Vec4i>hierachy;
    findContours(Canny_img , contours , hierachy , RETR_EXTERNAL , CHAIN_APPROX_SIMPLE);
    sort(contours.begin(), contours.end() , greater<Point>()); //This line getting error
   
    for(int i = 0; i < contours.size(); i++)
    {
        drawContours(img , contours , i , Scalar(0,255,0) , 2);
        imshow("Contour Image" , img);
        waitKey(0);
    }

contours 而不是 vectorPoint。它是 vectorvectorPoint 个。 IE。每个元素本身就是一个 vector of Points.

如果你想对 vector 中的 vector 进行排序,你应该提供某种 "greater" 函数。

一种方便的方法是使用 lamba 函数:

sort(contours.begin(), 
    contours.end(), 
    [](std::vector<cv::Point> const & v1, std::vector<cv::Point> const & v2) { return true; });

如您所见,lambda 只是 returns 为真。这只是一个存根。 相反,您应该实施您想要的排序标准。

您必须确定何时认为一个元素(Pointsvector)大于另一个元素(也是 Pointvector ). 这取决于你想用轮廓做什么。

注意: 最好避免 using namespace std - 请参阅此处 Why is "using namespace std;" considered bad practice?。在我看来,出于类似的原因,最好也避免使用 using namespace cv