我有一组二进制图像,我需要在其上找到十字架(附上示例)。我使用 findcontours 从二进制图像中提取边框。但我不明白如何确定这个形状(边界)是否交叉?也许opencv有一些内置的方法,可以帮助解决这个问题。我想用机器学习来解决这个问题,但我认为有一种更简单的方法可以做到这一点。谢谢!
5 回答
Viola-Jones 对象检测可能是一个好的开始。尽管该算法 (AFAIK) 的主要用途是人脸检测,但它实际上是为任何对象检测而设计的,例如你的十字架。
该算法是基于机器学习的算法(因此,您将需要一组分类的“交叉”和一组分类的“非交叉”),并且您需要识别有助于识别的重要“特征”(模式)算法识别十字架。
该算法在 OpenCV 中实现为cvHaarDetectObjects()
从原始图像中,假设您已经提取了可能成为您的十字架的多边形集。假设所有的十字架都是可见的,在某种程度上所有的边都可以被区分为有长度,你可以尝试以下方法。
拒绝所有没有形成多边形所需的恰好 12 个顶点的多边形。
重新排序顶点,使最短的边长在前。
创建一个最适合的透视变换,将你的顶点映射到一个统一大小的十字上
检查使用此变换生成的残差,将您的十字投影回均匀十字上,其中任何给定点的残差是投影点与相应均匀点之间的距离。
- 如果所有残差都在您定义的容差范围内,则您已找到交叉。
请注意,这主要是由于您正在搜索的几何形状的简单性。您的轮廓还需要去除噪声才能使其正常工作,例如,十字内的每条线都需要转换为一条简单的线。
经过几天的努力,我得出一个结论,这里唯一可靠的方法是使用 SVM + HOG。就这样。
您可以侵蚀每个斑点并分析它们的像素数量正在下降。无论十字的旋转缩放比例如何,它们都应该始终以相同的比例下降,除非您关闭剩余的中心。同样,当 blob 足够小时,您应该期望它位于原始 blob 的中心。您不需要任何机器学习算法或训练数据来解决这个问题。