如何检测射击目标上的弹孔

Jak*_*ubS 6 python opencv image-processing image-recognition

我目前正在处理我的第一个图像处理作业(在 Python 中使用 OpenCV,但我对任何库和语言都持开放态度)。我的任务是计算用户上传的图像中一到几个射击孔的精确分数(到十分之一点)。问题是用户上传的图像可以在不同的背景下拍摄(尽管它永远不会匹配目标平均颜色的其余部分)。因此,我排除了在互联网上找到的大多数解决方案以及我能想到的大多数解决方案。

我的问题总结

弹孔识别:

  • 弹孔可以在不同的背景上
  • 弹孔可以重叠
  • 单个弹孔的大小总是相似的(所有计算出的射击目标只使用一种口径)
    • 我能够计算出非常精确的射击孔半径

射击目标:

  • 我的应用程序将计算两种类型的射击目标(图片如下)
  • 可在不同光照条件下拍摄目标照片

射击目标 1 示例:

射击目标 1 示例

射击目标2示例:

在此处输入图片说明

射击目标示例以在以下位置找到弹孔:

到目前为止我尝试过的:

  1. 颜色分割
    • 由于上述原因
  2. 差异匹配
    • 为了能够实际比较目标图像(空的和开火的),我编写了一个算法,通过其最大的外圆(其半径 + 子弹大小(以像素为单位)裁剪目标)
    • 在那之后,我可能已经尝试了在互联网上找到的所有图像比较方法
    • 例如:蛮力匹配、直方图比较、特征匹配等等
    • 我在这里失败主要是因为两个比较图像上的颜色有点不同,还因为其中一张图像有时以很小的角度拍摄,因此圆圈没有重叠,它们被计算为差异
  3. 霍夫圆算法
    • 因为我知道目标上射击的半径(以像素为单位),所以我想我可以使用这个算法简单地检测它们
    • 在玩了几个小时/几天的 HoughCircles 函数参数后,我认为如果不根据上传的图像更改参数,它永远不会对所有上传的图像起作用
  4. 弹孔的边缘检测和轮廓查找
    • 在使用图像平滑算法(如模糊、双边滤波、变形等)时,我尝试了两种边缘检测方法(Canny 和 Sobel)。
    • 之后,我试图找到边缘检测图像中的所有轮廓,并过滤掉具有相似中心点的目标圆圈
    • 起初这似乎是解决方案,但在几个测试图像上它无法正常工作:/

在这一点上,我已经没有想法了,因此来到这里寻求任何可以推动我进一步发展的建议或想法。是否有可能根本没有解决如此复杂的射击目标识别的方法,还是我太缺乏经验而无法想出它?

预先感谢您的任何帮助。

编辑:我知道我可以简单地在射击目标后面放一张单色纸,这样就能找到子弹。这不是我希望应用程序工作的方式,因此它不是我的问题的有效解决方案。

小智 1

只是比较之前和之后的图像以识别它们之间的差异。并计算孔边缘距计算/分析的目标中心点的最短距离?