在 python/OpenCV 中使用图像文件作为参考来检测 GUI 按钮的最佳方法

问题描述 投票:0回答:2

我正在挑战自己,让玩一款名为 Pokemon TCG Online 的游戏实现自动化。

由于我对逆向工程一无所知,所以我正在尝试使用计算机视觉来识别对象并执行任务。

游戏的 GUI 始终相同,因此我不必处理颜色差异和其他问题。我的第一个想法是使用模板匹配,但是,我遇到了误报问题。

我发现的另外两种替代方案是使用 HAAR Cascade(我发现了使用它的其他游戏的“机器人”)或使用神经网络并训练它识别每个元素。

在深入研究某种方法之前,我想找到最好的方法,以避免在非功能性的方法上浪费时间。另外,我不想“用大锤敲开坚果”,所以我正在寻找一种简单而优雅的方法来做到这一点。

我的第一个方法是使用 python 和 opencv,因为两者都易于使用,但我对其他工具持开放态度。我知道如何在 python 上使用 YOLO,但我只在 Linux 上成功安装了它,而游戏在 Windows 上运行。

非常感谢

我正在使用的代码:

import cv2
import pyautogui
from PIL import ImageGrab

fourcc = cv2.VideoWriter_fourcc('X','V','I','D') #you can use other codecs as well.
vid = cv2.VideoWriter('record.avi', fourcc, 8, (1440,900))
jogar = cv2.imread("jogar.png",  0)

while(True):
    
    
    img = ImageGrab.grab(bbox=(0, 0, 1000, 1000)) #x, y, w, h
    img_np = np.array(img)
    img_npGray = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY)
    #frame = cv2.cvtColor(img_np, cv2.COLOR_BGR2GRAY)
    vid.write(img_np)
    cv2.imshow("frame", img_npGray)
    res = cv2.matchTemplate(img_npGray, jogar, cv2.TM_SQDIFF)
    threshold  = 0.9
    loc = np.where (res >= threshold)
    # pyautogui.moveTo(loc)
    print(loc)
    
    
    key = cv2.waitKey(1)
    if key == 27:
        break    

vid.release()
cv2.destroyAllWindows()

python opencv computer-vision
2个回答
2
投票

我在评论中说官方文档中的教程很棒。他们确实如此。但您已经搜索了示例图像。其中许多都在这里,包括用于模板匹配教程的梅西图片

这段代码有效。如果您使用 TM_SQDIFF,则至少会找到最佳匹配。另外,您可能希望使用 cv2.minMaxLoc 获得最佳匹配,而不是使用阈值。

import cv2
import numpy as np

screenshot = cv2.imread("screenshot.png", 0)
template = cv2.imread("template.png",  0)

res = cv2.matchTemplate(screenshot, template, cv2.TM_SQDIFF)

# threshold  = 0.1
# loc = np.where (res >= threshold)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)

print(min_loc)

这给出了

(389, 412)

截图:

模板


0
投票

如果是在 Windows 上,您还可以使用 testRigor,并在那里启用 OCR,这应该允许您执行以下操作:

click "Jogar!"
© www.soinside.com 2019 - 2024. All rights reserved.