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调用shell的方法
Nov 20 Python
使用python统计文件行数示例分享
Feb 21 Python
使用Python编写简单网络爬虫抓取视频下载资源
Nov 04 Python
python3中函数参数的四种简单用法
Jul 09 Python
Python用于学习重要算法的模块pygorithm实例浅析
Aug 16 Python
Python线性拟合实现函数与用法示例
Dec 13 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
在Python中过滤Windows文件名中的非法字符方法
Jun 10 Python
树莓派安装OpenCV3完整过程的实现
Oct 10 Python
Python合并2个字典成1个新字典的方法(9种)
Dec 19 Python
Scrapy框架基本命令与settings.py设置
Feb 06 Python
jupyter notebook 参数传递给shell命令行实例
Apr 10 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 htmlentities和htmlspecialchars 的区别
2008/08/18 PHP
php strlen mb_strlen计算中英文混排字符串长度
2009/07/10 PHP
php cURL和Rolling cURL并发方式比较
2013/10/30 PHP
php获取文件大小的方法
2014/02/26 PHP
分享ThinkPHP3.2中关联查询解决思路
2015/09/20 PHP
Thinkphp整合阿里云OSS图片上传实例代码
2019/04/28 PHP
laravel框架中视图的基本使用方法分析
2019/11/23 PHP
JS中获取数据库中的值的方法
2013/07/14 Javascript
JavaScript动态创建div属性和样式示例代码
2013/10/09 Javascript
javascript使用location.search的示例
2013/11/05 Javascript
yui3的AOP(面向切面编程)和OOP(面向对象编程)
2015/05/01 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
jquery实现在网页指定区域显示自定义右键菜单效果
2015/08/25 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
jQuery 实现ajax传入参数含有特殊字符的方法总结
2016/10/17 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
小程序图片长按识别功能的实现方法
2018/08/30 Javascript
vue 使某个组件不被 keep-alive 缓存的方法
2018/09/21 Javascript
JS实现的tab切换并显示相应内容模块功能示例
2019/08/03 Javascript
Vue+Element UI 树形控件整合下拉功能菜单(tree + dropdown +input)
2020/08/28 Javascript
vue 避免变量赋值后双向绑定的操作
2020/11/07 Javascript
JavaScript实现简单动态表格
2020/12/02 Javascript
Python获取linux主机ip的简单实现方法
2016/04/18 Python
python方向键控制上下左右代码
2018/01/20 Python
python在非root权限下的安装方法
2018/01/23 Python
Python3内置模块random随机方法小结
2019/07/13 Python
pytorch多GPU并行运算的实现
2019/09/27 Python
Django 实现xadmin后台菜单改为中文
2019/11/15 Python
python实现飞机大战游戏(pygame版)
2020/10/26 Python
利用Python如何实时检测自身内存占用
2020/05/09 Python
Pytorch 中的optimizer使用说明
2021/03/03 Python
财务稽核岗位职责
2015/04/13 职场文书
社区安置帮教工作总结2015
2015/05/20 职场文书
《神奇的鸟岛》教学反思
2016/02/22 职场文书
Logback 使用TurboFilter实现日志级别等内容的动态修改操作
2021/08/30 Java/Android
java获取一个文本文件的编码(格式)信息
2022/09/23 Java/Android