用OpenCV检测图像中的十字

我试图在OpenCV的帮助下,在我的inputvideostream中检测一个形状(十字)。 目前我是阈值得到我的十字架的二进制形象,它工作得很好。 不幸的是我的algorithm来决定是否提取blob是一个十字架或不是不太好。 正如你在下面的图片中看到的,并不是所有的angular落都在某些angular度被检测到。

在这里输入图像说明

我使用findContours()approxPolyDP()来近似我的轮廓。 如果我在这个近似曲线中检测到12个拐angular/顶点,则认为该斑点是一个十字。

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

我有几个build议,可能会提供一些有趣的结果,虽然我不确定。

如果十字总是在图像的中心附近,并且始终位于平面上,则可以尝试在相机与十字架所在平面之间find​​单应matrix。 这将使您能够将十字的示例图像(在平面旋转中的不同select上)转换为可视化十字的坐标系。 然后,您可以生成模板,您可以匹配的图像。 你可以做一些简单的像素协议testing,以确定你是否有一个匹配。

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

计算凸包然后利用凹凸缺陷可能会奏效。

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