【问题标题】:Detect grid nodes using OpenCV (or using something else)使用 OpenCV(或使用其他方法)检测网格节点
【发布时间】:2016-12-21 00:57:17
【问题描述】:

我在图片上有一个网格(它们来自相机)。二值化后它们看起来像这样(红色为 255,蓝色为 0):

在这些图片上检测网格节点(十字)的最佳方法是什么? 注意:网格在单元之间不均匀地扭曲。

更新:

在二值化之前不同网格和它们的扭曲的一些示例:

【问题讨论】:

  • 您是否尝试过使用hough transformation 检测线条? (tutorial 1, tutorial 2)
  • 你能发布非二值化的图像吗?
  • 好吧,在我看来,这些主观上看起来比二值化版本更弯曲。这不是一件容易的事,因为它们似乎以不同的颜色、分辨率和样式出现(实线、虚线)。甚至扭曲也不仅仅是透视变换,因为纸张弯曲或扭结。您是否尝试过遵循canny 的路线?
  • 如果我理解正确,您目前在二值化图像上使用哈里斯角检测器,这会给您带来次优结果。使用更好的二值化图像,结果可能会更好。
  • 我对此一无所知,但该链接中使用的Histogram of Orientated Gradients 呢?

标签: python opencv pattern-recognition


【解决方案1】:

在这种情况下,我首先尝试找到最佳起点。 因此,首先我对您的图像进行了阈值处理(但是我也可以对其进行骨架化,然后进行阈值处理。但是这样一些数据会不可恢复地丢失):

然后,我尝试了大量工具来批量强调最突出的功能。最后,在玩 Gimp 的 G'MIC 插件时,我发现了这个:

基于以上我准备了一个通用模式,如下所示:

然后我得到了这张图片的一部分:

为了帮助确定角度,我制作了局部傅立叶频率图 - 这样您可以获得图案局部角度:

然后你可以制作一个在现代 GPU 上快速运行的简单粗体 - 像这样获得不同(错过的案例):

当被击中时,差异很小;我想到的关于局部最大值的讨论或多或少是指应如何处理由此产生的差异。由于比例因子敏感性,将图案圆差异外部的权重与内部相同是不明智的。因此,在使用的算法中,内部交叉应该更多地加权。然而,与图像不同的图案看起来像这样:

如您所见,可以区分命中和未命中。至关重要的是设置适当的容差并使用傅立叶频率来获得角度(阈值图像傅立叶通常遵循分析图像的整体方向)。 上述方式可以在以后通过哈里斯检测进行补充,或者哈里斯检测可以使用上述模式进行修改,以区分两到四个靠近的角落。 不幸的是,在这种情况下,所有技术都依赖于规模,因此应适当调整。 还有其他方法可以解决您的问题,例如首先对其进行分水岭,然后获取区域,然后忽略前景,然后简化曲线,然后检查它们的角是否形成连续的等距图案。但在我看来,它不会产生正确的结果。

还有一件事 - libgmic 是 G'MIC 库,您可以在其中直接或通过绑定使用上面显示的转换。或者获取算法并在您的应用中重写它们。

【讨论】:

  • 感谢您提供如此详细的答复。使用本地傅立叶是个好主意。但是,如果模式将是与交叉线之间的另一个角度的交叉呢?例如,不是大约 90 度,而是 40 度?
  • 这实际上使事情复杂化了。与 90 度的小偏差可以通过容差来缓解。
  • 错过了上面的编辑时间 - 所以在这里继续......更大的区别是可以应用多种方法。这完全取决于您想深入研究这个问题。实际上,无论多么复杂,最好的方法是应用带步进角的 Gabor 滤波器,将其转换为小线段(在限制噪声之前调整适当的容差),然后检查交叉点。虽然最好,但这种方法需要一些自学习算法和使用 OCR 优化方法。
【解决方案2】:

我想这可能是一个潜在的答案(实际上在 cmets 中提到过):http://opencv.itseez.com/2.4/modules/imgproc/doc/feature_detection.html?highlight=hough#houghlinesp

还可以通过其他方式使用 skimage 工具进行特征检测。

但实际上,我认为不是 Hough 变换会导致巨大的膨胀和缺乏精度(直线),而是建议尝试 Harris 角点检测 - http://docs.opencv.org/2.4/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html

这可以根据您的具体问题进一步调整(交叉角,因此局部最大值应取决于 crossy 的分布)。然后可以根据得到的点做一些曲线逼近。

【讨论】:

  • 谢谢!您能否详细谈谈这一刻:“局部最大值应取决于交叉分布”?
  • 当您对位图进行操作时,可以通过分析像素及其附近的环境来获得局部最大值。就像在 FAST 中一样 - 见论文:lanl.arxiv.org/pdf/0810.2434。你的目标应该是找到一个旋转独立的交叉分布。这可以通过计算或迭代来完成。由于 GPU 功能现在是快速迭代方法就足够了。但是,您必须考虑到区域大小应根据图案的比例进行调整。将尝试在我的下一条评论中提供一个示例。
【解决方案3】:

也许您可以计算Hough Lines 并确定交叉点。可以找到一个 OpenCV 文档here

【讨论】:

  • 不幸的是,它带来了很多错误的噪音线,因为网格被扭曲了:(
  • 好的,我明白了。所以Harris corner detector 也帮不了你?
  • 它没有帮助:(
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 2022-07-07
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
相关资源
最近更新 更多