用C++和android模拟器实现《跳一跳》自动刷分
一、人物定位
人物的定位比较简单,因为颜色是固定的,用颜色分割基本能比较准确的定位。
基本的做法就是先把图像转到HSV颜色空间,再通过简单的阈值分割,最后用形态学运算去除错误的点。计算过程示图如下。
二、落点定位
落点都是很规则的菱形和椭圆,而且边缘非常明显,所以可以用模板匹配的方法来准确的定位。因为匹配的目标相对简单,可以用chamfer matching的简化版来实现。
通过实验,下图的四个模板可以非常稳定的匹配到大部分落点图上,其中绿色的点为实际计算时取的匹配点。
计算过程:
1.计算图像的边缘图,方法有很多种,常用的是canny算子和梯度的方法。
2.计算距离变换图。
3.在距离变换图上对所有模板的匹配点进行匹配,选出最优的匹配作为匹配结果,模板的中心点为落点。
- 因为落点最上部分的边缘基本是图像所有边缘的最高点,所以可以很容易的定位到该点,以该点为模板的起始点可以简化运算;
- 因为落点不存在旋转变换,所以匹配的参数可以简化为x, y, scale, 分别代办水平位移,垂直位移和尺度变换。
下图是模板评估的公式和计算过程示意图
最后通过人物和落点的定位可以计算出起始点的距离,然后根据距离换算成对应的按压屏幕的时间。
三、输入和输出
输入的图像是通过WINAPI的截屏函数来获得的,首先打开android模拟器并开启跳一跳小程序,然后通过截屏的方式获取;
输出也是通过WINAPI的模拟鼠标动作的函数,鼠标按下和松开之间休眠的时间就是按压屏幕的时间。
四、测试结果