【问题标题】:Template Matching Using OpenCV in Python在 Python 中使用 OpenCV 进行模板匹配
【发布时间】:2016-03-03 14:18:49
【问题描述】:

我是图像处理方面的新手,通过从 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)

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

谁能帮我回答我的问题? 提前谢谢你。

【问题讨论】:

  • 是的,我有。但我不明白为什么柜台显示 65,而硬币只有 19
  • 这个方法并不神奇,所以你会得到一些误报(非硬币标记为硬币)和一些假阴性(硬币未标记为硬币)。听起来您有 65 个硬币标签,而图像中只有 19 个硬币。尝试按照 Aditya 的建议提高阈值。但是该方法可能不如您希望的那样好。您也可以事后应用过滤来改善结果。

标签: python opencv template-matching


【解决方案1】:

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

for pt in zip(*loc[::-1]): 用于值大于阈值的点。 zip 是所有此类点的容器,它将迭代到所有此类点并在此封闭实体(即此处的硬币)周围绘制矩形。

【讨论】:

  • 感谢您的出色解释,但我仍然不明白为什么计数器是 65 而不是 19,当我将其更改为 1 时,它显示为 0
  • 您可以绘制直方图以查看您在不同响应范围内的命中情况。 1 删除所有内容,尝试 0.8 到 1 之间的值。
【解决方案2】:

阈值 = 0.8 取决于您正在处理的图像的亮度。 如果您的图像上的灯光是正确的,那么阈值 > 0.8 将起作用,但大多数情况下在相机图像中亮度会发生变化,因此亮度 > 0.65 可以起作用。 要匹配更多点,您必须降低阈值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多