最近,微信小游戏“跳一跳”很火,看着朋友圈里别人晒出的图,我这个手残党十分不是滋味,于是我就想,能不能利用图像处理,做一个全自动的外挂呢。说罢,直接动手。
Ps:以下内容的部分步骤在实验过程中我是使用了多种方案进行比较的,限于篇幅,这里只给出表现较好的一种。最终的成品识别的结果并不是太精确,在下才疏学浅,还望各位大佬不吝赐教。
关于控制方面,由于这个程序是运行在PC机上的,我没有移植到手机端,为了控制微信的游戏,我使用USB线连接电脑和安卓手机,然后使用了一个可供电脑控制手机的软件,如Total Control。这样,程序透过Total Control就可以实现在手机上模拟点击的目的。
关于程序语言的选择,我使用的是C++语言,利用了OpenCV库作图像处理,WindowsAPI模拟鼠标点击。
以下是算法分析。
首先是明确输入输出,输入很清楚,那就是游戏画面。至于输出,玩过“跳一跳”的人都知道,操作者只需要控制按下的时间长短,无需其他操作,所以算法的输出就是按下到松开的时间间隔。
其次是时间的计算,网上已经有很多大神分析过了,点击间隔时间T与跳跃的距离L近似为线性关系。这里直接套用这个结论。得到
T=kL
其中,T的单位是毫秒,L的单位是像素长度,经过本人手工测试,k的值大概是4.3到4.5。
于是问题就转换为由输入图像,求解棋子底座中心到下一个跳台中心的距离。这个问题又可以进一步分解为求解棋子底座中心坐标和求解下一个跳台平面中心坐标。
于是,算法的流程如下:
其中,计算距离是很简单的数学问题,这里不作详述,重点放在棋子坐标识别与跳台中心识别上,下面分两部分对其进行说明。
1、棋子坐标识别
跳一跳简洁的画风使分离棋子异常简单,由于棋子与背景具有鲜明的对比,这里无需训练分类器。如果做过手势分割的人就知道,通过肤色可以把手从背景中分割出来,这里使用类似的原理。
从游戏可知,棋子的颜色是固定的,为紫色,具有明暗变化,针对该特点,这里我把图像从RGB空间映射到