最近,微信小游戏“跳一跳”很火,看着朋友圈里别人晒出的图,我这个手残党十分不是滋味,于是我就想,能不能利用图像处理,做一个全自动的外挂呢。说罢,直接动手。

Ps:以下内容的部分步骤在实验过程中我是使用了多种方案进行比较的,限于篇幅,这里只给出表现较好的一种。最终的成品识别的结果并不是太精确,在下才疏学浅,还望各位大佬不吝赐教。

关于控制方面,由于这个程序是运行在PC机上的,我没有移植到手机端,为了控制微信的游戏,我使用USB线连接电脑和安卓手机,然后使用了一个可供电脑控制手机的软件,如Total Control。这样,程序透过Total Control就可以实现在手机上模拟点击的目的。

关于程序语言的选择,我使用的是C++语言,利用了OpenCV库作图像处理,WindowsAPI模拟鼠标点击。

以下是算法分析。

首先是明确输入输出,输入很清楚,那就是游戏画面。至于输出,玩过“跳一跳”的人都知道,操作者只需要控制按下的时间长短,无需其他操作,所以算法的输出就是按下到松开的时间间隔。

其次是时间的计算,网上已经有很多大神分析过了,点击间隔时间T与跳跃的距离L近似为线性关系。这里直接套用这个结论。得到

T=kL

其中,T的单位是毫秒,L的单位是像素长度,经过本人手工测试,k的值大概是4.3到4.5。

于是问题就转换为由输入图像,求解棋子底座中心到下一个跳台中心的距离。这个问题又可以进一步分解为求解棋子底座中心坐标和求解下一个跳台平面中心坐标。

于是,算法的流程如下:

其中,计算距离是很简单的数学问题,这里不作详述,重点放在棋子坐标识别与跳台中心识别上,下面分两部分对其进行说明。

1、棋子坐标识别

跳一跳简洁的画风使分离棋子异常简单,由于棋子与背景具有鲜明的对比,这里无需训练分类器。如果做过手势分割的人就知道,通过肤色可以把手从背景中分割出来,这里使用类似的原理。

从游戏可知,棋子的颜色是固定的,为紫色,具有明暗变化,针对该特点,这里我把图像从RGB空间映射到HSV空间,以色调H作为分割依据,根据实验统计,棋子部分的H的区间为[100,135]。这里拿一幅图进行测试,得到如下结果:

这里,有一个问题是要注意的,游戏界面的上部的分数,菜单图标,以及下面的邀请围观按钮有可能会对分割造成影响,而棋子和跳台均集中在画面的中间位置,因此,处理图像时,应先把图片的上部和下部的去掉。这在下面的所有操作均适用,下面不再重复。

有一种特殊情况,当遇到紫色礼盒跳台时,由于跳台和棋子的色调接近,将使分割无法正确进行。

因此,我们必须要对分割加一个约束,以解决这种情况,幸运的是,我发现,该礼盒与棋子在明度上还是有很大的差别的,所以,这里加一个明度约束,取V满足[0,150]。实验结果如下

于是,棋子的分割区间应该是H:[100,135],V:[0,150]。

棋子分割出来后,就是坐标的计算了,这里采用了一种很简单粗暴但很有效的办法,求解重心再按图像大小往下偏移。

首先是根据分割图片,求解棋子的重心,然后,把重心按照采样图片的大小加一个往下的偏移量移到棋子的底部中心位置即可。由于棋子的大小是固定的,所以偏移量也是固定的,具体数值多少跟采样图片大小有关。由此,棋子底座中心坐标识别完成,下面是实验结果,输出坐标在图片中用红色圈标出。

2、跳台中心的识别

这一部分相对较麻烦。主要的原因是跳台种类繁多,颜色各异,大小不一,形状各异。有些跳台的跳台平面是纯色的,但是有些诸如魔方、音乐盒等则有复杂的图案。各种干扰为识别带来了麻烦。

这里可以换一个角度,我们最终的目的是提取出跳台的跳台平面中心,而不是识别跳台本身的种类,因此并没有从图像中分割出跳台并识别的必要性。这里先明确一个概念,跳台是指整个物体,跳台平面指的是该跳台供棋子立足的平面,比如,纸盒本身是跳台,跳台平面就是它的上表面。我试图从全局图像入手解决这个问题。

首先要做的是背景去除,一开始我猜测背景是纯色或者明度渐变的,后来实验的结果显示并不是那么一回事,渐变是两种颜色的渐变。这个就有点坑了。经过一番折腾后,下面给出解决方案。

