OpenCV2 matchTemplate 不适用于具有相同模板的不同图片
OpenCV2 matchTemplate does not work on different pictures with same template
我正在使用 OpenCV2 来处理游戏的 auto-block 函数,所以很简单:
如果出现在特定区域的红色指示器的 max_val 高于阈值,请按指定的键来阻止该攻击。
有一个透明背景的指标模板,它适用于少数屏幕截图,但不适用于大多数其他屏幕截图。
这是我使用的数据:
模板:
成功检测到的截图:
检测失败的截图:
要检测的代码:
import time
import cv2
import pyautogui
import numpy as np
def block_left():
# while True:
# screenshot = pyautogui.screenshot(region=(960, 455, 300, 260))
# region = cv2.imread(np.array(screenshot), cv2.IMREAD_UNCHANGED)
region = cv2.imread('Screenshots/Left S 1.png', cv2.IMREAD_UNCHANGED)
block = cv2.imread(r'Block Images/Left Block.png', cv2.IMREAD_UNCHANGED)
matched = cv2.matchTemplate(region, block, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(matched)
print(max_val)
w = block.shape[1]
h = block.shape[0]
cv2.rectangle(region, max_loc, (max_loc[0] + w, max_loc[1] + h), (255, 0, 0), 2)
cv2.imshow('Region', region)
cv2.waitKey()
block_left()
所以,总而言之,我尝试了多种其他方法,但都显示不太成功的结果。是否有任何过滤器,我可以添加任何处理来解决这个问题?
谢谢。
上传的图片是8位的,但是使用的图片是32位的,但是由于尺寸问题无法上传,使用的32位图片在这里上传:https://ibb.co/r7B7G6B https://ibb.co/r0r9w5T https://ibb.co/KXP3wWc
这里是 Python/OpenCV 中使用你的两个图像和带 alpha 通道的模板匹配蒙版模板的示例。
图片 1:
图 2:
模板:
import cv2
import numpy as np
# read image
img = cv2.imread('game2.jpg')
# read template with alpha channel
template_with_alpha = cv2.imread('game_template.png', cv2.IMREAD_UNCHANGED)
hh, ww = template_with_alpha.shape[:2]
# extract base template image and alpha channel and make alpha 3 channels
template = template_with_alpha[:,:,0:3]
alpha = template_with_alpha[:,:,3]
alpha = cv2.merge([alpha,alpha,alpha])
# do masked template matching and save correlation image
correlation = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED, mask=alpha)
# get best match
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(correlation)
max_val_corr = '{:.6f}'.format(max_val)
print("correlation score: " + max_val_corr)
print("match location:", max_loc)
# draw match
result = img.copy()
cv2.rectangle(result, (max_loc), ( max_loc[0]+ww, max_loc[1]+hh), (0,0,255), 1)
# save results
cv2.imwrite('game2_matches.jpg', result)
cv2.imshow('template',template)
cv2.imshow('alpha',alpha)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
图片 1 匹配:
correlation score: 0.983882
match location: (783, 512)
匹配图片 2:
correlation score: 0.938928
match location: (867, 504)
我正在使用 OpenCV2 来处理游戏的 auto-block 函数,所以很简单: 如果出现在特定区域的红色指示器的 max_val 高于阈值,请按指定的键来阻止该攻击。
有一个透明背景的指标模板,它适用于少数屏幕截图,但不适用于大多数其他屏幕截图。
这是我使用的数据:
模板:
成功检测到的截图:
检测失败的截图:
要检测的代码:
import time
import cv2
import pyautogui
import numpy as np
def block_left():
# while True:
# screenshot = pyautogui.screenshot(region=(960, 455, 300, 260))
# region = cv2.imread(np.array(screenshot), cv2.IMREAD_UNCHANGED)
region = cv2.imread('Screenshots/Left S 1.png', cv2.IMREAD_UNCHANGED)
block = cv2.imread(r'Block Images/Left Block.png', cv2.IMREAD_UNCHANGED)
matched = cv2.matchTemplate(region, block, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(matched)
print(max_val)
w = block.shape[1]
h = block.shape[0]
cv2.rectangle(region, max_loc, (max_loc[0] + w, max_loc[1] + h), (255, 0, 0), 2)
cv2.imshow('Region', region)
cv2.waitKey()
block_left()
所以,总而言之,我尝试了多种其他方法,但都显示不太成功的结果。是否有任何过滤器,我可以添加任何处理来解决这个问题? 谢谢。
上传的图片是8位的,但是使用的图片是32位的,但是由于尺寸问题无法上传,使用的32位图片在这里上传:https://ibb.co/r7B7G6B https://ibb.co/r0r9w5T https://ibb.co/KXP3wWc
这里是 Python/OpenCV 中使用你的两个图像和带 alpha 通道的模板匹配蒙版模板的示例。
图片 1:
图 2:
模板:
import cv2
import numpy as np
# read image
img = cv2.imread('game2.jpg')
# read template with alpha channel
template_with_alpha = cv2.imread('game_template.png', cv2.IMREAD_UNCHANGED)
hh, ww = template_with_alpha.shape[:2]
# extract base template image and alpha channel and make alpha 3 channels
template = template_with_alpha[:,:,0:3]
alpha = template_with_alpha[:,:,3]
alpha = cv2.merge([alpha,alpha,alpha])
# do masked template matching and save correlation image
correlation = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED, mask=alpha)
# get best match
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(correlation)
max_val_corr = '{:.6f}'.format(max_val)
print("correlation score: " + max_val_corr)
print("match location:", max_loc)
# draw match
result = img.copy()
cv2.rectangle(result, (max_loc), ( max_loc[0]+ww, max_loc[1]+hh), (0,0,255), 1)
# save results
cv2.imwrite('game2_matches.jpg', result)
cv2.imshow('template',template)
cv2.imshow('alpha',alpha)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
图片 1 匹配:
correlation score: 0.983882
match location: (783, 512)
匹配图片 2:
correlation score: 0.938928
match location: (867, 504)