Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Template Matching Using OpenCV in Python

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.

like image 732
Cesario Avatar asked Jul 24 '26 14:07

Cesario


2 Answers

The 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 80%, 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]): is for the points which have values greater than threshold. zip is a container of all such points and it will iterate to all such points and draw rectangle around this closed entity i.e. coins here.

like image 170
AdityaIntwala Avatar answered Jul 27 '26 02:07

AdityaIntwala


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.

like image 36
Ayush Aggarwal Avatar answered Jul 27 '26 03:07

Ayush Aggarwal