python微信跳一跳系列之棋子定位像素遍历


Posted in Python onFebruary 26, 2018

前言

在前几篇博客中,分别就棋子的颜色识别、模板匹配等定位方式进行了介绍和实践,这一篇博客就来验证一下github中最热门的跳一跳外挂中采用的像素遍历的方法。

方法说明

像素遍历的实质依然是颜色识别。
在github中给出的方法中,采用像素遍历的方法是:

  • 从高度的1/3处开始至高度的2/3处进行遍历;
  • 首先间隔50像素进行搜索
  • 当像素的颜色和每一行开始的像素颜色不同时,认为找到了最上面的棋盘位置,则返回上一个间隔处开始遍历(i-50);
  • 对每一行的像素都进行遍历,当满足给定的颜色范围时,记录最下面一行的y值,x值的和与个数,平均即可得到中心x值。
  • 所得到的x值和y值即为棋子最底部的中心位置;
  • 按照自己手机的分辨率调整棋子的高度(减去一个固定值)

上诉方法的代码如下(可以自行到github下载):

def find_piece_and_board(im):
 #寻找关键坐标
 w, h = im.size

 piece_x_sum = 0
 piece_x_c = 0
 piece_y_max = 0
 board_x = 0
 board_y = 0
 scan_x_border = int(w / 8) # 扫描棋子时的左右边界
 scan_start_y = 0 # 扫描的起始 y 坐标
 im_pixel = im.load()
 # 以 50px 步长,尝试探测 scan_start_y
 for i in range(int(h / 3), int(h*2 / 3), 50):
 last_pixel = im_pixel[0, i]
 for j in range(1, w):
  pixel = im_pixel[j, i]
  # 不是纯色的线,则记录 scan_start_y 的值,准备跳出循环
  if pixel != last_pixel:
  scan_start_y = i - 50
  break
 if scan_start_y:
  break
 print('scan_start_y: {}'.format(scan_start_y))

 # 从 scan_start_y 开始往下扫描,棋子应位于屏幕上半部分,这里暂定不超过 2/3
 for i in range(scan_start_y, int(h * 2 / 3)):
 # 横坐标方面也减少了一部分扫描开销
 for j in range(scan_x_border, w - scan_x_border):
  pixel = im_pixel[j, i]
  # 根据棋子的最低行的颜色判断,找最后一行那些点的平均值,这个颜
  # 色这样应该 OK,暂时不提出来
  if (50 < pixel[0] < 60) \
   and (53 < pixel[1] < 63) \
   and (95 < pixel[2] < 110):
  piece_x_sum += j
  piece_x_c += 1
  piece_y_max = max(i, piece_y_max)

 if not all((piece_x_sum, piece_x_c)):
 return 0, 0, 0, 0
 piece_x = int(piece_x_sum / piece_x_c)
 piece_y = piece_y_max - piece_base_height_1_2 # 上移棋子底盘高度的一半

遍历过程动态演示

python微信跳一跳系列之棋子定位像素遍历

实际运行动画

以下是实际运行的定位动画。

python微信跳一跳系列之棋子定位像素遍历

优缺点分析

像素遍历的好处是无需额外的python库,但其速度显然明显低于我在前面用过的其它方法,这不奇怪,外接库用到的颜色识别方法其实是经过优化和集成的,像素遍历是其底层的技术方案,速度慢理所当然。

改进

其实上述方法还可以进一步优化,以大大减小遍历的面积:

  • 以50像素为间隔从1/3高度开始遍历;
  • 当首次满足给定的棋子颜色时,记录x值的和与个数,平均后得到棋子的x值;
  • 沿x值从上向下对高度进行遍历,可以得到满足棋子颜色的最大y值和最小y值;
  • 对y值进行处理,如减去一个固定高度,即可得到棋子的底部中心y值;
  • 对最高点和最低点进行平均,即可得到棋盘的中心y值。

遍历的过程如下:

python微信跳一跳系列之棋子定位像素遍历

后记

可以看到,优化后的遍历个数大大减小,速度得到极大提高。

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

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

Python 相关文章推荐
详解Python核心对象类型字符串
Feb 11 Python
python 将md5转为16字节的方法
May 29 Python
python使用epoll实现服务端的方法
Oct 16 Python
Python 支付整合开发包的实现
Jan 23 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
python函数修饰符@的使用方法解析
Sep 02 Python
python GUI库图形界面开发之PyQt5 Qt Designer工具(Qt设计师)详细使用方法及Designer ui文件转py文件方法
Feb 26 Python
Python如何使用OS模块调用cmd
Feb 27 Python
django 数据库 get_or_create函数返回值是tuple的问题
May 15 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
关于多种方式完美解决Python pip命令下载第三方库的问题
Dec 21 Python
opencv实现图像几何变换
Mar 24 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
Feb 26 #Python
python微信跳一跳系列之自动计算跳一跳距离
Feb 26 #Python
python微信跳一跳系列之色块轮廓定位棋盘
Feb 26 #Python
tensorflow入门之训练简单的神经网络方法
Feb 26 #Python
基于Python实现的微信好友数据分析
Feb 26 #Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 #Python
使用django-crontab实现定时任务的示例
Feb 26 #Python
You might like
详解PHP的Yii框架中自带的前端资源包的使用
2016/03/31 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP 传输会话curl函数的实例详解
2017/09/12 PHP
jquery 图片预加载 自动等比例缩放插件
2008/12/25 Javascript
javascript 同时在IE和FireFox获取KeyCode的代码
2010/02/07 Javascript
jquery实现的元素的left增加N像素 鼠标移开会慢慢的移动到原来的位置
2010/03/21 Javascript
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
JavaScript继承方式实例
2010/10/29 Javascript
文本框根据输入内容自适应高度的代码
2011/10/24 Javascript
Javascript生成json的函数代码(可以用php的json_decode解码)
2012/06/11 Javascript
5秒后跳转效果(setInterval/SetTimeOut)
2013/05/03 Javascript
JavaScript格式化日期时间的方法和自定义格式化函数示例
2014/04/04 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
基于RequireJS和JQuery的模块化编程日常问题解析
2016/04/14 Javascript
Bootstrap和Java分页实例第二篇
2016/12/23 Javascript
微信小程序搜索组件wxSearch实例详解
2017/06/08 Javascript
ES6知识点整理之模块化的应用详解
2019/04/15 Javascript
微信小程序实现页面监听自定义组件的触发事件
2020/11/01 Javascript
js实现日历
2020/11/07 Javascript
wxpython 学习笔记 第一天
2009/02/09 Python
python使用beautifulsoup从爱奇艺网抓取视频播放
2014/01/23 Python
python文件特定行插入和替换实例详解
2017/07/12 Python
Python 函数基础知识汇总
2018/03/09 Python
基于pandas数据样本行列选取的方法
2018/04/20 Python
使用Python微信库itchat获得好友和群组已撤回的消息
2018/06/24 Python
Python3.5文件读与写操作经典实例详解
2019/05/01 Python
python中类的输出或类的实例输出为这种形式的原因
2019/08/12 Python
python 动态调用函数实例解析
2019/10/21 Python
python单向循环链表原理与实现方法示例
2019/12/03 Python
Django 解决阿里云部署同步数据库报错的问题
2020/05/14 Python
python中如何打包用户自定义模块
2020/09/23 Python
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
戛纳奢侈品商店:Jacques Loup法国
2019/11/04 全球购物
2014年度个人工作总结范文
2015/03/09 职场文书
简单的辞职信范文(2016最新版)
2015/05/12 职场文书
新闻简讯格式及范文
2015/07/22 职场文书