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基础教程之Hello World!
Aug 29 Python
Python编写百度贴吧的简单爬虫
Apr 02 Python
用Python编写一个简单的俄罗斯方块游戏的教程
Apr 03 Python
python使用PyCharm进行远程开发和调试
Nov 02 Python
python pandas实现excel转为html格式的方法
Oct 23 Python
Python 一键获取百度网盘提取码的方法
Aug 01 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
pandas DataFrame运算的实现
Jun 14 Python
keras自动编码器实现系列之卷积自动编码器操作
Jul 03 Python
谈谈python垃圾回收机制
Sep 27 Python
Python通过Schema实现数据验证方式
Nov 12 Python
Python激活Anaconda环境变量的详细步骤
Jun 08 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
模拟flock实现文件锁定
2007/02/14 PHP
php带密码功能并下载远程文件保存本地指定目录 修改加强版
2010/05/16 PHP
PHP中soap的用法实例
2014/10/24 PHP
php从完整文件路径中分离文件目录和文件名的方法
2015/03/13 PHP
PHP实现打包zip并下载功能
2018/06/12 PHP
Jquery+ajax请求data显示在GridView上(asp.net)
2010/08/27 Javascript
formStorage 基于jquery的一个插件(存储表单中元素的状态到本地)
2012/01/20 Javascript
Raphael带文本标签可拖动的图形实现代码
2013/02/20 Javascript
js 字符串转换成数字的三种方法
2013/03/23 Javascript
Js日期选择器并自动加入到输入框中示例代码
2013/08/02 Javascript
如何在指定的地方插入html内容和文本内容
2013/12/23 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
javascript实现Email邮件显示与删除功能
2015/11/21 Javascript
jQuery中slidedown与slideup方法用法示例
2016/09/16 Javascript
在Vue项目中使用d3.js的实例代码
2018/05/01 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
浅谈vux之x-input使用以及源码解读
2018/11/04 Javascript
node.JS二进制操作模块buffer对象使用方法详解
2020/02/06 Javascript
js 闭包深入理解与实例分析
2020/03/19 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
[48:37]EG vs OG 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
深入学习Python中的装饰器使用
2016/06/20 Python
pytorch dataloader 取batch_size时候出现bug的解决方式
2020/02/20 Python
Python decorator拦截器代码实例解析
2020/04/04 Python
Python爬虫爬取新闻资讯案例详解
2020/07/14 Python
Python 调用C++封装的进一步探索交流
2021/03/04 Python
CSS3控制HTML元素动画效果
2014/02/08 HTML / CSS
css3实现3D文本悬停改变效果的示例代码
2019/01/16 HTML / CSS
大学生村官工作感言
2014/01/10 职场文书
《威尼斯的小艇》教学反思
2014/02/17 职场文书
政法学院毕业生求职信
2014/02/28 职场文书
2014年初一班主任工作总结
2014/11/08 职场文书
2014年统战工作总结
2014/12/09 职场文书
初中毕业生感言
2015/07/31 职场文书
2016年师德师风学习心得体会
2016/01/12 职场文书
2016年少先队活动总结
2016/04/06 职场文书