问题
I am a newbie in Image Processing and learning about Template Matching by getting some help from OpenCV documentation, but I didn't understand some lines of the code.
Here is the code:
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)
The objective is to template match the coin in the super mario map.
My Questions :
1. In the loop for pt in zip(*loc[::-1]):
I put a counter and when I print it, it prints 65, whereas the number of coins is only 19.
2. What is the function of the variable threshold=0.8
, when I change its value, the resulting image is changed.
Can anyone help me to answer my question? Thank you in advance.
回答1:
threshold 0.8 means the match should be at least 80% of template image and the source Region of interest. thus if it is greater than 805 it is a coin. if you reduce the threshold the false positive results would increase even if it is not a coin.
for pt in Zip(*loc[::-1]): this command is for the points which have values greater than threshold. zip is container of all such points and it will iterate to all such points and draw rectangle around this closed entity i.e. coins here.
hope this helps to understand :)
回答2:
Threshold = 0.8 works according to lightness on the image you are working on. If lights are proper on your image then threshold > 0.8 will work but mostly in camera images brightness varies so lightness > 0.65 can work. To match more points you have to reduce your threshold value.
来源:https://stackoverflow.com/questions/33990259/template-matching-using-opencv-in-python