我有一组二进制图像,需要在其中寻找十字形(见附例)。我使用findcontours从二进制图像中提取边界。但是我不知道如何确定这个形状(边界)是否为十字形?或许OpenCV有一些内置的方法可以帮助解决这个问题。我考虑使用机器学习来解决这个问题,但我认为还有更简单的方法。谢谢!附例:
“Viola-Jones物体检测”可以是一个不错的起点。虽然该算法的主要用途(据我所知)是人脸检测,但实际上它是为任何物体检测而设计的,比如您的十字架。该算法是基于机器学习的算法(因此,您需要一组分类好的“十字架”和一组分类好的“非十字架”),并且您需要识别出有助于算法识别十字架的重要“特征”(模式)。该算法在OpenCV中实现为cvHaarDetectObjects()。
从原始图像中,假设您提取了一组可能成为您的十字架的多边形集。假设整个十字架都可见,以至于所有边缘都可以区分出长度,您可以尝试以下步骤: 拒绝所有不具有形成多边形所需的确切12个顶点的多边形。 重新排序顶点,使最短的边长排在第一位。 创建一个最佳匹配 透视变换,将您的顶点映射到统一大小的十字架上 通过使用此变换将您的十字架投影回统一十字架生成的残差进行检查,其中任何给定点的残差是投影点与相应统一点之间的距离。 如果所有残差都在您定义的容限范围内,则找到了一个十字架。 请注意,这主要是由于您正在搜索的几何形状的简单性而起作用。为使此方法有效,您的轮廓还需要去除噪声,例如,十字架中的每条线都需要转换为单个简单线。
你可以侵蚀每个斑点并分析它们的像素数量是否在减少。无论十字架的旋转缩放如何,它们应该始终以相同的比例下降,除非你正在接近剩余的中心。同样,当斑点足够小时,你应该期望它位于原始斑点的中心。你不需要任何机器学习算法或训练数据来解决这个问题。