我从图像的边缘附近的背景处,取了两个点,一个在图像上方,一个在下方,两者在同一列。然后我把这两点间的像素的各个通道的变化绘制出来,纵坐标是通道值,横坐标是标号。经过多次试验,可以发现在背景的纵向,颜色各通道值与所在点的y坐标呈线性关系。

而在横向,我发现背景中同一行的像素值不变。

基于上述实验结果,我在背景的上下方各取一点,计算出两点的RGB三个通道各自与行索引y的线性方程的斜率k。

于是可得到

遍历全图,把每一个像素的实际值与使用上面公式计算得到的计算值进行对比,若误差少于某一阈值,则判定该点为背景点。处理效果如下:

成背景去除后,我们还要进一步把棋子从图上去掉,以防干扰。这里操作很简单,直接使用棋子分割得到的图片取反后与待处理图片作与运算即可,为了保证棋子的去除没有残留,可以适当对棋子分割图执行膨胀后再进行操作。结果如下:

从这步开始对跳台平面的中心进行定位。为了方便说明,我把执行上述步骤后得到的图像执行二值化(实际程序中这步没有必要),取白色为1,黑色为0.

首先,经过观察,可以得到几个前置结论。

(1)无论跳台是纯色的还是有图案的,是盒子还是圆桌或是牛奶瓶,跳台平面在屏幕上的投影无非就是两种情况,一种是菱形,一种是椭圆形。且菱形的短对角线和椭圆的短轴均与Y轴平行。

(2)无论何种跳台,其跳台平面在屏幕上的投影均位于该跳台整体投影的最上方。

(3)无论何种跳台,无论起始跳台与目标跳台的距离长短,目标跳台在屏幕上投影的最高点总比起始跳台在屏幕上投影的最高点要高。(这个其实并不是绝对的,只是在该游戏中极少会出现)

基于以上结论,执行以下操作:

从图片的第一行起,往下逐行扫描,寻找不为0的像素点。

根据前置结论3,扫描过程中碰到的第一个为1的点属于目标跳台。

根据前置结论2,扫描过程中碰到的第一个为1的点位于目标跳台的跳台平面上。

根据前置结论1,扫描碰到的第一个为1的点的x坐标与跳台平面中点的x坐标相等。把该点设为P1

这里要做一个修正,由于分辨率的原因,实际上扫描线与图形相切的切点往往不只一个,所以实际的操作应该是取相切行中所有连续的为1的点的中点作为P1

然后分两种情况:

第一种是P1位于棋子坐标Pchess的右边(P1.x > Pchess.x)。这时从P1开始,沿着跳台平面的边缘向右走(x增大的方向),到达第一个拐点(x的取值由增加到减小或不变的点)停下,取该点为P2

具体的操作方法是,从P1处往右扫描,直至到像素点为0的点停下,记下该点的x坐标,设为a0,从该点处下移一行,往右扫描操作,直至到像素点为0的点停下,记下该点的x坐标,设为a1···重复上述操作,直至a的极大值出现,那么P2的坐标就是(an,P1.y+n)。

 

第二种情况是P1位于棋子坐标Pchess的左边(P1.x < Pchess.x),这种情况与上面的操作是类似的,不同的是,从P1开始,沿着边缘往左走(x减小的方向),取第一个拐点(x的取值由减小到增加或不变的点)为P2

可知,P2.y与跳台平面的中点的y坐标相等。由此可得,跳台平面中点坐标

PMiddle为(P1.x,P2.y).

上述方法对菱形和椭圆均适用,实验结果中对于菱形识别的准确度较高,基本可以定到中心,椭圆的情况稍差,但也基本满足要求,下面是最终识别结果,用红色圈在原图中标出结果如下:

经过上述步骤后,就已经可以求出棋子坐标,和跳台平面中心坐标了,然后求解两点距离,再根据公式求出点击时间,用以控制即可。

