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中实现远程调用(RPC、RMI)简单例子
Apr 28 Python
Python isinstance函数介绍
Apr 14 Python
Ubuntu下创建虚拟独立的Python环境全过程
Feb 10 Python
python使用selenium登录QQ邮箱(附带滑动解锁)
Jan 23 Python
PyQt打开保存对话框的方法和使用详解
Feb 27 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
Apr 11 Python
python爬虫 模拟登录人人网过程解析
Jul 31 Python
python opencv实现证件照换底功能
Aug 19 Python
python基于celery实现异步任务周期任务定时任务
Dec 30 Python
PyCharm 专业版安装图文教程
Feb 20 Python
python中的selenium安装的步骤(浏览器自动化测试框架)
Mar 17 Python
pytorch--之halfTensor的使用详解
May 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读取数据库信息的几种方法
2008/05/24 PHP
深入理解PHP原理之Session Gc的一个小概率Notice
2011/04/12 PHP
php empty()与isset()区别的详细介绍
2013/06/17 PHP
PHP写的资源下载防盗链类分享
2014/05/12 PHP
php文件缓存方法总结
2016/03/16 PHP
运用Windows XP附带的Msicuu.exe、Msizap.exe来彻底卸载顽固程序
2007/04/21 Javascript
javascript 无提示关闭窗口脚本
2009/08/17 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
autoPlay 基于jquery的图片自动播放效果
2011/12/07 Javascript
js jquery获取随机生成id的服务器控件的三种方法
2013/07/11 Javascript
javascript异步处理工作机制详解
2015/04/13 Javascript
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
非常优秀的JS图片轮播插件Swiper的用法
2017/01/03 Javascript
利用Js+Css实现折纸动态导航效果实例源码
2017/01/25 Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
2017/06/04 Javascript
详解Vue打包优化之code spliting
2018/04/09 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
vue中使用WX-JSSDK的两种方法(推荐)
2020/01/18 Javascript
Python入门篇之文件
2014/10/20 Python
举例区分Python中的浅复制与深复制
2015/07/02 Python
python虚拟环境virualenv的安装与使用
2016/12/18 Python
详解python里使用正则表达式的分组命名方式
2017/10/24 Python
Python Tkinter模块实现时钟功能应用示例
2018/07/23 Python
浅析Python 抽象工厂模式的优缺点
2020/07/13 Python
html5使用canvas实现图片下载功能的示例代码
2017/08/26 HTML / CSS
北京华建集团SQL面试题
2014/06/03 面试题
Ref与out有什么不同
2012/11/24 面试题
经理职责范文
2013/11/08 职场文书
新闻编辑专业毕业自荐书范文
2014/02/05 职场文书
数学检讨书1000字
2014/02/24 职场文书
出生公证书样本
2014/04/04 职场文书
学党史心得体会
2014/09/05 职场文书
交通安全横幅标语
2014/10/07 职场文书
自我评价优缺点范文
2015/03/11 职场文书
《你在为谁工作》心得体会(共8篇)
2016/01/20 职场文书
vue整合百度地图显示指定地点信息
2022/04/06 Vue.js