魔灵召唤是韩国的一个卡牌收集类游戏(阴阳师的玩法也是从此而来的),笔者我断断续续玩这游戏也得有三年,这个游戏已经存活了五年,可见这个游戏是非常的坚挺呀。

但是游戏有点肝,非佛系玩家的我总是忍不住要去玩它,恍惚间头发已经稀疏,不禁抚额长叹:哎!要是有个不被封的脚本就好了!我需要做一个物理外挂!!!让官方检测不出来的那种,哼。

python 游戏图像识别脚本 图像识别做游戏脚本_python 游戏图像识别脚本

在参谋了网上的一些资料后,我大致整理了下思路:

  1. 获取手机截图,这一操作官方肯定检测不到吧。or视觉拍照,官方肯定也检测不到呀。
  2. OpenCV处理得到的手机截图(拍出的照片),因为游戏的一些画面是固定的,我们只需找出屏幕上需要模拟点击的位置即可,采用模板匹配方法。
  3. 模板匹配完成获得需要点击的屏幕位置,控制板子执行相应的动作。
    可以使用树莓派、arduino之类的,但是我老本行虽然是电机控制,这些板子还没用过……用一些plc之类的成本又会提升,后续学习一下树莓派吧。

好,那我们先搞定第一步:手机截图获取。

如何用电脑获取手机截图?可以使用adb工具。

adb工具即Android Debug Bridge(安卓调试桥) tools。

它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。

一、adb下载

以下是adb工具包最新Google官方版下载地址:

ADB和Fastboot for Windows

https://dl.google.com/android/repository/platform-tools-latest-windows.zip

ADB和Fastboot for Mac

https://dl.google.com/android/repository/platform-tools-latest-darwin.zip

ADB和Fastboot for Linux

https://dl.google.com/android/repository/platform-tools-latest-linux.zip

由于这些是直接的 Google 链接,用户可以确保下载不仅是官方的,而且将始终能够获得最新版本的 ADB 和 Fastboot 。

二、adb初步使用

下载好的文件直接解压即可,将文件路径添加到环境变量的用户变量的path里。

比如我的路径是:

C:\Users\Administrator\platform-tools_r28.0.2-windows\platform-tools

只需要:

python 游戏图像识别脚本 图像识别做游戏脚本_python_02

好,现在win+R 调出 运行窗口,输入cmd打开控制台,输入 adb,如果没有报错则表示安装成功,并且你会看到adb的使用指南。

输入 adb version:

python 游戏图像识别脚本 图像识别做游戏脚本_安卓系统_03

将手机通过USB连接到电脑,输入 adb devices:

python 游戏图像识别脚本 图像识别做游戏脚本_python_04

那么问题来了,到了这一步很容易会卡住,只显示“List of devices attached”,请检查一下几条(不好意思暂时只学习了android的):

(1)手机打开的USB调试,在开发者模式下把USB相关选项勾上,依据手机品牌自行查询~

(2)如果手机端设置没有问题,电脑上依然未检测到手机设备,那么看一下手机驱动是否安装。

python 游戏图像识别脚本 图像识别做游戏脚本_python 游戏图像识别脚本_05

(3)adb版本太低,但是如果是从上面链接下载的,不会存在这个问题。

现在我们安装成功了,使用一下截图指令来获取手机截图吧!

首先看一下说明:

python 游戏图像识别脚本 图像识别做游戏脚本_python_06

那我们使用的指令就是 adb shell screencap -p ,不过截图方式也有两种

第一种是先命令手机截图并存到手机sd内,然后读到电脑上。

    adb shell screencap -p /sdcard/screen.png

    adb pull /sdcard/screen.png

真是麻烦呀,还要占手机内存,那必须要保存几次之后清空,否则开着游戏一直截图,手机不得爆了==

第二种方法是直接保存到电脑上

adb shell screencap -p > E:/summonerswar.png

哈哈第二种方法这么简单,赶快打开看看,???what the hell?

python 游戏图像识别脚本 图像识别做游戏脚本_python_07

网上查找一下原因:

在windows操作系统下,回车符是\r\n,在Linux操作系统下,回车符是\n。安卓系统是基于Linux内核开发而来的,所以在安卓系统中回车符也是\n,这样就会出现一个问题,在安卓系统中截图得到的二进制数据流中,如果出现\n,Windows会将\n解析成\r\n,所以截图命令得到的png文件不能正常打开。要使得在Windows系统中能对截图得到的png文件进行操作,需要将png文件中数据部分的\r\n转换成\n,这样就能够得到正确的文件。

因此,我们还需使用python对文件进行一番操作。

三、使用python对adb获取的文件进行处理

adb指令在python中怎么使用?调用os模块就可以了。

import os

def convert_img(path):
    with open(path, 'br') as f:
        img_old = f.read()
        img_new = img_old.replace(b'\r\n', b'\n')
    with open(path, 'bw') as f:
        f.write(img_new)


if __name__ == '__main__':
    os.system('adb shell screencap -p > E:/PycharmProjects/android_summonerswar/pictures/summonerswar_0.png')
    convert_img(r'E:\PycharmProjects\android_summonerswar\pictures\summonerswar_0.png')

运行一下,发现在不运行魔灵召唤时获得的截图是正常的,运行魔灵召唤时就不正常(长宽反了),找了半天没找到原因,暂时先搁置了。

还记得以前说的OpenCV中的resize用法吗,我们就取个巧,通过改变大小还原截图吧。

加入resize之后的程序:

import os
import cv2
import time

def getimg_toPC(imgname):
    '''
    直接从获取手机截屏到电脑上
    :param imgname: 截屏文件名,xxx.png
    :return: None
    '''
    os.system('adb shell screencap -p > E:/PycharmProjects/android_summonerswar/pictures/'+imgname)
    with open('E:/PycharmProjects/android_summonerswar/pictures/'+imgname, 'br') as f:
        img_old = f.read()
        img_new = img_old.replace(b'\r\n', b'\n')
    with open('E:/PycharmProjects/android_summonerswar/pictures/'+imgname, 'bw') as f:
        f.write(img_new)
    img = cv2.imread('E:/PycharmProjects/android_summonerswar/pictures/'+imgname)
    img_new = cv2.resize(img, (1000, 461), cv2.INTER_AREA)
    cv2.imwrite('E:/PycharmProjects/android_summonerswar/pictures_resize/'+imgname, img_new)


def getimg_sdcard(imgname):

    os.system('adb shell /system/bin/screencap -p /sdcard/'+imgname)
    os.system('adb pull /sdcard/'+imgname + ' E:/PycharmProjects/android_summonerswar/pictures/'+imgname)


if __name__ == '__main__':
     img_name = 'screen.png'
     while True:
        time.sleep(2)
        getimg_toPC(img_name)
        img = cv2.imread('E:/PycharmProjects/android_summonerswar/pictures_resize/'+img_name)
        cv2.imshow('here', img)
        cv2.waitKey(0)

终于得到了想要的图像,注意读上来的分辨率要比电脑大,因此等比例缩小了下(1000,461):

python 游戏图像识别脚本 图像识别做游戏脚本_opencv活体检测android_08

好,第一步完成啦,下一步准备OpenCV中模板匹配的应用喽~