如何在屏幕上找到忽略透明像素的图像

Eni*_*con 1 python opencv pyautogui

我有一个 PNG 资产,比如说:

透明背景的香蕉png

我试图在屏幕上找到它,看起来像: 具有上述香蕉图标且背景不透明的游戏

通常,我会这样使用 pyautoGUI:

pyautogui.locateCenterOnScreen('banana.png', grayscale=True, confidence=0.9)
Run Code Online (Sandbox Code Playgroud)

但目前不起作用。看来问题可能出在我的香蕉资源的透明像素上,这显然不匹配。有没有办法通过忽略香蕉资源的透明像素并将它们视为通配符来做到这一点?或者另一种方式来实现这一点?

到目前为止,在我的搜索中,我发现这个Git 问题自 2014 年以来一直没有得到解决

谢谢!

fmw*_*w42 7

在OpenCV中,matchTemplate()有一个屏蔽模式。因此,您基本上按原样读取透明模板图像,然后提取其基础图像和 Alpha 通道。Alpha 通道用作 matchTemplate() 中的掩码。请参阅https://docs.opencv.org/4.1.1/df/dfb/group__imgproc__object.html#ga586ebfb0a7fb604b35a23d85391329be

输入:

在此输入图像描述

模板:

在此输入图像描述

import cv2
import numpy as np

# read game image
img = cv2.imread('game.png')

# read bananas image template
template = cv2.imread('bananas.png', cv2.IMREAD_UNCHANGED)
hh, ww = template.shape[:2]

# extract bananas 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
threshhold = 0.95
loc = np.where(correlation >= threshhold)

# draw matches 
result = img.copy()
for pt in zip(*loc[::-1]):
    cv2.rectangle(result, pt, (pt[0]+ww, pt[1]+hh), (0,0,255), 1)
    print(pt)

# save results
cv2.imwrite('bananas_base.png', base)
cv2.imwrite('bananas_alpha.png', alpha)
cv2.imwrite('game_bananas_matches.jpg', result)  

cv2.imshow('base',base)
cv2.imshow('alpha',alpha)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述