AI虛擬手勢(shì)玩飛機(jī)大戰(zhàn)
哈嘍,大家好。
下面我們分解一下這個(gè)小項(xiàng)目,帶大家來一步一步實(shí)現(xiàn),文末獲取項(xiàng)目完整的源代碼。
1. 準(zhǔn)備飛機(jī)大戰(zhàn)程序
Github?上找到一個(gè)Python?版本的飛機(jī)大戰(zhàn)程序,安裝Pygame即可運(yùn)行。
游戲操作簡(jiǎn)單,右上角是游戲暫停/開始按鈕,用鼠標(biāo)點(diǎn)擊操作。
鍵盤的A、D、W、S?鍵用來控制飛機(jī)的移動(dòng)方向,分別對(duì)應(yīng)左、右、上、下。
所以我們的AI程序要完成兩個(gè)最核心的功能,第一,識(shí)別手勢(shì);第二,將手勢(shì)轉(zhuǎn)換成鼠標(biāo)、鍵盤操作,便可控制游戲。
2. 識(shí)別手勢(shì)
這里,我們用opencv讀取攝像頭中的視頻流。
將視頻流中的每一幀送入mediapipe中的手掌檢測(cè)模型,識(shí)別手掌 21 個(gè)關(guān)鍵點(diǎn)。
在我們的項(xiàng)目中,只用到了食指和中指,也就是左右中的第8和第12個(gè)點(diǎn)。
核心代碼如下:
frame?是視頻流中的每一幀,hands是手掌檢測(cè)模型。
解析出來的finger_axis_8和finger_axis_12?兩個(gè)對(duì)象中分別存放食指和中指的x、y坐標(biāo)。
3. 手勢(shì)控制游戲暫停
計(jì)算食指與中指坐標(biāo)之間的距離,大于某個(gè)閾值,則移動(dòng)鼠標(biāo),點(diǎn)擊暫停游戲按鈕。
游戲暫停
若食指與中指坐標(biāo)之間的距離,小于某個(gè)閾值,則移動(dòng)鼠標(biāo),點(diǎn)擊開始游戲按鈕
游戲開始
距離計(jì)算很簡(jiǎn)單,這里不貼代碼了,重點(diǎn)說下Python控制鼠標(biāo)。
我用的是PyUserInput?庫(kù),它提供了PyMouse和PyKeyboard兩個(gè)類,分別控制鼠標(biāo)和鍵盤。
當(dāng)我們想用Python程序控制游戲的暫停與開始,只需要將鼠標(biāo)移動(dòng)到按鈕的位置,執(zhí)行一次點(diǎn)擊操作即可。
pause_or_start_game?函數(shù)的參數(shù)dist是食指與中指之間的距離。
暫停/開始按鈕的坐標(biāo)為(915, 125),每個(gè)電腦坐標(biāo)不一樣,需要大家根據(jù)自己的實(shí)際情況重新計(jì)算。
計(jì)算思路很簡(jiǎn)單,游戲邊框大小為(480, 700)?,游戲在屏幕正中間啟動(dòng),只要獲取到屏幕的尺寸,就能大概估算出按鈕的坐標(biāo)。在調(diào)用PyMouse的move函數(shù),檢驗(yàn)、微調(diào)一下即可。
PyMouse的move?函數(shù)用來移動(dòng)鼠標(biāo)位置,click函數(shù)用來執(zhí)行鼠標(biāo)點(diǎn)擊操作。
4. 手勢(shì)控制飛機(jī)移動(dòng)
這里,需要計(jì)算相鄰兩幀食指的x?坐標(biāo)和y?坐標(biāo)的移動(dòng)方向和距離。從而決定按下鍵盤A、D、W、S中的哪一個(gè)。
同樣的,移動(dòng)的方向和距離很簡(jiǎn)單,這里也不說了,重點(diǎn)說下PyKeyboard模塊控制鍵盤按鍵。
press_key和release_key?函數(shù)之間,調(diào)用了time.sleep(press_dwell)控制按鍵的時(shí)長(zhǎng),按鍵時(shí)間長(zhǎng),則飛機(jī)移動(dòng)距離就長(zhǎng),反之,按鍵時(shí)間短,則飛機(jī)移動(dòng)距離就短。
所以,這里的難點(diǎn)在于如何將食指的移動(dòng)距離映射為按鍵的時(shí)長(zhǎng)。
我用的是下面這段代碼測(cè)出來
固定按鍵時(shí)長(zhǎng)為0.05秒,測(cè)試飛機(jī)從中部移動(dòng)到最左邊,需要的最小的n。
飛機(jī)從中部移動(dòng)到最左邊,移動(dòng)距離為 240,因此,240 / (n * 0.05)便是飛機(jī)每秒的移動(dòng)距離。
我測(cè)出來的n=7?,因此,飛機(jī)每秒移動(dòng)距離為685.7142857。
只要計(jì)算出食指的移動(dòng)距離,除以685.7142857,就可以得出鍵盤的按鍵時(shí)長(zhǎng)。
手勢(shì)控制飛機(jī)移動(dòng)的完整代碼為:
項(xiàng)目的核心部分已經(jīng)講解完畢,完整代碼已經(jīng)整理好,需要的朋友評(píng)論區(qū)留言即可。
獲取代碼后,先看運(yùn)行步驟.txt。
如果大家覺得本文對(duì)你有用就點(diǎn)個(gè) 在看 鼓勵(lì)一下吧,后續(xù)我會(huì)持續(xù)分享優(yōu)秀的 Python+AI 項(xiàng)目。