Python+OpenCV让电脑帮你玩微信跳一跳


Posted in Python onJanuary 04, 2018

前言

最近微信小游戏跳一跳大热,自己也是中毒颇久,无奈手残最高分只拿到200分。无意间看到教你用Python来玩微信跳一跳一文,在电脑上利用adb驱动工具操作手机,详细的介绍以及如何安装adb驱动可以去看这篇文章,这里就不再介绍了。但是原文每次跳跃需要手动点击,于是想尝试利用图像处理的方法自动化。
最重要的不是最终刷的分数,而是解决这个问题的过程。花了一个下午尝试各种方法,最终采用opencv的模板匹配+边缘检测,方法很简单但效果很好。
本文主要分享如何用Opencv对游戏截图进行检测,自动找到小人和跳跃目标点的位置,计算跳跃距离,从而让电脑帮你玩跳一跳游戏!

本文的代码见https://github.com/moneyDboat/wechat_jump_jump,欢迎fork和star~

主要使用的Python库及对应版本:

python 3.6
opencv-python 3.3.0
numpy 1.13.3

Opencv

首先介绍下opencv,是一个计算机视觉库,本文将用到opencv里的模板匹配和边缘检测功能。

模板匹配

模板匹配是在一幅图像中寻找一个特定目标的方法之一。这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标。
例如提供小人的模板图片

Python+OpenCV让电脑帮你玩微信跳一跳

import cv2
import numpy as np

# imread()函数读取目标图片和模板
img_rgb = cv2.imread("0.png", 0)
template = cv2.imread('temp1.jpg', 0)

# matchTemplate 函数:在模板和输入图像之间寻找匹配,获得匹配结果图像 
# minMaxLoc 函数:在给定的矩阵中寻找最大和最小值,并给出它们的位置
res = cv2.matchTemplate(img_rgb,template,cv2.TM_CCOEFF_NORMED)
min_val,max_val,min_loc,max_loc = cv2.minMaxLoc(res)

使用OpenCV的matchTemplate函数,就能找到中小人的位置。小人的检测效果非常好,每次都能识别得很精确。

Python+OpenCV让电脑帮你玩微信跳一跳

观察到小人跳到物块中心之后,下一个物块中心就会出现白色小圆点,同样可以匹配图中白色小圆点,从而获得跳跃目标点的坐标,计算跳跃的距离。

Python+OpenCV让电脑帮你玩微信跳一跳

但是只匹配小圆点获得跳跃目标位置会出现问题,因为有些物块本身就是白色的,导致检测失败,所以我们在检测失败(模板匹配的相似度很低)的情况下采用边缘检测。

边缘检测

边缘检测顾名思义就是检测图片中的边缘,使用opencv中的cv2.Canny函数。
跳一跳的画面很简洁,所以边缘检测的效果很好。检测出边缘后,从上至下扫描图片就能找到下一个物块的大致位置。

img = cv2.imread('1.png', 0)

# 先做高斯模糊能够提高边缘检测的效果
img = cv2.GaussianBlur(img,(5,5),0) 
canny = cv2.Canny(img, 1, 10)

Python+OpenCV让电脑帮你玩微信跳一跳

总结

以上就是用OpenCV让电脑帮你玩跳一跳的整体思路,还有很多细节之后再补充,具体的流程见https://github.com/moneyDboat/wechat_jump_jump中的play.py文件,我已经尽力将代码注释写得详尽。
电脑上安装好adb驱动和相关的Python库,手机通过数据线连接电脑,运行play.py,接下来你就可以刷刷剧吃吃零食,然后让电脑帮你刷分啦~

这是我自己的结果截图,自动刷到1000分以上是没有问题的。

Python+OpenCV让电脑帮你玩微信跳一跳

还有很多不完善的地方,例如屏幕分辨率适配等,如果有什么更好的想法和建议,欢迎评论共同探讨~~

