使用OpenCV在图像中检测十字架

42
我正在使用 OpenCV 在输入的视频流中检测一个形状(一个十字架)。目前,我使用二值化处理获取我的十字架的二进制图像,效果还不错。不幸的是,我的算法在决定提取的斑点是否为十字架方面表现不佳。如下图所示,在某些角度下未能检测到所有的角落。

Enter image description here

我使用findContours()approxPolyDP()来获得轮廓的近似值。如果在这个近似曲线中检测到12个角/顶点,则假定该斑点是十字架。是否有更好的方法解决这个问题?我考虑过SIFT,但算法必须实时执行,我读到 SIFT 不太适合实时操作。

1
你尝试过Hough线变换吗?与其识别角落,你可以识别线条,并在简单检查它们的方向后确定是否为十字路口。 - George Aprilis
2个回答

9

我有几个建议,可能会得到一些有趣的结果,但我不能确定。

如果十字架始终处于图像中心附近并始终位于一个平面表面上,您可以尝试在相机和十字架所在平面之间找到一个单应性。这将使您能够将十字架的示例图像(在选择不同平面旋转时)转换为可视化十字架的坐标系。然后,您可以生成模板并将其与图像进行匹配。您可以进行一些简单的像素协议测试来确定是否有匹配。

或者,您可以尝试训练基于Haar的分类器来识别十字架。这种类型的分类器通常用于人脸检测,并在图像中检测定向边缘,通过多个定向边缘的相对位置对人脸进行分类。它在面部分类准确性方面具有良好的分类准确性,并且非常快速。虽然我不能保证在这种特定情况下其准确性,但它可能为简单形状(如十字架)提供一些良好的结果。


谢谢您的快速回复。 非常抱歉我的问题描述不够准确,但是十字架可能出现在图片的任何位置(不过我可以使用一个ROI使其居中)。它可能非常小(约20像素直径)或非常大(填满整个图像),并且可以从不同角度查看。 Haar分类器是否符合这些限制? 总之,我需要一种独立于比例和角度的方法。 - Tobi
@Tobi 我认为为十字构建一个边界框,然后使用ROI可能会起作用。我已经有一段时间没有使用opencv实现的增强Haar分类器了,但我相信你可以给它一个图像训练集,它将通过扭曲自动创建不同比例和角度的样本(但你应该检查文档以确保)。 - Max Allan
我尝试了许多不同的训练集,最终找到了一个相当不错的。与凸缺陷相比,其优点在低分辨率图像中尤为明显。 - Tobi

8
计算凸包,然后利用凸缺陷可能有效。
所有十字形都应该有四个凸缺陷,组成四组两点或四个向量。此外,如果您的形状是十字形,则这四个向量将具有两对补角。

这种方法很准确,只需注意凸包上的虚假顶点对于十字路口的角落并不重要。 - mmgp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接