python微信跳一跳系列之棋子定位像素遍历

作者:艾克思工作室 时间:2023-11-04 01:27:47 

前言

在前几篇博客中,分别就棋子的颜色识别、模板匹配等定位方式进行了介绍和实践,这一篇博客就来验证一下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微信跳一跳系列之棋子定位像素遍历

后记

可以看到,优化后的遍历个数大大减小,速度得到极大提高。

更多内容大家可以参考专题《微信跳一跳》进行学习。

来源:http://blog.csdn.net/m0_37606112/article/details/79205262

标签:python,微信,跳一跳
0
投稿

猜你喜欢

  • 图文详解laravel多对多关联模型

    2023-06-12 22:21:34
  • 对python requests发送json格式数据的实例详解

    2023-12-11 05:16:07
  • pandas抽取行列数据的几种方法

    2022-06-19 09:32:16
  • 22个HTML5的初级技巧

    2010-12-17 12:39:00
  • 一文带你了解Go语言中接口的使用

    2024-02-20 04:01:34
  • python浪漫表白源码

    2023-11-22 05:16:39
  • Python+OpenCV读写视频的方法详解

    2023-02-22 08:57:09
  • Discuz7 的提示效果如何实现

    2010-01-13 13:10:00
  • Python协程 yield与协程greenlet简单用法示例

    2023-02-23 04:07:25
  • 回调函数的意义以及python实现实例

    2021-07-17 11:42:07
  • mysql支持跨表delete删除多表记录

    2024-01-27 06:12:29
  • asp用err.raise自定义错误信息

    2007-09-12 19:38:00
  • JS和JQuery实现雪花飘落效果

    2024-04-18 09:51:42
  • Golang设计模式之适配器模式详细讲解

    2024-05-28 15:22:53
  • MAC下Anaconda+Pyspark安装配置详细步骤

    2021-02-11 18:15:51
  • ADSI+ASP添加IP到IIS禁止访问列表中

    2011-04-02 10:42:00
  • 轻松掌握 SQL Server 2000数据库的构架

    2009-02-05 15:50:00
  • 编写自定义的Django模板加载器的简单示例

    2022-07-02 20:06:44
  • OraclePL/SQL单行函数和组函数详解

    2010-07-28 13:02:00
  • Python matplotlib通过plt.scatter画空心圆标记出特定的点方法

    2023-06-26 14:19:03
  • asp之家 网络编程 m.aspxhome.com