2015-03-24 111 views
0

我想对来自openCV blob检测的110个关键点进行排序,从上到下和从左到右。但有时会出错。使用较少STL运算符的排序点

bool sortRects(const Rect &a, const Rect &b) 
{ 
return ((a.x + a.y*10) < (b.x + b.y*10)); 
} 

    vector<Rect> convertedKeyPoints; 

    for(int i = 0; i < detectedLedPositions.size(); i++) 
    { 
    Point2f point(detectedLedPositions[i].pt.x+1.f, detectedLedPositions[i].pt.y + 1.f); 
    Rect keyPointToRect(detectedLedPositions[i].pt, point); 
    convertedKeyPoints.push_back(keyPointToRect); 
    } 

    sort(convertedKeyPoints.begin(), convertedKeyPoints.end(), sortRects); 

for(int i = 0; i < convertedKeyPoints.size(); i++) 
     { 
      QPointF currentPoint(QPoint(convertedKeyPoints[i].tl().x , convertedKeyPoints[i].tl().y)); 
      ledPosition.push_back(currentPoint); 
     } 

这是转换为QPointF后调试控制台的输出。

QPointF(133, 138) 
QPointF(188, 134) 
QPointF(240, 134) 
QPointF(290, 135) 
QPointF(347, 142) 
QPointF(454, 137) 
QPointF(398, 144) 
QPointF(507, 136) 
QPointF(27, 189) 
QPointF(191, 191) 
**QPointF(138, 199)** 
QPointF(244, 191) 
QPointF(293, 194) 
QPointF(345, 189) 
QPointF(400, 194) 
QPointF(451, 190) 
QPointF(505, 192) 

那我该怎么做?

+1

看看你有问题的三点:191 + 191 * 10 <138 + 199 * 10 <244 + 191 * 10. – 2015-03-24 22:43:33

+0

尝试为y坐标设置更大的权重。乘以1000,而不是乘以10. – 2015-03-24 22:55:15

+0

@JonathanPotter它会工作,直到它不。 – 2015-03-24 22:57:05

回答

2

我认为你的排序操作假设a.x < 10,在你的例子中情况并非如此。

尝试:

bool sortRects(const Rect &a, const Rect &b) 
{ 
    return a.y == b.y ? a.x < b.x : a.y < b.y; 
} 

这将排序在Y轴上的第一(顶部到底部),和在两个完全相等的情况下,将回退到排序的X轴(从左至右) 。

+0

唯一值得注意的是比较平等的浮点精度。 – 2015-03-24 23:01:42

+0

感谢球员们,但无论我选择哪一个因素得分排序错误。 – RobRobRob 2015-03-25 10:39:14