我使用C ++和OpenCV从10x11 LED阵列的轮廓中提取了110个坐标,并将它们存储在矢量中。现在我想从左上角到右下角对它们进行排序,以检测某个行和列中的LED是否亮起。我通过y位置预先排列坐标,以确保向量中的前10个坐标代表我的图像中的第一个LED行。
vector<Point2f> centers;
bool compareY(Point2f p1, Point2f p2){
if(p1.y < p2.y) return true;
if(p1.y > p2.y) return false;
}
sort(centers.begin(), centers.end(), compareY);
现在我必须按x位置对它们进行排序。问题在于来自第二行或任何其他行中的第一个LED的x位置可以比第一行中的第一个LED小一点。由于这个事实,他们必须从中心[0]到中心[9],中心[10]到中心[20] ......逐行排序。有人知道怎么做吗?
提前致谢!
编辑:管理以对点进行排序,但我的基于轮廓检测的算法不够稳健,无法检测所有LED。有没有人想要一种可靠的方法来检测它们?
答案 0 :(得分:7)
如果你想用Y坐标和X坐标进行字典排序,你只需要提供一个合适的比较函数,它真正实现了严格的弱排序。例如
#include <tuple>
bool compareYX(const Point2f& p1, const Point2f& p2)
{
return std::tie(p1.y, p1.x) < std::tie(p2.y, p2.x);
}
您也可以手动实现词典编纂比较,但这很容易出错。