使用OpenCV + Python进行模板匹配

时间:2015-11-30 01:36:58

标签: 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)

目标是模板匹配超级马里奥地图中的硬币 我的问题:
1.在循环for pt in zip(*loc[::-1]):中,当我打印其打印65时,我放置计数器,而硬币只有19 2.变量threshold=0.8的功能是什么,当我更改值时,结果图像会发生变化。

任何人都可以帮我回答我的问题吗? 提前谢谢。

2 个答案:

答案 0 :(得分:3)

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

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

希望这有助于理解:)

答案 1 :(得分:1)

阈值= 0.8根据您正在处理的图像的亮度而有效。 如果您的图像上的灯光适当,则阈值> 0.8将起作用,但大多数在相机中图像亮度变化,因此亮度> 0.65可以工作。 为了匹配更多的积分,你必须降低你的门槛值。