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之集成开发环境(IDE)
Sep 12 Python
python实现udp数据报传输的方法
Sep 26 Python
Python中的十大图像处理工具(小结)
Jun 10 Python
python代理工具mitmproxy使用指南
Jul 04 Python
Python 函数绘图及函数图像微分与积分
Nov 20 Python
Python实现桌面翻译工具【新手必学】
Feb 12 Python
python常用运维脚本实例小结
Feb 14 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
Feb 28 Python
python实现TCP文件传输
Mar 20 Python
Django ORM实现按天获取数据去重求和例子
May 18 Python
史上最详细的Python打包成exe文件教程
Jan 17 Python
Pytorch自定义Dataset和DataLoader去除不存在和空数据的操作
Mar 03 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
mysql 性能的检查和优化方法
2009/06/21 PHP
PHP输入输出流学习笔记
2015/05/12 PHP
laravel 中如何使用ajax和vue总结
2017/08/16 PHP
js中的escape及unescape函数的php实现代码
2007/09/04 Javascript
BOM与DOM的区别分析
2010/10/26 Javascript
jquery实现图片灯箱明暗的遮罩效果
2013/11/15 Javascript
jQuery中:password选择器用法实例
2015/01/03 Javascript
自定义刻度jQuery进度条及插件
2015/09/02 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
HTML页面定时跳转方法解析(2种任选)
2016/12/22 Javascript
详解angular2实现ng2-router 路由和嵌套路由
2017/03/24 Javascript
详解vue中使用express+fetch获取本地json文件
2017/10/10 Javascript
React.Js添加与删除onScroll事件的方法详解
2017/11/03 Javascript
vue.js开发实现全局调用的MessageBox组件实例代码
2017/11/22 Javascript
Node.js中你不可不精的Stream(流)
2018/06/08 Javascript
webpack分离css单独打包的方法
2018/06/12 Javascript
微信小程序dom操作的替代思路实例分析
2018/12/06 Javascript
layui实现多图片上传并限制上传的图片数量
2019/09/26 Javascript
用实例分析Python中method的参数传递过程
2015/04/02 Python
给Python初学者的一些编程技巧
2015/04/03 Python
Python入门学习之字符串与比较运算符
2015/10/12 Python
python如何求解两数的最大公约数
2018/09/27 Python
对Python random模块打乱数组顺序的实例讲解
2018/11/08 Python
Python3.4学习笔记之类型判断,异常处理,终止程序操作小结
2019/03/01 Python
对python3中的RE(正则表达式)-详细总结
2019/07/23 Python
基于Tensorflow高阶读写教程
2020/02/10 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
2021/01/29 Python
详解CSS3选择器:nth-child和:nth-of-type之间的差异
2017/09/18 HTML / CSS
Html5百叶窗效果的示例代码
2017/12/11 HTML / CSS
廉价连衣裙和婚纱礼服在线销售:Tbdress
2019/02/28 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
高中班长自我鉴定
2013/12/20 职场文书
防火标语大全
2014/10/06 职场文书
酒店员工管理制度
2015/08/05 职场文书
如何判断pytorch是否支持GPU加速
2021/06/01 Python
SpringDataJPA实体类关系映射配置方式
2021/12/06 Java/Android