自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

AI虛擬手勢玩飛機大戰(zhàn)

人工智能
計算思路很簡單,游戲邊框大小為(480, 700),游戲在屏幕正中間啟動,只要獲取到屏幕的尺寸,就能大概估算出按鈕的坐標(biāo)。在調(diào)用PyMouse的move函數(shù),檢驗、微調(diào)一下即可。

哈嘍,大家好。

下面我們分解一下這個小項目,帶大家來一步一步實現(xiàn),文末獲取項目完整的源代碼。

1. 準(zhǔn)備飛機大戰(zhàn)程序

Github?上找到一個Python?版本的飛機大戰(zhàn)程序,安裝Pygame即可運行。

圖片

游戲操作簡單,右上角是游戲暫停/開始按鈕,用鼠標(biāo)點擊操作。

鍵盤的A、D、W、S?鍵用來控制飛機的移動方向,分別對應(yīng)左、右、上、下。

所以我們的AI程序要完成兩個最核心的功能,第一,識別手勢;第二,將手勢轉(zhuǎn)換成鼠標(biāo)、鍵盤操作,便可控制游戲。

2. 識別手勢

這里,我們用opencv讀取攝像頭中的視頻流。

將視頻流中的每一幀送入mediapipe中的手掌檢測模型,識別手掌 21 個關(guān)鍵點。

圖片

在我們的項目中,只用到了食指和中指,也就是左右中的第8和第12個點。

核心代碼如下:

ret, frame = cap.read()
results = hands.process(frame[:, :, ::-1])
if results.multi_hand_landmarks:
# 遍歷每個手掌
for hand_landmarks in results.multi_hand_landmarks:
finger_axis_8 = hand_landmarks.landmark[8]
finger_axis_12 = hand_landmarks.landmark[12]

frame?是視頻流中的每一幀,hands是手掌檢測模型。

解析出來的finger_axis_8和finger_axis_12?兩個對象中分別存放食指和中指的x、y坐標(biāo)。

3. 手勢控制游戲暫停

計算食指與中指坐標(biāo)之間的距離,大于某個閾值,則移動鼠標(biāo),點擊暫停游戲按鈕。

圖片

游戲暫停

若食指與中指坐標(biāo)之間的距離,小于某個閾值,則移動鼠標(biāo),點擊開始游戲按鈕

圖片

游戲開始

距離計算很簡單,這里不貼代碼了,重點說下Python控制鼠標(biāo)。

我用的是PyUserInput?庫,它提供了PyMouse和PyKeyboard兩個類,分別控制鼠標(biāo)和鍵盤。

當(dāng)我們想用Python程序控制游戲的暫停與開始,只需要將鼠標(biāo)移動到按鈕的位置,執(zhí)行一次點擊操作即可。

# 定義鼠標(biāo)對象
self.mouse = PyMouse()

def pause_or_start_game(self, dist):
"""
判斷是否需要暫停(開始)游戲
:param dist:
:return:
"""
if (not self.is_pause and dist > 80) or (self.is_pause and dist < 80):
self.mouse.move(915, 125)
self.mouse.click(915, 125)

self.is_pause = not self.is_pause

pause_or_start_game?函數(shù)的參數(shù)dist是食指與中指之間的距離。

暫停/開始按鈕的坐標(biāo)為(915, 125),每個電腦坐標(biāo)不一樣,需要大家根據(jù)自己的實際情況重新計算。

計算思路很簡單,游戲邊框大小為(480, 700)?,游戲在屏幕正中間啟動,只要獲取到屏幕的尺寸,就能大概估算出按鈕的坐標(biāo)。在調(diào)用PyMouse的move函數(shù),檢驗、微調(diào)一下即可。

PyMouse的move?函數(shù)用來移動鼠標(biāo)位置,click函數(shù)用來執(zhí)行鼠標(biāo)點擊操作。

4. 手勢控制飛機移動

這里,需要計算相鄰兩幀食指的x?坐標(biāo)和y?坐標(biāo)的移動方向和距離。從而決定按下鍵盤A、D、W、S中的哪一個。

同樣的,移動的方向和距離很簡單,這里也不說了,重點說下PyKeyboard模塊控制鍵盤按鍵。

self.key_board = PyKeyboard()
# 按下按鍵
self.key_board.press_key(key)
# 停留一段時間
time.sleep(press_dwell)
# 釋放按鍵
self.key_board.release_key(key)

press_key和release_key?函數(shù)之間,調(diào)用了time.sleep(press_dwell)控制按鍵的時長,按鍵時間長,則飛機移動距離就長,反之,按鍵時間短,則飛機移動距離就短。

所以,這里的難點在于如何將食指的移動距離映射為按鍵的時長。

我用的是下面這段代碼測出來

for i in range(n):
kb.press_key('A')
time.sleep(0.05)
kb.release_key('A')

固定按鍵時長為0.05秒,測試飛機從中部移動到最左邊,需要的最小的n。

圖片

飛機從中部移動到最左邊,移動距離為 240,因此,240 / (n * 0.05)便是飛機每秒的移動距離。

我測出來的n=7?,因此,飛機每秒移動距離為685.7142857。

只要計算出食指的移動距離,除以685.7142857,就可以得出鍵盤的按鍵時長。

手勢控制飛機移動的完整代碼為:

def press_key_board(self, direction, move_dist):
"""
將手指移動距離,換算為按鍵間隔,并執(zhí)行按鍵操作
:param direction:移動方向
:param move_dist:移動距離
:return:
"""
dist_per_sec = 685.7142857
if direction == 'x':
key = 'A' if move_dist < 0 else 'D'
elif direction == 'y':
key = 'W' if move_dist < 0 else 'S'
else:
return

press_dwell = math.fabs(move_dist / dist_per_sec)
self.key_board.press_key(key)
time.sleep(press_dwell)
self.key_board.release_key(key)

項目的核心部分已經(jīng)講解完畢,完整代碼已經(jīng)整理好,需要的朋友評論區(qū)留言即可。

獲取代碼后,先看運行步驟.txt。

如果大家覺得本文對你有用就點個 在看 鼓勵一下吧,后續(xù)我會持續(xù)分享優(yōu)秀的 Python+AI 項目。

責(zé)任編輯:武曉燕 來源: 渡碼
相關(guān)推薦

2014-04-25 10:52:35

2022-07-01 16:55:17

調(diào)試板子手勢操作

2023-07-06 08:41:20

TTS?Mac?系統(tǒng)

2024-07-31 15:44:06

2019-10-17 21:37:28

微信飛機大戰(zhàn)Python

2014-12-05 10:25:18

2013-09-09 18:21:14

2020-10-06 15:59:38

AI

2023-02-13 18:32:59

AI繪畫

2020-05-15 10:52:41

大數(shù)據(jù)人工智能技術(shù)

2013-09-03 10:18:16

虛擬網(wǎng)絡(luò)VMware思科

2017-01-06 10:16:03

AI人工智能

2022-04-12 09:21:50

AIPython自動駕駛

2012-11-12 16:47:56

2009-05-31 18:55:35

虛擬化UnixHyper-V

2011-10-29 21:25:56

虛擬化虛擬機windows

2019-02-13 10:44:36

2023-02-28 14:57:02

MetaAI

2012-11-05 09:37:39

虛擬化
點贊
收藏

51CTO技術(shù)棧公眾號