前言
在前幾篇部落格中,分別就棋子的顏色識別、模板匹配等定位方式進行了介紹和實踐,這一篇部落格就來驗證一下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( 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 微信跳一跳Python
1 安裝python,我用的是python2.7 5.安裝pillow,放在scripts資料夾中,通過 pip install pillow安裝 6.安裝adb工具包,可以直接放在專案 的資料夾裡面,或者放在c盤目錄不過要配置一下環境變數,我這裡是直接放在專案 資料夾中。內建了cmd 命令 7.把...
python 微信跳一跳
因為是基於python的指令碼所以要先安裝python 這裡有教程 點選這裡 安裝好之後開始下面的操作 這裡是對adb的解釋 2.安裝好之後將安裝路徑配置到環境變數中 注意 路徑後加 英文格式的 號,例如d adb 3.快捷鍵win r開啟cmd win鍵即ctrl和alt中間那個鍵 輸入 adb出...
微信跳一跳輔助
background pos distance to time ratio 1.35 screenshot path tempfile.gettempdir screenshot.png def calculate jump distance im image.open screenshot pat...