我遇到了这个问题。我在照片中找到了轮廓。近似他们和所有的东西。现在,我想按Y轴然后按X轴对它们进行排序。这可能吗?我正在使用std :: sort两次,我总是只对一个轴进行排序。请尽快回答。谢谢
bool operator()(vector<Point> c1,vector<Point>c2){
double a=boundingRect( Mat(c1)).y;
double b=boundingRect( Mat(c2)).y;
return a<b;
}
这是Y轴的示例。对X轴使用相同的(y =&gt; x)。
答案 0 :(得分:3)
也许你的老师希望你先用Y对它们进行排序,如果Y是相同的,按X排序。如果是这样的话,你应该把你的比较器写成
bool operator()(const vector<Point>& c1, const vector<Point>& c2) {
// get bounding boxes for c1 and c2
cv::Rect bbox1 = boundingRect(cv::Mat(c1));
cv::Rect bbox2 = boundingRect(cv::Mat(c2));
// if c1's top is lower than c2's bottom, order should be c2 c1
if (c1.y > c2.y+c2.height-1) {
return false;
}
// if c2's top is lower than c1's bottom, order should be c1 c2
if (c2.y > c1.y+c1.height-1) {
return true;
}
// they have overlap in y direction, just sort them by their x
return c1.x < c2.x;
}
答案 1 :(得分:0)
如果您可以访问C ++ 11功能,则可以使用std::tie
最简洁地完成此操作。
bool operator()(vector<Point> c1,vector<Point>c2)
{
double a=boundingRect( Mat(c1)).y;
double b=boundingRect( Mat(c2)).y;
return std::tie(a.y, a.x) < std::tie(b.y, b.x);
}
然后,您只需拨打std::sort
一次。