'How to matchtemplate a transparent image opencv
I tried the method in the answer of this: How do I find an image on screen ignoring transparent pixels, it is exactly what I'm looking for, but it didn't work out for me, I keep getting a black image after the alpha processing.
I tried
result = cv2.matchTemplate(Image, Template, cv2.TM_CCOEFF_NORMED)
and
base = template[:,:,0:3]
alpha = template[:,:,3]
alpha = cv2.merge([alpha,alpha,alpha])
# do masked template matching and save correlation image
correlation = cv2.matchTemplate(img, base, cv2.TM_CCORR_NORMED, mask=alpha)
Template: 1
Image: 2
The template is bottom left for reference
Solution 1:[1]
Try this one :
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
original = cv.imread('Original_game.png')
img = cv.imread('Original_game.png',0)
img2 = img.copy()
template = cv.imread('template.png',0)
w, h = template.shape[::-1]
# All the 3 methods for comparison in a list
methods = ['cv.TM_CCOEFF', 'cv.TM_CCOEFF_NORMED', 'cv.TM_CCORR_NORMED']#,'cv.TM_CCORR','cv.TM_SQDIFF', 'cv.TM_SQDIFF_NORMED'
for meth in methods:
img = img2.copy()
method = eval(meth)
# Apply template Matching
res = cv.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv.minMaxLoc(res)
print(f"meth={meth} , min_val={min_val}, max_val={max_val}, min_loc={min_loc}, max_loc={max_loc}")
# If the method is TM_SQDIFF or TM_SQDIFF_NORMED, take minimum
if method in [cv.TM_SQDIFF, cv.TM_SQDIFF_NORMED]:
top_left = min_loc
else:
top_left = min_loc#max_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv.rectangle(original,top_left, bottom_right, 255, 2)
fig = plt.figure(figsize=(10, 7))
plt.imshow(original)
plt.show()
Sample Results:
attention to the algorithm:
- Change threshold to find different location for matching
- Change matching algorithm
Check why sometimes you should use max and sometimes use min value found location matching.
helpful links:
OpenCV Template Matching ( cv2.matchTemplate )
Template matching using OpenCV in Python
Update #1
If you want to reach better results you should use feature descriptors like "HOG", "Surf", "SIFT" and ... . Or state of the art object detection models like YOLO are the best known to your problem.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |

