坐标从左上到右下排序
Posted
技术标签:
【中文标题】坐标从左上到右下排序【英文标题】:Sort Coordinates from top left to bottom right 【发布时间】: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 执行加法。
answers.opencv.org/question/31515/…
如果 Y 坐标相同,则您有 UB。只需return p1.y < p2.y;
。
这是因为透视效果以及由于侵蚀/扩张导致轮廓中心坐标略有不同的事实。
【参考方案1】:
如果你想通过 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);
您也可以手动实现字典比较,但这很容易出错。
【讨论】:
由于某种原因 #include<tr1/tuple>
和 std::tr1::tie
。
@user3797009 如果你有完整的 C++11 支持,那么这应该可以工作。所以你没有,或者你的代码中还有另一个问题。
忘记在我的 .pro 文件中设置 -std=c++11。现在 tie 有效,但排序仍然不正确。
@user3797009 也许在排序前后添加一些示例坐标,以阐明您希望如何对点进行排序。以上是关于坐标从左上到右下排序的主要内容,如果未能解决你的问题,请参考以下文章
Python:使用 OpenCV 从左上角到右下角对项目进行排序