python - 在 Python 中使用 OpenCV 进行模板匹配

标签 python opencv template-matching

我是图像处理的新手,正在通过从 OpenCV 获得一些帮助来学习模板匹配。文档,但我不理解某些代码行。
这是代码:

import cv2
import numpy as np
from matplotlib import pyplot as plt
img_rgb = cv2.imread('mario.png')
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
template = cv2.imread('coin.png', 0)
w, h = template.shape[::-1]
count = 0

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)
for pt in zip(*loc[::-1]):
    count += 1
    cv2.rectangle(img_rgb, pt, (pt[0] + w, pt[1] + h), (0,0,255), 2)

cv2.imwrite('res.png', img_rgb)
print(count)

目标是对 super 马里奥 map 中的硬币进行模板匹配。
我的问题:
1. 在循环 for pt in zip(*loc[::-1]): 中,我放了一个计数器,当我打印它时,它打印出 65,而硬币的数量只有 19。
2. 变量threshold=0.8 的作用是什么,当我改变它的值时,生成的图像也改变了。

谁能帮我解答一下我的问题? 提前谢谢你。

最佳答案

阈值 0.8 表示匹配应至少为模板图像和感兴趣源区域的 80%。因此,如果它大于 80%,它就是一枚硬币。如果降低阈值,即使不是硬币,误报结果也会增加。

for pt in zip(*loc[::-1]): 用于值大于阈值的点。 zip 是所有这些点的容器,它会迭代到所有这些点并围绕这个封闭实体(即这里的硬币)绘制矩形。

关于python - 在 Python 中使用 OpenCV 进行模板匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33990259/

相关文章:

python - 属性错误: 'RequestContext' object has no attribute 'user'

java - 如何将java MD5加密代码移植到Python中?

android - 通过 OpenCV 在 Android 中进行图像比较

c - 在 C 中链接 Opencv 库

JavaCV图像处理错误

Python try and except 在启动无密码 ssh 连接时

python - 使用 ruamel.yaml 安全转储和加载 defaultdict

c++ - OpenCV 3.2.0 : Reading Canny image for training SVM

python - 使用矩阵乘法的 numpy 模板匹配

c++ - 最佳 PCL 模板对齐设置