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中元组,列表,字典的区别
May 21 Python
Python实现将照片变成卡通图片的方法【基于opencv】
Jan 17 Python
Python基本数据结构与用法详解【列表、元组、集合、字典】
Mar 23 Python
Django Rest framework权限的详细用法
Jul 25 Python
pytorch使用指定GPU训练的实例
Aug 19 Python
Django1.11自带分页器paginator的使用方法
Oct 31 Python
python Popen 获取输出,等待运行完成示例
Dec 30 Python
Python多进程编程multiprocessing代码实例
Mar 12 Python
matlab 计算灰度图像的一阶矩,二阶矩,三阶矩实例
Apr 22 Python
python类共享变量操作
Sep 03 Python
python 实现的截屏工具
May 08 Python
Python数据处理的三个实用技巧分享
Apr 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
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
php array_map array_multisort 高效处理多维数组排序
2009/06/11 PHP
需要注意的几个PHP漏洞小结
2012/02/05 PHP
解析PHP实现下载文件的两种方法
2013/07/05 PHP
修改destoon会员公司的伪静态中的com目录的方法
2014/08/21 PHP
PHP+JS实现的商品秒杀倒计时用法示例
2016/11/15 PHP
PHP开发api接口安全验证操作实例详解
2020/03/26 PHP
javascript知识点收藏
2007/02/22 Javascript
JavaScript实现Sleep函数的代码
2007/03/04 Javascript
使用Json比用string返回数据更友好,也更面向对象一些
2011/09/13 Javascript
js实现完全自定义可带多级目录的网页鼠标右键菜单方法
2015/02/28 Javascript
AngularJS中的过滤器filter用法完全解析
2016/04/22 Javascript
jQuery实现级联下拉框实战(5)
2017/02/08 Javascript
Node.js实现连接mysql数据库功能示例
2017/09/15 Javascript
浅谈Vue数据绑定的原理
2018/01/08 Javascript
详解Element 指令clickoutside源码分析
2019/02/15 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
微信小程序开发实现的选项卡(窗口顶部/底部TabBar)页面切换功能图文详解
2019/05/14 Javascript
vue设置动态请求地址的例子
2019/11/01 Javascript
Vue实现购物车基本功能
2020/11/08 Javascript
[02:09]2018DOTA2亚洲邀请赛TNC赛前采访
2018/04/04 DOTA
删除目录下相同文件的python代码(逐级优化)
2012/05/25 Python
利用Python如何生成hash值示例详解
2017/12/20 Python
python支付宝支付示例详解
2019/08/22 Python
python通过SSH登陆linux并操作的实现
2019/10/10 Python
Python基础之高级变量类型实例详解
2020/01/03 Python
python通过opencv实现图片裁剪原理解析
2020/01/19 Python
CSS3自定义滚动条样式的示例代码
2017/08/21 HTML / CSS
瑞典领先的汽车零部件网上零售商:bildelaronline24.se
2017/01/12 全球购物
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
什么是静态路由?什么是动态路由?各自的特点是什么?
2015/09/16 面试题
MYSQL支持事务吗
2013/08/09 面试题
酒店大堂副理的职责范文
2014/02/13 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
《中国机长》观后感:敬畏生命,敬畏职责
2019/11/12 职场文书