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中的字典容器
Apr 14 Python
为Python程序添加图形化界面的教程
Apr 29 Python
python正则表达式的使用
Jun 12 Python
Python3.4 splinter(模拟填写表单)使用方法
Oct 13 Python
python实现集中式的病毒扫描功能详解
Jul 09 Python
Python将主机名转换为IP地址的方法
Aug 14 Python
Python ini文件常用操作方法解析
Apr 26 Python
获取python运行输出的数据并解析存为dataFrame实例
Jul 07 Python
django有哪些好处和优点
Sep 01 Python
Django url 路由匹配过程详解
Jan 22 Python
Django一小时写出账号密码管理系统
Apr 29 Python
Python字典的基础操作
Nov 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提取字符串中网站url地址的方法
2014/12/03 PHP
PHP读书笔记_运算符详解
2016/07/01 PHP
Laravel重定向,a链接跳转,控制器跳转示例
2019/10/22 PHP
javascript KeyDown、KeyPress和KeyUp事件的区别与联系
2009/12/03 Javascript
javascript数字数组去重复项的实现代码
2010/12/30 Javascript
jquery表单验证使用插件formValidator
2012/11/10 Javascript
jquery实现手机发送验证码的倒计时代码
2014/02/12 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
Angular 2应用的8个主要构造块有哪些
2016/10/17 Javascript
简单的vue-resourse获取json并应用到模板示例
2017/02/10 Javascript
Bootstrap Tree View简单而优雅的树结构组件实例解析
2017/06/15 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
JS 验证码功能的三种实现方式
2018/11/26 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
微信小程序实现单列下拉菜单效果
2019/04/25 Javascript
Vue如何实现监听组件原生事件
2020/07/03 Javascript
Python 爬虫图片简单实现
2017/06/01 Python
Python设计模式之代理模式简单示例
2018/01/09 Python
教你用一行Python代码实现并行任务(附代码)
2018/02/02 Python
Django实现单用户登录的方法示例
2019/03/28 Python
Python绘制频率分布直方图的示例
2019/07/08 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
HTML5和以前HTML4的区别整理
2013/10/20 HTML / CSS
Original Penguin英国官方网站:美国著名休闲时装品牌
2016/10/30 全球购物
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
全球最受追捧的运动服品牌领先数字目的地:Stylerunner
2020/11/25 全球购物
大学生职业生涯规划范文
2014/01/22 职场文书
电力安全事故反思
2014/04/27 职场文书
服装设计专业自荐信
2014/06/17 职场文书
2014年车间主任工作总结
2014/12/10 职场文书
先进个人事迹材料
2014/12/29 职场文书
辛亥革命观后感
2015/06/02 职场文书
2015年圣诞节寄语
2015/08/17 职场文书
pytorch分类模型绘制混淆矩阵以及可视化详解
2022/04/07 Python