坐标从左上到右下排序

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 &lt; 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 &lt; 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 不提供 tie 功能。 @user3797009 奇怪,它应该。你有完整的 C++11 支持吗?否则,&lt;tr1/tuple&gt;std::tr1::tie @user3797009 如果你有完整的 C++11 支持,那么这应该可以工作。所以你没有,或者你的代码中还有另一个问题。 忘记在我的 .pro 文件中设置 -std=c++11。现在 tie 有效,但排序仍然不正确。 @user3797009 也许在排序前后添加一些示例坐标,以阐明您希望如何对点进行排序。

以上是关于坐标从左上到右下排序的主要内容,如果未能解决你的问题,请参考以下文章

Python:使用 OpenCV 从左上角到右下角对项目进行排序

Excel 里怎么对一块区域数据从左上到右下一列列的由小到大排序?

如何从左上角到右下角排列坐标?

在矩阵中找到从左上角到右下角的路径有问题吗?

对给定模式中的以下坐标进行排序:

查找从左上角到右下角的所有路径问题。以数组为参数的递归解法输出说明