OpenCV轮廓轴排序

时间:2013-06-03 08:37:44

标签: sorting opencv

我遇到了这个问题。我在照片中找到了轮廓。近似他们和所有的东西。现在,我想按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)。

2 个答案:

答案 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一次。