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 lambda和Python def区别分析
Nov 30 Python
Python正则替换字符串函数re.sub用法示例
Jan 19 Python
Java及python正则表达式详解
Dec 27 Python
python PyTorch预训练示例
Feb 11 Python
Python3.6实现连接mysql或mariadb的方法分析
May 18 Python
对pycharm代码整体左移和右移缩进快捷键的介绍
Jul 16 Python
Pycharm连接远程服务器并实现远程调试的实现
Aug 02 Python
django项目登录中使用图片验证码的实现方法
Aug 15 Python
Django ORM 查询表中某列字段值的方法
Apr 30 Python
python如何建立全零数组
Jul 19 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 Python
两行代码解决Jupyter Notebook中文不能显示的问题
Apr 24 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中比较两个字符串找出第一个不同字符位置例子
2014/04/08 PHP
9个实用的PHP代码片段分享
2015/01/22 PHP
PHP观察者模式定义与用法实例分析
2019/03/22 PHP
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
jQuery实现页面滚动时动态加载内容的方法
2015/03/20 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
轻松学习jQuery插件EasyUI EasyUI创建RSS Feed阅读器
2015/11/30 Javascript
有关jQuery中parent()和siblings()的小问题
2016/06/01 Javascript
关于Javascript中document.cookie的使用
2017/03/08 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
React-native桥接Android原生开发详解
2018/01/17 Javascript
JavaScript设计模式之原型模式分析【ES5与ES6】
2018/07/26 Javascript
浅谈Vue.js路由管理器 Vue Router
2018/08/16 Javascript
layui点击数据表格添加或删除一行的例子
2019/09/12 Javascript
微信小程序中data-key属性之数据传输(经验总结)
2020/08/22 Javascript
Python爬虫辅助利器PyQuery模块的安装使用攻略
2016/04/24 Python
Python中定时任务框架APScheduler的快速入门指南
2017/07/06 Python
如何使用Python标准库进行性能测试
2019/06/25 Python
将python2.7添加进64位系统的注册表方式
2019/11/20 Python
Python数据可视化处理库PyEcharts柱状图,饼图,线性图,词云图常用实例详解
2020/02/10 Python
python实现连连看游戏
2020/02/14 Python
Django之choices选项和富文本编辑器的使用详解
2020/04/01 Python
jupyter修改文件名方式(TensorFlow)
2020/04/21 Python
Python requests.post方法中data与json参数区别详解
2020/04/30 Python
美国知名平价彩妆品牌:e.l.f. Cosmetics
2017/11/20 全球购物
为什么UNION ALL比UNION快
2016/03/17 面试题
运动会稿件200字
2014/02/07 职场文书
人事专员岗位职责范本
2014/03/04 职场文书
法人授权委托书公证范本
2014/09/14 职场文书
签证扫盲贴,41个常见签证知识,需要的拿走
2019/08/09 职场文书
高一作文之暖冬
2019/11/09 职场文书
为什么mysql字段要使用NOT NULL
2021/05/13 MySQL
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
redis 解决库存并发问题实现数量控制
2022/04/08 Redis