Python+OpenCV让电脑帮你玩微信跳一跳
作者:船D长 发布时间:2021-12-16 10:31:17
前言
最近微信小游戏跳一跳大热,自己也是中毒颇久,无奈手残最高分只拿到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里的模板匹配和边缘检测功能。
模板匹配
模板匹配是在一幅图像中寻找一个特定目标的方法之一。这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标。
例如提供小人的模板图片
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函数,就能找到中小人的位置。小人的检测效果非常好,每次都能识别得很精确。
观察到小人跳到物块中心之后,下一个物块中心就会出现白色小圆点,同样可以匹配图中白色小圆点,从而获得跳跃目标点的坐标,计算跳跃的距离。
但是只匹配小圆点获得跳跃目标位置会出现问题,因为有些物块本身就是白色的,导致检测失败,所以我们在检测失败(模板匹配的相似度很低)的情况下采用边缘检测。
边缘检测
边缘检测顾名思义就是检测图片中的边缘,使用opencv中的cv2.Canny函数。
跳一跳的画面很简洁,所以边缘检测的效果很好。检测出边缘后,从上至下扫描图片就能找到下一个物块的大致位置。
img = cv2.imread('1.png', 0)
# 先做高斯模糊能够提高边缘检测的效果
img = cv2.GaussianBlur(img,(5,5),0)
canny = cv2.Canny(img, 1, 10)
来源:http://blog.csdn.net/moneydboat/article/details/78941582


猜你喜欢
- python版本和ssl版本都会导致 requests在请求https网站时候会出一些错误,最好使用新版本。1 Python2.6x use
- 代码如下:ADODB.Connection 错误 '800a0e7a' 未找到提供程序。该程序可能未正确安装。 /连接“网站
- 实现爬虫的增量式爬取有两种方法,一是在获得页面解析的内容后判断该内容是否已经被爬取过,二是在发送请求之前判断要被请求的url是否已经被爬取过
- 一、引言生成数据库表有下面的三种方式:代码生成。程序包管理器控制台迁移。命令行迁移。下面分别介绍上面的三种方法。二、具体示例1、代码生成在程
- 用到给视频添加背景音乐,并改变音量。记录一下,与碰到同样问题的朋友共享。import subprocessinmp4='E:/Pyc
- 在做JS开发时,我们将第三方复杂的插件进行封装,然后对外公开一个很简单的方法接口,这是开发时常用的方法,在JS里,我们的方法参数通常使用JQ
- 先写一个SQLSELECT DISTINCT from_idFROM codWHERE cod.from_id NOT IN (37, 56
- 前言在对网站整体性能进行benchmark时,可以使用多种工具,比如大名鼎鼎的ab(Apache bench),http_load等工具。这
- 1. 逆转字符串的三种方法1.1. 模拟C++中方法, 定义一个空字符串来实现通过设置一个空字符串, 然后讲参数中的字符串从后往前遍历, 使
- 可迭代对象和迭代器迭代(iterate)意味着重复,就像 for 循环迭代序列和字典那样,但实际上也可使用 for 循环迭代其他对象:实现了
- 无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构、充分利用空间是十分必要的。这就要求我们对数据库系统的常用数据类型有充
- ul: unordered lists ol: ordered lists li: Listsol 有序列表:<ol>
- 上一篇相关文章python_tkinter弹出对话框创建需要的可以参考一下1.fledialog对话框示例:askopenfilename(
- 在python中,我们定义好一个字符串,如下所示。在python中定义个字符串然后把它赋值给一个变量。我们可以通过下标访问单个的字符,跟所有
- 如下所示:# -*- coding: utf-8 -*-import sys, urllib, urllib2, jsoncity=urll
- 使用python实现单向循环链表,供大家参考,具体内容如下单向循环链表将所有的链接在一起,每一个节点分为数据存储区和链接区,数据区存储数据,
- 问题:将文件夹a下任意命名的10个文件修改为如下图所示文件?代码:#coding:utf-8import ospath = "./
- CAPTCHA,全称为“Completely Automated Public Turing test to tell Computers
- 前言在日常开发中 动画是必不可少的一部分 不仅能让元素直接的切换显得更加自然 同时也能极大的增强用户体验 因此 在Vue之中也提供了非常强大
- 事情是这样的五一假期第一天值班隔壁有点喜欢的小姐姐突然跑过来跟我聊天“微信账号切换来切换去 特别麻烦”“怎么能同时打开多个呢?”我心想,你有