gpt4 book ai didi

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

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 25 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章python微信跳一跳系列之棋子定位像素遍历由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

前言 。

在前几篇博客中,分别就棋子的颜色识别、模板匹配等定位方式进行了介绍和实践,这一篇博客就来验证一下github中最热门的跳一跳外挂中采用的像素遍历的方法.

方法说明 。

像素遍历的实质依然是颜色识别。 在github中给出的方法中,采用像素遍历的方法是:

  • 从高度的1/3处开始至高度的2/3处进行遍历;
  • 首先间隔50像素进行搜索
  • 当像素的颜色和每一行开始的像素颜色不同时,认为找到了最上面的棋盘位置,则返回上一个间隔处开始遍历(i-50);
  • 对每一行的像素都进行遍历,当满足给定的颜色范围时,记录最下面一行的y值,x值的和与个数,平均即可得到中心x值。
  • 所得到的x值和y值即为棋子最底部的中心位置;
  • 按照自己手机的分辨率调整棋子的高度(减去一个固定值)

上诉方法的代码如下(可以自行到github下载):

python" id="highlighter_105627">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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微信跳一跳系列之棋子定位像素遍历的文章就讲到这里了,如果你想了解更多关于python微信跳一跳系列之棋子定位像素遍历的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com