基于图像识别的微信游戏“跳一跳”自动控制实验相关推荐

  1. python做的游戏放到微信_【1、 创建一个python的文件,运行后,文字版方式模拟微信游戏“跳一跳?】...

    python脚本学习过程推荐 学习流程: 一:打础 1.找到合适的书籍(推荐Python核心编程2Dive into Python),大致读一次,循环啊判,常用类啊,搞懂(太难的跳过) 2.勤练习py ...

  2. 第一次写“辅助”软件(微信游戏跳一跳)

    前言 第一次看到这个跳一跳的游戏是在微博上,微博的照片上有个人站在窨井盖上,下面一群人"哈哈哈哈哈哈哈哈哈".我的第一反应是,这是啥? 后来才知道是一个很火的微信小游戏叫跳一跳,玩 ...

  3. python设计游戏使用手机操作_如何使用python控制手机(以微信游戏跳一跳为例)

    打开手机的开发者选项,本人小米手机,系统android 7.0(miui 9.1),设置->我的设备->全部参数(点击miui版本5次,即可开启开发者模式) 设置->更多设置(倒数第 ...

  4. python 控制鼠标点击需要100ms为什么_用 Python3 和 OpenCV 替我玩一玩微信小游戏 — 跳一跳 (这算外挂么)...

    0 瞎弄 我知道你们喜欢先看效果 手残的我,始终跳不过你们这些超过 50 分的大佬.想起最近在用 Python 学习 ML (Mechine Learning, 机器学习) ,怎么用没学会,倒是里面神 ...

  5. mfc使用cef源代码实现_如何获得微信小游戏跳一跳源码以及源代码组合包括哪些...

    很多小游戏都是由源代码编写而成的,那大家知道源代码组合包括哪些吗?手机游戏源代码怎么使用的呢?还有,如何获得微信小游戏跳一跳源码?下面就由奇瑰网小编带大家来了解一下相关的内容吧. 源代码组合包括哪些 ...

  6. 如何拷贝工程_如何获得微信小游戏跳一跳源码以及源代码组合包括哪些

    很多小游戏都是由源代码编写而成的,那大家知道源代码组合包括哪些吗?手机游戏源代码怎么使用的呢?还有,如何获得微信小游戏跳一跳源码?下面就由奇瑰网小编带大家来了解一下相关的内容吧. 源代码组合包括哪些 ...

  7. c语言小游戏跳一跳代码及注释,如何获得微信小游戏跳一跳源码以及源代码组合包括哪些...

    原标题:如何获得微信小游戏跳一跳源码以及源代码组合包括哪些 很多小游戏都是由源代码编写而成的,那大家知道源代码组合包括哪些吗?手机游戏源代码怎么使用的呢?还有,如何获得微信小游戏跳一跳源码?下面就由奇 ...

  8. 用Python编写微信小游戏“跳一跳”的运行脚本

    前言 更新了微信后发现了一款小游戏跳一跳,但是玩了一下午最高才达到200,每次差点破纪录后总是手抖就挂掉了,气的想要砸手机..闲来无事刷微博的时候正好看到有人分析如何编写脚本自动运行游戏破了3000多 ...

  9. 微信小游戏跳一跳作弊方法

    微信小游戏跳一跳作弊方法 本实现方法代码来源:https://zhuanlan.zhihu.com/p/32473340 原理粗解 微信小游戏跳一跳,本质上时一个半离线游戏,它的与服务器的通信其实是在 ...

最新文章

  1. 使用Auto TensorCore CodeGen优化Matmul
  2. CUDA Samples: approximate prior vbox layer
  3. 车联网系统会不会只是智能手机系统的翻版?
  4. hdu 4923 Room and Moor (单调栈+思维)
  5. 高并发下的接口幂等性解决方案!
  6. mysql集群软件有哪些_浅谈数据库集群软件优缺点有哪些
  7. java c 客户端_java基于C/S模式实现聊天程序(客户端)
  8. watch监控,对比新值和旧值做出相应判断
  9. 关于在vSphere环境中,安装WindowsServer2008_R2_x64系统,分区格式为GPT,隐藏分区为200M方法心得
  10. 50道编程小题目之【完全平方数】
  11. 树形图,多层级目录等其他名称待补充……
  12. ElasticJob简单使用
  13. iphone通讯录导入excel
  14. Sklearn 中的可用数据集
  15. 优秀开源云原生工具推荐——系列3
  16. 基于WIZ811MJ的Arduino网络恒温器
  17. 两种方法教你修改MAC地址 !
  18. python 单行if_python3绘图程序教学:单行If判断式(十三)
  19. 【Matplotlib】plt.imshow() cmap色彩表
  20. android图片音乐播放器,android 音乐播放器----获取专辑封面图片

热门文章

  1. C++ 标准库 底层接口thread()、promise、packaged_task
  2. 毫秒级返回数据,58同城 DBA 团队选择 TDengine 解决传感器数据处理难题
  3. 陕南是哪里?陕南是哪几个市?_陕南赤子_新浪博客
  4. 新浪支付日常懵逼系列
  5. [置顶]B-tree/B+tree/B*tree [转]
  6. 中望CAD的引线标注格式怎么改_首款国产中望CAD Linux登陆统一操作系统UOS
  7. 【快速幂】HRBUST 2263 萝莉控型提督
  8. 浅谈应届生的职业规划
  9. 发那科机器人寄存器Ar_发那科机器人应用-数值寄存器 R[]
  10. linux防火墙相关操作,永久关闭防火墙