algorithm - 我如何检测一组点是菱形或方格

标签 algorithm opencv textures computer-vision

假设我有一个包含点的 2D 图像,我可以大致检测到点的每个中心点,我如何检测它是方格(方形网格)还是菱形(旋转 45 度)?

enter image description here

幸运的是我的图像是规则的,没有变形。菱形的情况实际上类似于正方形,但它只旋转了 45 度。唯一的问题是:

  1. 我可以使用霍夫变换检测圆,但中心点当然是近似值。
  2. 点不一定填满整个图像(见下图) enter image description here

我一直在想类似于OpenCV中棋盘图案校准的东西(但当然没有相机参数),

最佳答案

一种方法可能如下所示:

  1. 使用 Hough 变换检测圆,当然圆心是近似的;

  2. 选择任意数量的点进行测试。点数取决于您必须有多准确/处理图像需要多快。需要多个点来实现投票以减少错误的影响。您可以使用任何方法来选择点 - 完全随机或半随机(在图像中随机分布某些点);

  3. 要检测所选每个点的网格方向,请执行最近邻搜索并找到 4 个最近邻。这些邻居将位于穿过特定点的网格线的边缘。根据数据集的大小,您可以使用两个 for 循环自己找到邻居,或者您可以使用 FLANN 库(Fast Library for Approximate Nearest Neighbors)中的 OpenCV knnSearch 方法;

  4. 当每个点有 4 个最近邻点时,您需要确定指定点的晶格方向。为此,您需要计算每个采样点与其相邻点之间的垂直和水平距离。如果格子是正方形的,那么 Min(deltaX, deltaY) 应该接近于 0。如果它是菱形的,那么它大约是每两点之间距离的一半。处理所有的邻居并在此时决定格子是正方形还是菱形。对每个测试点都这样做并收集结果;

  5. 处理结果并根据每个测试点的投票对晶格方向做出最终决定。

关于algorithm - 我如何检测一组点是菱形或方格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21518138/

相关文章:

algorithm - 具有源 S 和汇 T 的流网络,如何找到任意 2 个顶点之间的最大流?

python - 使用opencv检测图像中折线的顶点

opencv - 使用 OpenCV 进行纸牌检测 - 在移动设备上

c++ - opengl - 帧缓冲区纹理裁剪得比我设置的小吗?

directx - 在 DirectX 11 中跨适配器传输纹理

c - 如何在 c 中的未知类型数组中查找最大元素(使用指向函数的指针)

algorithm - 用于检查 O(1) 时间内元素数量是否相等的数据结构?

algorithm - 使用 DFS Kosaraju 查找 SCC 的最差运行时间

python - 二值图像上的 Tesseract OCR

java - LibGdx 纹理绘制为 #getTextureData 给出的逆纹理