如何解决在Python / OpenCV中使用图像文件作为参考来检测GUI按钮的最佳方法
我正在挑战自己,让自己在玩名为《口袋妖怪TCG在线》的游戏中实现自动化。
由于我对逆向工程一无所知,因此我试图使用Computer Vision来识别对象并执行任务。
游戏的GUI始终是相同的,因此我不必处理颜色差异和其他问题。我的第一个强项是使用模板匹配,但是我遇到了误报的问题。
我发现的另外两个选择是使用HAAR Cascade(我发现了使用它的其他游戏的“机器人”)或使用神经网络训练它来识别每个元素。
在深入研究之前,我想找到最好的方法,以避免时间浪费在不起作用的方法上。另外,我也不想“用大锤砸破螺母”,所以我正在寻找一种简单而优雅的方法。
我的第一个方法是使用python和opencv,因为它们都易于使用,但是我可以使用其他工具。我知道如何在python上使用YOLO,但是我只能在Linux上成功安装YOLO,并且游戏可以在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,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()
解决方法
我说官方文档中的教程对我的评价很好。他们是。但是您已经做了一些搜索样本图像。其中许多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)
屏幕截图:
模板
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。