前言
在前几篇博客中,分别就棋子的颜色识别、模板匹配等定位方式进行了介绍和实践,这一篇博客就来验证一下github中最热门的跳一跳外挂中采用的像素遍历的方法。
方法说明
像素遍历的实质依然是颜色识别。
在github中给出的方法中,采用像素遍历的方法是:
上诉方法的代码如下(可以自行到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 pIEce_x = int(pIEce_x_sum / pIEce_x_c) pIEce_y = pIEce_y_max - pIEce_base_height_1_2 # 上移棋子底盘高度的一半
遍历过程动态演示
实际运行动画
以下是实际运行的定位动画。
优缺点分析
像素遍历的好处是无需额外的python库,但其速度显然明显低于我在前面用过的其它方法,这不奇怪,外接库用到的颜色识别方法其实是经过优化和集成的,像素遍历是其底层的技术方案,速度慢理所当然。
改进
其实上述方法还可以进一步优化,以大大减小遍历的面积:
以50像素为间隔从1/3高度开始遍历; 当首次满足给定的棋子颜色时,记录x值的和与个数,平均后得到棋子的x值; 沿x值从上向下对高度进行遍历,可以得到满足棋子颜色的最大y值和最小y值; 对y值进行处理,如减去一个固定高度,即可得到棋子的底部中心y值; 对最高点和最低点进行平均,即可得到棋盘的中心y值。遍历的过程如下:
后记
可以看到,优化后的遍历个数大大减小,速度得到极大提高。
更多内容大家可以参考专题《微信跳一跳》进行学习。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程小技巧。
您可能感兴趣的文章:教你用 Python 实现微信跳一跳(Mac+iOS版)微信跳一跳游戏python脚本python实现微信跳一跳辅助工具步骤详解微信跳一跳python代码实现微信小程序跳一跳游戏 python脚本跳一跳刷高分技巧微信跳一跳辅助python代码实现微信跳一跳自动运行python脚本微信跳一跳python辅助软件思路及图像识别源码解析微信跳一跳小游戏python脚本python微信跳一跳系列之自动计算跳一跳距离 总结以上是内存溢出为你收集整理的python微信跳一跳系列之棋子定位像素遍历全部内容,希望文章能够帮你解决python微信跳一跳系列之棋子定位像素遍历所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)