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

2024-06-16 09:13:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在挑战自己,让自己在玩一款名为口袋妖怪TCG的在线游戏时自动完成一些事情

因为我对逆向工程一无所知,所以我尝试用计算机视觉识别物体并执行任务

游戏的GUI总是一样的,所以我不必处理颜色变化和其他事情。我的第一个想法是使用模板匹配,但是,我遇到了误报问题

我发现的另外两种选择是使用HAAR级联(我发现了其他游戏中使用它的“机器人”)或使用神经网络并训练它识别每个元素

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

我的第一次尝试是使用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()

enter image description here


Tags: 方法import游戏imgnp事情cv2loc
1条回答
网友
1楼 · 发布于 2024-06-16 09:13:26

我在评论中说官方文档中的教程很棒。他们是。但是您已经对示例图像进行了一些搜索。其中许多are here including the Messi picture用于模板匹配教程

这个代码有效。如果您使用的是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)

截图:

enter image description here

模板

enter image description here

相关问题 更多 >