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 requests库编码 socks5代理的问题
May 07 Python
基于Python3.6+splinter实现自动抢火车票
Sep 25 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
Nov 29 Python
Python设计模式之迭代器模式原理与用法实例分析
Jan 10 Python
python设置环境变量的原因和方法
Jun 24 Python
详解用pyecharts Geo实现动态数据热力图城市找不到问题解决
Jun 26 Python
python快速编写单行注释多行注释的方法
Jul 31 Python
python要安装在哪个盘
Jun 15 Python
PyQt5多线程防卡死和多窗口用法的实现
Sep 15 Python
使用Python webdriver图书馆抢座自动预约的正确方法
Mar 04 Python
详解Python中的进程和线程
Jun 23 Python
Python合并pdf文件的工具
Jul 01 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禁止页面缓存的代码
2011/10/23 PHP
ajax在joomla中的原生态应用代码
2012/07/19 PHP
slice函数的用法 之不错的应用
2006/12/29 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
javascript 事件绑定问题
2011/01/01 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
js父页面与子页面不同时显示的方法
2014/10/16 Javascript
JavaScript中的对象序列化介绍
2014/12/30 Javascript
js实现使用鼠标拖拽切换图片的方法
2015/05/04 Javascript
JavaScript的面向对象编程基础
2015/08/13 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
JavaScript实现的select点菜功能示例
2017/01/16 Javascript
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
JS事件循环机制event loop宏任务微任务原理解析
2020/08/04 Javascript
[49:02]KG vs Infamous 2019国际邀请赛淘汰赛 败者组BO1 8.20.mp4
2020/07/19 DOTA
Python IDE PyCharm的基本快捷键和配置简介
2015/11/04 Python
机器学习经典算法-logistic回归代码详解
2017/12/22 Python
django小技巧之html模板中调用对象属性或对象的方法
2018/11/30 Python
对Python 语音识别框架详解
2018/12/24 Python
Python 普通最小二乘法(OLS)进行多项式拟合的方法
2018/12/29 Python
python统计中文字符数量的两种方法
2019/01/31 Python
详解利用Python scipy.signal.filtfilt() 实现信号滤波
2019/06/05 Python
Python基于Opencv来快速实现人脸识别过程详解(完整版)
2019/07/11 Python
Python 实现文件读写、坐标寻址、查找替换功能
2019/09/11 Python
Python关于反射的实例代码分享
2020/02/20 Python
Python3 pickle对象串行化代码实例解析
2020/03/23 Python
在keras中model.fit_generator()和model.fit()的区别说明
2020/06/17 Python
python 删除excel表格重复行,数据预处理操作
2020/07/06 Python
python中翻译功能translate模块实现方法
2020/12/17 Python
JD Sports西班牙:英国领先的运动服装公司
2020/01/06 全球购物
西班牙在线药店:DosFarma
2020/03/28 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
简历的个人自我评价范文
2014/01/03 职场文书
2014年党员创先争优承诺书
2014/05/29 职场文书
卫生院艾滋病宣传活动总结
2015/05/09 职场文书
vue实现省市区联动 element-china-area-data插件
2022/04/22 Vue.js