如何使用OpenCV区分两个射击目标

How to distinguish two shooting targets between each other using OpenCV

首先让我说我在图像识别方面是一个完全的业余爱好者,我正在尝试在 Python 中使用 OpenCV 完成我的第一个作业。我目前真的很挣扎,因此我来这里寻求一些建议或任何一般帮助,这将使我走上正确的道路。

我目前正在尝试做什么:

我的目标是识别用户上传的射击目标图像并将其与两个射击目标模板之一(下方提供的图像)进行比较。我的应用程序随后将根据它匹配的模板计算这个射击目标,并为用户提供他的 shot/shots 的真正准确分数(基于距离目标中心的毫米)。这只是一个长期目标。现在,我只是想弄清楚如何区分上传的目标图像和我拥有的模板。

射击目标示例:

正如我提到的,我有两个射击目标模板:target 1 and target 2

然后用户上传一个必须匹配其中一个模板的目标。

Example that matches target 1

Example that matches target 2

每当上传的射击目标与任何模板不匹配时,应用程序应告知用户并且不再继续计算。

到目前为止我做了什么和尝试了什么:

对于初学者来说,我认为从背景中删除所有内容并根据拍摄目标裁剪图像会很有帮助,所以我这样做了。 (我想如果我去除所有的背景干扰我可以很容易地比较两个图像,但后来我发现这实际上根本不准确)。

在那之后,我试图计算目标内部(没有背景)黑色与其他颜色的百分比,但再次发现这并不准确,因为射手可以射穿很多黑色然后百分比会波动。另外,我无法判断它是否是模板之一,因为另一个完全不同的射击目标可能在中间有相同数量的黑色。

为了比较两张图片,我尝试了很多方法(直方图、特征匹配与强力匹配、模板匹配),但这些方法似乎都不准确也不可用(我可能做错了,有这个可能)。

在所有这些失败之后我想到的是,最好的解决方案可能是比较射击目标内的圆圈或黑色中间圆圈内的数字,但我不知道该怎么做正确。

你们知道如何解决这个问题吗?我真的很感激任何帮助或推动解决我的问题。非常感谢代码示例,这会让我开心。

此致。

目标似乎仅在分数段(环)4、5 和 6 上有所不同。所以我会尝试专注于这些领域。

我拍摄了您的样本图像并将它们调整为正好 500x500 像素,然后我测量了从中心到波段 4 外边缘(167 像素)和波段 6 边缘(95 像素)的半径像素)。因此,感兴趣区域的外部限制是 167/500,即 0.33xW,内部限制是 95/500,即 0.19xW,其中 W 是封闭矩形的宽度。

所以,你可以这样画那个面具:

#!/usr/bin/env python3

import numpy as np
import cv2

# Define width/height of target in pixels
W = 300

# Make mask, white for area of interest, black elsewhere
mask = np.zeros((W,W),dtype=np.uint8)
cv2.circle(mask, (W//2,W//2), int(0.33*W), 255, -1)  # White outer circle
cv2.circle(mask, (W//2,W//2), int(0.19*W), 0, -1)    # Black inner circle

这给了你这个面具:

您现在可以使用以下方法计算该掩码内所有像素的平均值:

maskedMean = cv2.mean(YourImage, mask)

并且只有掩码内的白色像素才会影响平均值。

这是放置在您的目标之一旁边的面具: