ホームページ >テクノロジー周辺機器 >AI >AI 仮想ジェスチャーで飛行機戦闘をプレイ
###こんにちは、みんな。
この小さなプロジェクトを分解して、実装を段階的に説明していきます。記事の最後に、プロジェクトの完全なソース コードを入手します。 1. 航空機戦争プログラムの準備Github で航空機戦争プログラムの Python バージョンを見つけ、Pygame をインストールして実行します。 ゲームの操作は簡単で、右上にゲームの一時停止/開始ボタンがあり、マウスでクリックすることで操作できます。 キーボードの A、D、W、S キーは、それぞれ左、右、上、下に対応し、航空機の移動方向を制御するために使用されます。 したがって、AI プログラムは 2 つのコア機能を完了する必要があります。1 つはジェスチャーを認識することであり、2 つ目はジェスチャーをマウスとキーボードの操作に変換してゲームを制御することです。 2. ジェスチャを認識するここでは、opencv を使用してカメラからビデオ ストリームを読み取ります。 ビデオ ストリームの各フレームをメディアパイプの手のひら検出モデルに送信して、手のひらの 21 のキー ポイントを識別します。 私たちのプロジェクトでは、左右の 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. ゲームを一時停止するジェスチャー コントロール人差し指と中指の座標間の距離を計算し、それが一定のしきい値より大きい場合は、マウスを移動して一時停止をクリックします。ゲームボタン。 ゲーム一時停止人差し指と中指の座標間の距離が一定のしきい値未満の場合、マウスを移動して開始をクリックします。ゲーム ボタン ゲーム スタート 距離の計算は非常に簡単です。コードはここには投稿しません。焦点は 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_pausepause_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 が必要です。 機体は中央から左端に移動し、移動距離は 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 サイトの他の関連記事を参照してください。