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中处理字符串之endswith()方法的使用简介
May 18 Python
python统计日志ip访问数的方法
Jul 06 Python
python基础知识小结之集合
Nov 25 Python
Python日期的加减等操作的示例
Aug 15 Python
PyCharm的设置方法和第一个Python程序的建立
Jan 16 Python
python3+selenium实现qq邮箱登陆并发送邮件功能
Jan 23 Python
Python函数的定义方式与函数参数问题实例分析
Dec 26 Python
使用Python和百度语音识别生成视频字幕的实现
Apr 09 Python
Python-jenkins模块获取jobs的执行状态操作
May 12 Python
Python 下载Bing壁纸的示例
Sep 29 Python
python 模拟登陆github的示例
Dec 04 Python
Python 避免字典和元组的多重嵌套问题
Jul 15 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网上调查系统
2006/10/09 PHP
php fread读取文件注意事项
2016/09/24 PHP
php ActiveMQ的安装与使用方法图文教程
2020/02/23 PHP
一个JavaScript递归实现反转数组字符串的实例
2014/10/14 Javascript
js实现最短的XML格式化工具实例
2015/03/12 Javascript
jquery 构造函数在表单提交过程中修改数据
2015/05/25 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
js实现简易垂直滚动条
2017/02/22 Javascript
老生常谈js中的MVC
2017/07/25 Javascript
nodejs微信扫码支付功能实现
2018/02/17 NodeJs
vue实现密码显示隐藏切换功能
2018/02/23 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
使用Sonarqube扫描Javascript代码的示例
2018/12/26 Javascript
Vue CLI3创建项目部署到Tomcat 使用ngrok映射到外网
2019/05/16 Javascript
jQuery中DOM操作原则实例分析
2019/08/01 jQuery
Vue自定义指令结合阿里云OSS优化图片的实现方法
2019/11/12 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
python中map()函数的使用方法示例
2017/09/29 Python
CentOS7.3编译安装Python3.6.2的方法
2018/01/22 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
Python3.0 实现决策树算法的流程
2019/08/08 Python
Django获取应用下的所有models的例子
2019/08/30 Python
Python一行代码解决矩阵旋转的问题
2019/11/30 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
Python中常用的高阶函数实例详解
2020/02/21 Python
自定义Django默认的sitemap站点地图样式
2020/03/04 Python
Django 项目布局方法(值得推荐)
2020/03/22 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
2020/07/03 Python
Omio波兰:全欧洲低价大巴、火车和航班搜索和比价
2018/02/16 全球购物
中国跨境在线时尚零售商:Bellelily
2018/04/06 全球购物
美国最受欢迎的度假目的地优惠套餐:BookVIP
2018/09/27 全球购物
企业管理部经理岗位职责
2013/12/24 职场文书
城建学院毕业生自荐信
2014/01/31 职场文书
会计主管竞聘书
2015/09/15 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
vue生命周期钩子函数以及触发时机
2022/04/26 Vue.js