第一次是看到朋友圈有只喵星人在玩这个游戏,那时候去马来西亚旅游了(好多老外也用微信),回来之后发现这游戏越来越火,网上笔算的也有,直接抓包修改分数的也有,Alex给我看了一篇用舵机做的,python+opencv写的代码,我说这个应该labview用视觉也能做吧!于是用python试了一遍,labview也试了一遍。
Introduction
玩法的原理看起来很简单,跳跃距离跟按压时间成正比。使用python的PILLOW库工具抓取每次跳跃之前的像素点距离,对应算出按压时间。由于算法已经有了,我这个后人也只是过来乘乘凉而已,来学习一下python的各类库函数用法(PIL等),OpenCV还有与树莓派通讯(socket)。源码参考末尾。
比较关建的一步是利用OpenCV (Open Source Computer Vision Library)找出棋子、计算边缘(高斯模糊转化为灰度图)、分析图像,计算距离。
高斯处理
计算距离
具体步骤如下:
将手机屏幕投影至电脑
使用PIL 库截取屏幕,将每一次跳跃前图像保存至后台
利用OpenCV计算跳跃距离,获得按压时间
利用socket与树莓派建立通讯,windows端发送按压时间
树莓派端不停监听windows端时间数据,然后控制舵机动作
What you will need
硬件
树莓派
iphone
舵机上S3003
自制电容笔
自制底座
杜邦线
棉签,吸管等
软件
python with Pillow,numpy ,pyfirmata,opencv
Airplayer 镜像工具
putty
filezilla
What you will do
1.windows端安装运行环境:
2.widows安装Airplay镜像工具,打开iPhone客户端屏幕镜像,这里在windows端一定要全屏显示,因为利用python PIL截屏是按全屏像素定义的。
def pull_screenshot():
im = ImageGrab.grab((654, 0, 1264, 1080))
im.save('a.png', 'png')
3.将python舵机控制程序放至树莓派端(可以使用filezilla),并开启监听端口。
4.打开windows端python代码,设置树莓派IP地址,运行程序:
ip_addr = '192.168.1.115'
send_time函数用于发送windows端数据,开启9999端口号:
def send_time(time):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip_addr, 9999))
s.send(str(time).encode('utf-8'))
s.close()
5.制作底座和电容笔,调好按压距离。
我用了跟棉签,外面套根吸管,笔头沾水,然后包着铜线(锡纸会好一点,接触面积大),铜线接树莓派GND也可手抓住。
Refer to:
源码:
https://github.com/yangyiLTS/wechat_jump_game_iOS
https://zhuanlan.zhihu.com/p/32526110
https://opencv.org/
https://baike.baidu.com/item/电容笔/7622012?fr=aladdin
与我们一起踏上树莓派的奇幻之旅吧~
领取专属 10元无门槛券
私享最新 技术干货