项目地址: https://github.com/chiqj/WechatJump,Python 语言开发,使用 adb + pillow + opencv + sklearn 实现,目前只支持安卓手机。
这是一个年初就想动手的项目,期间因为时间原因、技术能力原因,到现在算是完成了。在前人的基础上做了些改进,理论上可以无限运行——只要有时间。
上个分数截图证明自己所言不虚:

特性
与年初的跳一跳机器人相比,进行了以下改进:
- adb 截图后图像直接传输给上位机,不经过手机存储和 SD 卡;上位机一直在内存中处理图像,减少 IO 耗时,提高效率。
- 使用上一次截图的目标棋盘(也是本次截图的起始棋盘)作为模版,使用 OpenCV 模版匹配寻找起始棋盘的中心坐标,根据中心坐标和棋子中心坐标的相对位置、上次计算的跳跃距离计算实际跳跃距离。替代其他项目中在“跳跃后视角平移前”进行截图的方法,不需要反复尝试调整合适的 “ Magic Number ”,且每次跳跃只需截图一次。简而言之,省力✌️,提高准确性,提高效率;
- 为加快运行速度,只在程序初始化时训练模型,但程序运行时输出的数据可用于回归模型训练。
- 计算两点间距离时,使用两点在跳跃方向(与水平线夹角 30 度)上的投影距离,与欧式距离相比更加精确。即下图中 OB 的距离(图片来源:腾讯 WeTest 团队):

使用的技术和库
- OpenCV —— 模版匹配,Canny 边缘检测
- Pillow —— ImageDraw 模块
- sklearn —— 线性回归,多项式回归
回归模型
线性回归

多项式回归(degree=7)
.png)
踩过的坑
- 由于图像坐标系从左上角开始,Y 轴在向下的方向上是递增的,所以斜率与普通直角坐标系相反。也就是说,从左下到右上方向的直线实际为负斜率。
- OpenCV 模版匹配对缩放图片处理效果不好,导致从小程序文件解包出来的棋子图像无法使用,必须获取当前分辨率下的棋子图像和中心点图像作为模版;
最后,反对一切使用外挂的行为,该项目只为学习目的,没有加入反作弊代码,以后也不会有:)