更多内容大家可以参考专题《微信跳一跳》进行学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python定时器(Timer)用法简单实例
Jun 04 Python
python web自制框架之接受url传递过来的参数实例
Dec 17 Python
梅尔倒谱系数(MFCC)实现
Jun 19 Python
python中时间、日期、时间戳的转换的实现方法
Jul 06 Python
python:按行读入,排序然后输出的方法
Jul 20 Python
Python一行代码解决矩阵旋转的问题
Nov 30 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
kafka-python 获取topic lag值方式
Dec 23 Python
.dcm格式文件软件读取及python处理详解
Jan 16 Python
Python运行异常管理解决方案
Mar 09 Python
python3.6使用SMTP协议发送邮件
May 20 Python
pytorch读取图像数据转成opencv格式实例
Jun 02 Python
Python编程求解二叉树中和为某一值的路径代码示例
Jan 04 #Python
Python编写Windows Service服务程序
Jan 04 #Python
微信跳一跳python辅助软件思路及图像识别源码解析
Jan 04 #Python
Python操作MongoDB数据库的方法示例
Jan 04 #Python
Python字典操作详细介绍及字典内建方法分享
Jan 04 #Python
Python tkinter实现的图片移动碰撞动画效果【附源码下载】
Jan 04 #Python
Python给你的头像加上圣诞帽
Jan 04 #Python
You might like
PHP 解决session死锁的方法
2013/06/20 PHP
在PHP上显示JFreechart画的统计图方法
2013/11/03 PHP
PHP正则表达式替换站点关键字链接后空白的解决方法
2014/09/16 PHP
PHP动态编译出现Cannot find autoconf的解决方法
2014/11/05 PHP
php从数组中随机选择若干不重复元素的方法
2015/03/14 PHP
整理php防注入和XSS攻击通用过滤
2015/09/13 PHP
php文件上传后端处理小技巧
2016/05/22 PHP
PHP MVC框架skymvc支持多文件上传
2016/05/26 PHP
PHP关于foreach复制知识点总结
2019/01/28 PHP
详解php中生成标准uuid(guid)的方法
2019/04/28 PHP
jquery CSS选择器笔记
2010/03/29 Javascript
读jQuery之二(两种扩展)
2011/06/11 Javascript
使用JavaScript进行进制转换将字符串转换为十进制
2014/09/21 Javascript
jquery制作多功能轮播图插件
2015/04/02 Javascript
Bootstrap每天必学之栅格系统(布局)
2015/11/25 Javascript
使用JavaScript为Kindeditor自定义按钮增加Audio标签
2016/03/18 Javascript
Javascript 判断两个IP是否在同一网段实例代码
2016/11/28 Javascript
微信小程序 弹窗自定义实例代码
2017/03/08 Javascript
Node.js使用orm2进行update操作时关联字段无法修改的解决方法
2017/06/13 Javascript
利用node.js制作命令行工具方法教程(一)
2017/06/22 Javascript
微信小程序 按钮滑动的实现方法
2017/09/27 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
JQuery实现ul中添加LI和删除指定的Li元素功能完整示例
2019/10/16 jQuery
python实现根据用户输入从电影网站获取影片信息的方法
2015/04/07 Python
python查询sqlite数据表的方法
2015/05/08 Python
Python yield 使用浅析
2015/05/28 Python
简单理解Python中的装饰器
2015/07/31 Python
python+django快速实现文件上传
2016/10/24 Python
如何利用Python动态模拟太阳系运转
2020/09/04 Python
Window10上Tensorflow的安装(CPU和GPU版本)
2020/12/15 Python
css3实现椭圆轨迹旋转的示例代码
2018/10/29 HTML / CSS
完美主义个人的自我评价
2014/02/17 职场文书
小学语文教学经验交流材料
2014/06/02 职场文书
交心谈心活动总结
2015/05/11 职场文书
就业指导讲座心得体会
2016/01/15 职场文书
Python Pandas 删除列操作
2022/03/16 Python