国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

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

2020-02-22 23:19:53
字體:
來源:轉載
供稿:網友

前言

在前幾篇博客中,分別就棋子的顏色識別、模板匹配等定位方式進行了介紹和實踐,這一篇博客就來驗證一下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庫,但其速度顯然明顯低于我在前面用過的其它方法,這不奇怪,外接庫用到的顏色識別方法其實是經過優化和集成的,像素遍歷是其底層的技術方案,速度慢理所當然。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 鄂温| 砚山县| 江达县| 云龙县| 长顺县| 北海市| 介休市| 定结县| 石柱| 宜都市| 华安县| 炎陵县| 襄樊市| 沁阳市| 霍邱县| 萍乡市| 永仁县| 云和县| 营山县| 栖霞市| 南召县| 苏尼特右旗| 永嘉县| 岳池县| 汨罗市| 漠河县| 安多县| 日喀则市| 察雅县| 祁门县| 安阳县| 甘肃省| 望城县| 吉林市| 小金县| 墨竹工卡县| 崇文区| 改则县| 清远市| 进贤县| 颍上县|