ホームページ  >  記事  >  テクノロジー周辺機器  >  AI 仮想ジェスチャーで飛行機戦闘をプレイ

AI 仮想ジェスチャーで飛行機戦闘をプレイ

王林
王林転載
2023-05-17 11:34:061257ブラウズ

###こんにちは、みんな。

この小さなプロジェクトを分解して、実装を段階的に説明していきます。記事の最後に、プロジェクトの完全なソース コードを入手します。

1. 航空機戦争プログラムの準備

Github で航空機戦争プログラムの Python バージョンを見つけ、Pygame をインストールして実行します。

AI 仮想ジェスチャーで飛行機戦闘をプレイ

ゲームの操作は簡単で、右上にゲームの一時停止/開始ボタンがあり、マウスでクリックすることで操作できます。

キーボードの A、D、W、S キーは、それぞれ左、右、上、下に対応し、航空機の移動方向を制御するために使用されます。

したがって、AI プログラムは 2 つのコア機能を完了する必要があります。1 つはジェスチャーを認識することであり、2 つ目はジェスチャーをマウスとキーボードの操作に変換してゲームを制御することです。

2. ジェスチャを認識する

ここでは、opencv を使用してカメラからビデオ ストリームを読み取ります。

ビデオ ストリームの各フレームをメディアパイプの手のひら検出モデルに送信して、手のひらの 21 のキー ポイントを識別します。

AI 仮想ジェスチャーで飛行機戦闘をプレイ

私たちのプロジェクトでは、左右の 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 座標がそれぞれ保存されます。

3. ゲームを一時停止するジェスチャー コントロール

人差し指と中指の座標間の距離を計算し、それが一定のしきい値より大きい場合は、マウスを移動して一時停止をクリックします。ゲームボタン。

AI 仮想ジェスチャーで飛行機戦闘をプレイ

ゲーム一時停止

人差し指と中指の座標間の距離が一定のしきい値未満の場合、マウスを移動して開始をクリックします。ゲーム ボタン

AI 仮想ジェスチャーで飛行機戦闘をプレイ

ゲーム スタート

距離の計算は非常に簡単です。コードはここには投稿しません。焦点は Python によるマウス制御です。

私は PyUserInput ライブラリを使用します。このライブラリには、マウスとキーボードをそれぞれ制御するための 2 つのクラス PyMouse と PyKeyboard が用意されています。

Python プログラムを使用してゲームの一時停止と開始を制御するには、マウスをボタンの位置に移動してクリック操作を行うだけです。

# 定义鼠标对象
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 関数のパラメータ dist は、人差し指と中指の間の距離です。

一時停止/開始ボタンの座標は (915, 125) です。各コンピュータの座標は異なります。実際の状況に応じて再計算する必要があります。

計算の考え方は非常に単純です。ゲームの境界サイズは (480, 700) で、ゲームは画面の中央から開始されます。画面のサイズが得られれば、座標はボタンの数は大まかに見積もることができます。 PyMouse の move 関数を呼び出した後、確認して微調整します。

PyMouse の move 関数はマウスの位置を移動するために使用され、click 関数はマウスのクリック操作を実行するために使用されます。

4. 航空機の動きのジェスチャー制御

ここでは、隣接する 2 つのフレームにおける人差し指の x 座標と y 座標の移動方向と距離を計算する必要があります。これにより、キーボード 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 関数の間で、キーの持続時間を制御するために time.sleep(press_dwell) が呼び出されます。キーを長く押すと、機体の移動距離が長くなります。逆に、キー時間が短い場合、航空機の移動距離は短くなります。

したがって、ここでの困難は、人差し指の移動距離をキーを押している時間にどのようにマッピングするかということです。

次のコードを使用して測定しました

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

固定キーの継続時間は 0.05 秒で、テスト航空機は中央から左端に移動します。これには最小の n が必要です。

AI 仮想ジェスチャーで飛行機戦闘をプレイ

機体は中央から左端に移動し、移動距離は 240 です。したがって、1 回あたりの機体の移動距離は 240 / (n * 0.05) となります。 2番。

n=7 を測定したため、航空機の 1 秒あたりの移動距離は 685.7142857 となります。

人差し指の移動距離を計算して 685.7142857 で割れば、キーボードのキーの長さを求めることができます。

航空機の動きのジェスチャー制御の完全なコードは次のとおりです:

def press_key_board(self, direction, move_dist):
"""
将手指移动距离,换算为按键间隔,并执行按键操作
: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)

プロジェクトの中核部分は説明され、完全なコードは整理されました。必要な場合は、そのままにしておいてください。コメント欄にメッセージを。

コードを取得したら、まず実行中のsteps.txtを確認します。

この記事が役に立ったと思われる場合は、「読む」をクリックして励みにしてください。今後も優れた Python AI プロジェクトを共有していきます。

以上がAI 仮想ジェスチャーで飛行機戦闘をプレイの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事は51cto.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。