我正试图在OpenCV的帮助下检测输入视频流中的形状(十字形) . 目前我的表现非常好 . 如下图所示,并非在某些视角下检测到所有角落 .
我正在使用 findContours() 和 approxPolyDP() 来获得我的轮廓的近似值 . 如果我在此近似曲线中检测到12个角/顶点,则假定斑点为十字形 .
findContours()
approxPolyDP()
有没有更好的方法来解决这个问题?我想到了SIFT,但算法必须实时执行,我读到SIFT不太适合实时 .
我有一些建议可能会提供一些有趣的结果,虽然我也不确定 .
如果十字架总是靠近图像的中心并且始终位于平面上,您可以尝试在相机和十字架所在的平面之间找到单应性 . 这将使您能够将十字的样本图像(在平面旋转的不同选择中)转换为可视化十字的坐标系 . 然后,您可以生成可以与图像匹配的模板 . 你可以做一些简单的像素协议测试来确定你是否匹配 .
或者,您可以尝试训练Haar-based classifier以识别十字架 . 这种类型的分类器通常用于面部检测并检测图像中的定向边缘,通过几个定向边缘的相对位置对面部进行分类 . 它在面部具有良好的分类精度,并且速度极快 . 虽然在这种特殊情况下我无法保证其准确性,但它可以为简单的形状(如十字架)提供一些好的结果 .
计算convex hull然后利用convexity defects可能会有效 .
所有十字架应该有四个凸起缺陷,组成四组两个点,或四个矢量 . 此外,如果你的形状是十字形,那么这四个矢量将具有两对补充角度 .
2 回答
我有一些建议可能会提供一些有趣的结果,虽然我也不确定 .
如果十字架总是靠近图像的中心并且始终位于平面上,您可以尝试在相机和十字架所在的平面之间找到单应性 . 这将使您能够将十字的样本图像(在平面旋转的不同选择中)转换为可视化十字的坐标系 . 然后,您可以生成可以与图像匹配的模板 . 你可以做一些简单的像素协议测试来确定你是否匹配 .
或者,您可以尝试训练Haar-based classifier以识别十字架 . 这种类型的分类器通常用于面部检测并检测图像中的定向边缘,通过几个定向边缘的相对位置对面部进行分类 . 它在面部具有良好的分类精度,并且速度极快 . 虽然在这种特殊情况下我无法保证其准确性,但它可以为简单的形状(如十字架)提供一些好的结果 .
计算convex hull然后利用convexity defects可能会有效 .
所有十字架应该有四个凸起缺陷,组成四组两个点,或四个矢量 . 此外,如果你的形状是十字形,那么这四个矢量将具有两对补充角度 .