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
是 而不是 vector
的 Point
。它是 vector
个 vector
个 Point
个。 IE。每个元素本身就是一个 vector
of Point
s.
如果你想对 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 为真。这只是一个存根。
相反,您应该实施您想要的排序标准。
您必须确定何时认为一个元素(Points
的 vector
)大于另一个元素(也是 Point
的 vector
).
这取决于你想用轮廓做什么。
注意: 最好避免 using namespace std
- 请参阅此处 Why is "using namespace std;" considered bad practice?。在我看来,出于类似的原因,最好也避免使用 using namespace cv
。
我正在尝试按降序对轮廓点的向量进行排序,但每当我使用时:
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
是 而不是 vector
的 Point
。它是 vector
个 vector
个 Point
个。 IE。每个元素本身就是一个 vector
of Point
s.
如果你想对 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 为真。这只是一个存根。 相反,您应该实施您想要的排序标准。
您必须确定何时认为一个元素(Points
的 vector
)大于另一个元素(也是 Point
的 vector
).
这取决于你想用轮廓做什么。
注意: 最好避免 using namespace std
- 请参阅此处 Why is "using namespace std;" considered bad practice?。在我看来,出于类似的原因,最好也避免使用 using namespace cv
。