OpenCV Python透明模板匹配遇大量黑屏像素时失效问题咨询
带透明通道的OpenCV模板匹配在大量黑色像素场景下失效的原因分析
我使用OpenCV Python的模板匹配功能识别游戏中的各类UI元素区域。这些UI元素包含多变的图形、文本和图标,因此无法直接使用通用模板匹配。我制作了带透明通道的模板,将UI的非静态部分设为透明,使其在匹配时被忽略。脚本在多数场景下正常工作,但当屏幕存在大量黑色像素时会失效。
参考过两篇Stack Overflow文章:
- 《How do I find an image on screen ignoring transparent pixels》
- 《How to template match a simple 2D shape in OpenCV?》
示例截图
游戏画面

透明模板



测试脚本
''' mostly based on: https://stackoverflow.com/questions/71302061/how-do-i-find-an-image-on-screen-ignoring-transparent-pixels/71302306#71302306''' import cv2 import time import math # read game image img = cv2.imread('base.png') # read image template template = cv2.imread('minimap.png', cv2.IMREAD_UNCHANGED) hh, ww = template.shape[:2] # extract base image and alpha channel and make alpha 3 channels 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) # set threshold and get all matches threshold = 0.90 ''' from: https://stackoverflow.com/questions/61779288/how-to-template-match-a-simple-2d-shape-in-opencv/61780200#61780200 ''' # search for max score result = img.copy() max_val = 1 rad = int(math.sqrt(hh*hh+ww*ww)/4) # find max value of correlation image min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(correlation) print(max_val, max_loc) if max_val > threshold: # draw match on copy of input cv2.rectangle(result, max_loc, (max_loc[0]+ww, max_loc[1]+hh), (0,0,255), 1) # save results cv2.imwrite('match.jpg', result) cv2.imshow('result', result) cv2.waitKey(0) else: print("No match found")
匹配结果
大量黑色像素场景(错误匹配)

黑色像素较少场景(正确匹配)

我不太理解模板匹配算法对alpha通道的处理逻辑,因此不清楚黑色像素为何会干扰匹配,能否解释其中原因?
内容的提问来源于stack exchange,提问作者ktom
相关产品推荐
相关产品推荐

