python - 如何使用OpenCV区分两个拍摄目标

标签 python opencv image-recognition

首先,我要说我是图像识别的完全业余爱好者,我正在尝试使用Python中的OpenCV完成我的第一个任务。我目前真的很挣扎,因此我来这里寻求一些建议或帮助,这些都可以使我走上正确的道路。
我目前正在尝试做什么:
我的目标是识别用户上传的拍摄目标图像,并将其与两个拍摄目标模板之一(图像下方提供)进行比较。之后,我的应用程序将根据其匹配的模板来计算该射击目标,并为用户提供他/她的射击的准确分数(基于距目标中心的毫米数)。这只是一个长期目标。现在,我只是想弄清楚如何区分上传的目标图像和模板。
射击目标示例:
正如我提到的,我有两个射击目标模板:target 1target 2
然后,用户上传必须与模板之一匹配的目标。
Example that matches target 1
Example that matches target 2
只要上传的射击目标与任何模板都不匹配,应用程序就应该告诉用户,而不要继续进行计算。
到目前为止,我做了什么并尝试过:
对于初学者来说,我认为将背景中的所有内容移除并按拍摄目标裁切图像将是有益的,所以我做到了。 (我以为如果删除所有背景干扰,我可以轻松地比较这两个图像,但是后来我发现这实际上根本不准确)。
之后,我尝试计算黑色与目标内其他颜色(无背景)的百分比,但再次发现这并不准确,因为射击者可以拍摄很多黑色,然后百分比会波动。另外,我无法确定它是否是模板之一,因为另一个完全不同的拍摄目标中间可能有相同数量的黑色。
在比较这两个图像时,我尝试了许多方法(直方图,特征与蛮力匹配,模板匹配),但这些方法似乎都不准确或不可用(我可能做错了,这是有可能的) 。
在所有这些失败之后,我发现最好的解决方案可能是比较射击目标内的圆圈或黑色中间圆圈内的数字,但我不知道如何正确地做到这一点。
你们对如何解决这个问题有任何想法吗?我非常感谢您为解决我的问题提供的帮助或 push 。代码示例受到高度赞赏,并将使我为之高兴。
最好的问候。

最佳答案

目标似乎仅在得分带(环)4、5和6上有所不同。因此,我将尝试着重于这些 Realm 。

我拍摄了您的样本图像并将其大小调整为恰好为500x500像素,然后测量了从中心到波段4的外部边缘(167 px)和波段6边缘(95 px)的半径。因此,感兴趣区域的外部界限为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

这给你这个面具:

enter image description here

现在,您可以使用以下公式计算该蒙版中所有像素的平均值:
maskedMean = cv2.mean(YourImage, mask)

并且只有蒙版中白色的像素才有助于平均值。

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

enter image description here

关于python - 如何使用OpenCV区分两个拍摄目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62114356/

相关文章:

python - 如何更好地创建一个函数来通过 Django Rest 中的序列化器传递 JSON?

python - 如何使用 OpenCV 在图像上标记数字并绘制圆圈

opencv - JavaCv比较三个及更多图像

machine-learning - 用于图像识别、图像大小的 TensorFlow

android - iqengines 演示应用程序崩溃

python - 无法使用opencv打开视频

python - 在python中快速修改字符串

c++ - 使用单色 QImage

python - session 未创建异常 : Message: Unable to create new service: ChromeDriverService with ChromeDriver and SeleniumGrid through Python

opencv - 在 Mat opencv 中更改像素值