使用OpenCV(或其他方法)检测网格节点

2024-04-29 10:01:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我在照片上画了一个网格(它们是从照相机里拍的)。二值化后,它们看起来如下(红色为255,蓝色为0): grid

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

更新:

二值化前不同网格及其变形的一些示例: enter image description here

enter image description here

enter image description here


Tags: 方法网格示例节点图片照片蓝色红色
3条回答

在这种情况下,我首先要找到最好的起点。 所以,首先我给你的图像设置了阈值(但是我也可以对它进行骨架化,然后再设置阈值。但这样一些数据将无法恢复地丢失):

{1美元^

然后,我尝试了大量的工具来突出最突出的特性。最后,在使用Gimp的G'MIC插件时,我发现:

Imgur

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

Imgur

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

Imgur

为了帮助确定角度,我制作了局部傅里叶频率图-通过这种方式,您可以获得您的图案局部角度:

Imgur

然后你可以做一个简单的厚,在现代GPU上快速工作-像这样得到区别(漏掉的情况):

Imgur

当发生碰撞时,差异是最小的;我所说的局部最大值或多或少涉及到应该如何处理由此产生的差异。由于比例因子的敏感性,将图案圆外部的权重与内部的相同是不明智的。因此,在所使用的算法中,内带交叉的权重应该更大。然而,图像的不同模式如下所示:

Imgur

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

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

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

还有其他方法可以使用略读工具进行特征检测。在

但实际上,我认为与其使用Hough变换(Hough transformation,后者可能会导致巨大膨胀和缺乏精度(直线),我建议尝试Harris角点检测-http://docs.opencv.org/2.4/doc/tutorials/features2d/trackingmotion/harris_detector/harris_detector.html)。在

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

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

相关问题 更多 >