使用 OpenCV 检测图像中的十字

Posted

技术标签:

【中文标题】使用 OpenCV 检测图像中的十字【英文标题】:Detecting a cross in an image with OpenCV 【发布时间】:2013-01-14 18:03:07 【问题描述】:

我试图在OpenCV 的帮助下检测输入视频流中的形状(十字)。目前我正在设置阈值以获得我的十字架的二进制图像,效果非常好。不幸的是,我决定提取的 blob 是否为交叉的算法表现不佳。如下图所示,并非所有角都在某些视角下被检测到。

我正在使用findContours()approxPolyDP() 来获得轮廓的近似值。如果我在这条近似曲线中检测到 12 个角/顶点,则假定该斑点是一个十字。

有没有更好的方法来解决这个问题?我想到了SIFT,但算法必须实时执行,我读到 SIFT 并不真正适合实时。

【问题讨论】:

你试过Hough线变换吗?您可以识别线条,而不是识别角,在简单检查它们的方向后,您可以确定它是否是十字形。 【参考方案1】:

我有一些建议可能会提供一些有趣的结果,尽管我不确定。

如果十字始终靠近图像的中心并且始终位于平面上,您可以尝试在相机和十字所在的平面之间找到​​单应性。这将使您能够将十字架的样本图像(选择不同的平面旋转)转换为可视化十字架的坐标系。然后,您可以生成可以与图像匹配的模板。您可以做一些简单的像素一致性测试来确定是否匹配。

或者,您可以尝试训练 Haar-based classifier 来识别十字架。这种分类器常用于人脸检测,检测图像中的有向边缘,通过若干有向边缘的相对位置对人脸进行分类。它在人脸上具有良好的分类精度,并且速度极快。虽然我不能保证它在这种特殊情况下的准确性,但它可能会为简单的形状(例如十字)提供一些好的结果。

【讨论】:

感谢您的快速答复。抱歉我的问题不精确,但不幸的是,图像中的任何地方都可能出现十字(但我可以在它居中的地方使用 ROI?)。它可以非常小(大约 20 像素直径)或非常大(填满整个图像),并且可以从不同的角度看到。 Haar 分类器会满足这些限制条件吗?总之,我需要一种独立于规模和视角的方法。 @Tobi 我认为为十字架构建一个边界框,然后使用 ROI 可以工作。自从我使用增强型 Haar 分类器的 opencv 实现以来已经有一段时间了,但我相信你给它一个训练图像集,它会通过扭曲自动创建不同比例和视角的样本(但你应该检查文档到确定)。 我尝试了很多不同的训练集,但最终找到了一个不错的。与凸面缺陷相比的优势在低分辨率图像中尤为明显。【参考方案2】:

计算convex hull,然后利用convexity defects 可能会起作用。

所有的十字架都应该有四个凸面缺陷,组成四组两个点或四个向量。此外,如果您的形状是十字形,那么这四个向量将有两对补角。

【讨论】:

这种方法是正确的,只需注意凸包上的虚假顶点,这些顶点对于十字架的拐角并不重要。

以上是关于使用 OpenCV 检测图像中的十字的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 如何检测带有 alpha 通道的标记

OpenCV/EMGU (C#) 物体检测

视觉检测使用opencv编写一个图片缺陷检测流程

如何在openCV Python中选择统一着色图的特定部分?

使用Python,Opencv检测图像,视频中的猫

Python-OpenCV中的图像轮廓检测