【发布时间】:2014-08-23 01:51:01
【问题描述】:
我使用 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。有没有人想出一种可靠的方法来检测它们?
【问题讨论】:
-
位置错误是因为透视效果还是因为 LED 位置的硬件布局不理想?如果第一个适用,您可以虚拟创建模式并尝试一些模式匹配以找到稍微旋转的 LED 网格。
-
首先:
compareY函数在p1.y == p2.y的情况下返回什么?您应该使用else而不是第二个if,或者最好只返回布尔值p1.y < p2.y。其次,如果您想将向量从centers[0]排序到centers[9],您只需执行sort(centers.begin(),centers.begin()+10,compareX),因为您可以对vector::iterator 执行加法。 -
如果 Y 坐标相同,则您有 UB。只需
return p1.y < p2.y;。 -
这是因为透视效果以及由于侵蚀/扩张导致轮廓中心坐标略有不同的事实。
标签: c++ sorting opencv coordinates led