在 Python 中使用 OpenCV 进行模板匹配
Template Matching Using OpenCV in Python
我是图像处理的新手,通过 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)
objective是超级马里奥地图里的硬币模板匹配
我的问题:
1.在循环中for pt in zip(*loc[::-1]):
我放了一个计数器,当我打印它时,它打印了65,而硬币的数量只有19。
2.变量threshold=0.8
的作用是什么,当我改变它的值时,结果图像也改变了。
谁能帮我解答下我的问题?
提前谢谢你。
阈值 0.8 表示匹配应至少为模板图像和感兴趣源区域的 80%。因此,如果它大于 80%,它就是一枚硬币。如果降低阈值,即使不是硬币,误报结果也会增加。
for pt in zip(*loc[::-1]):
用于值大于阈值的点。 zip
是所有这些点的容器,它将迭代到所有这些点并围绕这个封闭实体绘制矩形,即这里的硬币。
阈值 = 0.8 根据您正在处理的图像的亮度工作。
如果您的图像上的灯光合适,那么阈值 > 0.8 将起作用,但大多数情况下在相机图像中亮度会变化,因此亮度 > 0.65 可以起作用。
要匹配更多点,您必须降低阈值。
我是图像处理的新手,通过 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)
objective是超级马里奥地图里的硬币模板匹配
我的问题:
1.在循环中for pt in zip(*loc[::-1]):
我放了一个计数器,当我打印它时,它打印了65,而硬币的数量只有19。
2.变量threshold=0.8
的作用是什么,当我改变它的值时,结果图像也改变了。
谁能帮我解答下我的问题? 提前谢谢你。
阈值 0.8 表示匹配应至少为模板图像和感兴趣源区域的 80%。因此,如果它大于 80%,它就是一枚硬币。如果降低阈值,即使不是硬币,误报结果也会增加。
for pt in zip(*loc[::-1]):
用于值大于阈值的点。 zip
是所有这些点的容器,它将迭代到所有这些点并围绕这个封闭实体绘制矩形,即这里的硬币。
阈值 = 0.8 根据您正在处理的图像的亮度工作。 如果您的图像上的灯光合适,那么阈值 > 0.8 将起作用,但大多数情况下在相机图像中亮度会变化,因此亮度 > 0.65 可以起作用。 要匹配更多点,您必须降低阈值。