我正在挑战自己,让玩一款名为 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()
我在评论中说官方文档中的教程很棒。他们确实如此。但您已经搜索了示例图像。其中许多都在这里,包括用于模板匹配教程的梅西图片。
这段代码有效。如果您使用 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)
截图:
模板
如果是在 Windows 上,您还可以使用 testRigor,并在那里启用 OCR,这应该允许您执行以下操作:
click "Jogar!"