项目需求
刚完成了AI自瞄“辅助”,趁着这会激情还在,做个简易版本的AI打地鼠游戏“辅助”。现在需要完成的任务有如下:
- 获取网页端小游戏的视频图像画面;
- 通过视频画面中的信息获取地鼠的头像;
- 能够自动移动鼠标至地鼠头像的位置并点击三次(防止没打上);
功能拆解
使用可以完成屏幕截图,通过截图输入到检测地鼠目标检测中去,检测输出矩形框的中心点坐标并指定三次点击鼠标左键,至此基本完成AI打地鼠的基础功能。
考虑到不同版本的打地鼠游戏画面不一样,出现地鼠的机制也不同,我们这次先做一个“丐版”的 打地鼠,后期再进行升级改造。这个“丐版”的基础配置如下:
1.可以打开全屏进行打地鼠游戏;
2.每次只出现一只地鼠且每次出现地鼠的样子不大变;
3.每只地鼠钻出来时间大概1s即可
上面对游戏配置进行了一定的规划,鉴于上述的规定我们可以迅速制定检测地鼠的位置的代码。由于每次只出一只地鼠且地鼠的样子基本保持一致,我们可以使用OpenCv中的模板匹配法进行做地鼠的检测,这样可以避免过多的导入其他的依赖,同时也增强了代码的适配性,便于后期的封装打包。对模板匹配检测出地鼠的位置后计算中心点坐标,我们依然采用pymouse进行鼠标坐标点控制移动,这样也节省了开发时间。
验证调试
获取地鼠的样本图,这里我们仅取一只即可,程序主题可分三部分:
- 获取当前界面截屏图像;
- 完成图像的模板匹配判断是否含有目标,对有目标的输出中心点坐标并点击3次
- 构建Ture循环,串联截屏图像与模版匹配
代码:
import pyautogui import cv2 import numpy as np from pymouse import PyMouse def GetImages(): img = pyautogui.screenshot() # 分别代表:左上角坐标,宽高 Images = cv2.cvtColor(np.asarray(img), cv2.COLOR_RGB2BGR) return Images def TemplateMatching(Screenshot, Hamster): h, w = Hamster.shape[:2] # 获取模板的宽高 result = cv2.matchTemplate(Screenshot, Hamster, 0) # 匹配模板 min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) # 获得匹配图最大阻值最小值的位置 if min_val < 20000000.0: left_top = min_loc # 左上角的位置就是最小值 x = (left_top[0] + 0.5 * w) + 644 y = (left_top[1] + 0.5 * h) + 351 x, y = int(x), int(y) print(x, y) m = PyMouse() m.click(x, y) # 移动并且在(x,y)位置左击 m.click(x, y) # 移动并且在(x,y)位置左击 m.click(x, y) # 移动并且在(x,y)位置左击 if __name__ == "__main__": while 1: Hamster = cv2.imread("Hamster.jpg") HamsterImg = cv2.cvtColor(Hamster, cv2.COLOR_RGB2BGR) Screenshot = GetImages() TemplateMatching(Screenshot, HamsterImg)