python微信跳一跳系列之棋子定位像素遍歷
前言
在前幾篇博客中,分別就棋子的顏色識(shí)別、模板匹配等定位方式進(jìn)行了介紹和實(shí)踐,這一篇博客就來(lái)驗(yàn)證一下github中最熱門(mén)的跳一跳外掛中采用的像素遍歷的方法。
方法說(shuō)明
像素遍歷的實(shí)質(zhì)依然是顏色識(shí)別。
在github中給出的方法中,采用像素遍歷的方法是:
- 從高度的1/3處開(kāi)始至高度的2/3處進(jìn)行遍歷;
- 首先間隔50像素進(jìn)行搜索
- 當(dāng)像素的顏色和每一行開(kāi)始的像素顏色不同時(shí),認(rèn)為找到了最上面的棋盤(pán)位置,則返回上一個(gè)間隔處開(kāi)始遍歷(i-50);
- 對(duì)每一行的像素都進(jìn)行遍歷,當(dāng)滿(mǎn)足給定的顏色范圍時(shí),記錄最下面一行的y值,x值的和與個(gè)數(shù),平均即可得到中心x值。
- 所得到的x值和y值即為棋子最底部的中心位置;
- 按照自己手機(jī)的分辨率調(diào)整棋子的高度(減去一個(gè)固定值)
上訴方法的代碼如下(可以自行到github下載):
def find_piece_and_board(im): #尋找關(guān)鍵坐標(biāo) 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) # 掃描棋子時(shí)的左右邊界 scan_start_y = 0 # 掃描的起始 y 坐標(biāo) im_pixel = im.load() # 以 50px 步長(zhǎng),嘗試探測(cè) 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] # 不是純色的線(xiàn),則記錄 scan_start_y 的值,準(zhǔn)備跳出循環(huán) 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 開(kāi)始往下掃描,棋子應(yīng)位于屏幕上半部分,這里暫定不超過(guò) 2/3 for i in range(scan_start_y, int(h * 2 / 3)): # 橫坐標(biāo)方面也減少了一部分掃描開(kāi)銷(xiāo) for j in range(scan_x_border, w - scan_x_border): pixel = im_pixel[j, i] # 根據(jù)棋子的最低行的顏色判斷,找最后一行那些點(diǎn)的平均值,這個(gè)顏 # 色這樣應(yīng)該 OK,暫時(shí)不提出來(lái) 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 # 上移棋子底盤(pán)高度的一半
遍歷過(guò)程動(dòng)態(tài)演示
實(shí)際運(yùn)行動(dòng)畫(huà)
以下是實(shí)際運(yùn)行的定位動(dòng)畫(huà)。
優(yōu)缺點(diǎn)分析
像素遍歷的好處是無(wú)需額外的python庫(kù),但其速度顯然明顯低于我在前面用過(guò)的其它方法,這不奇怪,外接庫(kù)用到的顏色識(shí)別方法其實(shí)是經(jīng)過(guò)優(yōu)化和集成的,像素遍歷是其底層的技術(shù)方案,速度慢理所當(dāng)然。
改進(jìn)
其實(shí)上述方法還可以進(jìn)一步優(yōu)化,以大大減小遍歷的面積:
- 以50像素為間隔從1/3高度開(kāi)始遍歷;
- 當(dāng)首次滿(mǎn)足給定的棋子顏色時(shí),記錄x值的和與個(gè)數(shù),平均后得到棋子的x值;
- 沿x值從上向下對(duì)高度進(jìn)行遍歷,可以得到滿(mǎn)足棋子顏色的最大y值和最小y值;
- 對(duì)y值進(jìn)行處理,如減去一個(gè)固定高度,即可得到棋子的底部中心y值;
- 對(duì)最高點(diǎn)和最低點(diǎn)進(jìn)行平均,即可得到棋盤(pán)的中心y值。
遍歷的過(guò)程如下:
后記
可以看到,優(yōu)化后的遍歷個(gè)數(shù)大大減小,速度得到極大提高。
更多內(nèi)容大家可以參考專(zhuān)題《微信跳一跳》進(jìn)行學(xué)習(xí)。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Python3實(shí)現(xiàn)取圖片中特定的像素替換指定的顏色示例
- Python+OpenCV圖片局部區(qū)域像素值處理改進(jìn)版詳解
- Python+OpenCV圖片局部區(qū)域像素值處理詳解
- python使用PIL模塊獲取圖片像素點(diǎn)的方法
- Python 處理圖片像素點(diǎn)的實(shí)例
- Python用61行代碼實(shí)現(xiàn)圖片像素化的示例代碼
- Python OpenCV處理圖像之圖像像素點(diǎn)操作
- 用python處理圖片實(shí)現(xiàn)圖像中的像素訪(fǎng)問(wèn)
- python3.6+opencv3.4實(shí)現(xiàn)鼠標(biāo)交互查看圖片像素
- python實(shí)現(xiàn)兩張圖片的像素融合
相關(guān)文章
Python+Tkinter實(shí)現(xiàn)股票K線(xiàn)圖的繪制
K線(xiàn)圖又稱(chēng)蠟燭圖,常用說(shuō)法是“K線(xiàn)”。K線(xiàn)是以每個(gè)分析周期的開(kāi)盤(pán)價(jià)、最高價(jià)、最低價(jià)和收盤(pán)價(jià)繪制而成。本文將利用Python+Tkinter實(shí)現(xiàn)股票K線(xiàn)圖的繪制,需要的可以參考一下2022-08-08Python使用Qt5實(shí)現(xiàn)水平導(dǎo)航欄的示例代碼
本文主要介紹了Python使用Qt5實(shí)現(xiàn)水平導(dǎo)航欄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03詳解python3中tkinter知識(shí)點(diǎn)
本篇文章給大家分享了關(guān)于python3中tkinter的相關(guān)知識(shí)點(diǎn)以及實(shí)例代碼,有興趣的朋友參考下。2018-06-06Python3字符串的常用操作方法之修改方法與大小寫(xiě)字母轉(zhuǎn)化
這篇文章主要介紹了Python3字符串的常用操作方法之修改方法與大小寫(xiě)字母轉(zhuǎn)化,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-09-09解讀Tensorflow2.0訓(xùn)練損失值降低,但測(cè)試正確率基本不變的情況
這篇文章主要介紹了Tensorflow2.0訓(xùn)練損失值降低,但測(cè)試正確率基本不變的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-06-06Tensorflow中的placeholder和feed_dict的使用
這篇文章主要介紹了Tensorflow中的placeholder和feed_dict的使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-07-07Python面向?qū)ο笾涌?、抽象?lèi)與多態(tài)詳解
這篇文章主要介紹了Python面向?qū)ο笾涌?、抽象?lèi)與多態(tài),結(jié)合實(shí)例形式詳細(xì)分析了Python面向?qū)ο笾薪涌?、抽象?lèi)及多態(tài)的概念、用法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2018-08-08Python多線(xiàn)程編程(二):?jiǎn)?dòng)線(xiàn)程的兩種方法
這篇文章主要介紹了Python多線(xiàn)程編程(一):?jiǎn)?dòng)線(xiàn)程的兩種方法,本文講解了將函數(shù)傳遞進(jìn)Thread對(duì)象、繼承自threading.Thread類(lèi)兩種方法,需要的朋友可以參考下2015-04-04