NVIDIA Jetson

Jetson Nanoで遊ぼう!人差し指でターゲットをキャッチするAIゲーム

Jetson Nanoで遊ぼう!人差し指でターゲットをキャッチするAIゲーム

「プログラミングって難しそう…」

「AIを使って何か面白いことがしたい」

そんな君にピッタリの楽しいゲームを作ってみよう!

Jetson NanoとWebカメラを使って、

リアルタイムで手の動きを検出するAIゲーム を作ります。

 

このゲームでは、人差し指をターゲットの中に入れるとスコアがアップ!

5回成功すると 「CLEAR!」 の文字が表示されてゲームクリア!

 

体を動かして遊びながら、AIと画像認識を学べ、

リアルタイムで自分の骨格が映るのがめちゃくちゃ楽しいです。

 

Pythonの基本がわかればすぐにできるから、

さあ、一緒にAIゲーム作りにチャレンジしてみよう!

 

人差し指でターゲットをキャッチするAIゲーム

ゲームのルールをきめます。

画面にランダムな場所にターゲット(赤い円)が表示され、

右手 or 左手の「人差し指の先端」をターゲットの中に1秒入れると

次のターゲットが出現します。

これを5回繰り返せばクリアです!

 

AIの骨格検知を活用して、体を動かしながら楽しめるゲームです!

みんなでゲームクリアタイムを競いましょう

 

<プログラム>

import cv2
import mediapipe as mp
import numpy as np
import random
import time

# MediaPipe Pose の初期化
mp_pose = mp.solutions.pose
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

# カメラのセットアップ
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

# ターゲットの初期位置をランダムに設定
target_radius = 50  # ターゲットの半径
target_position = (random.randint(target_radius, 640 - target_radius),
                   random.randint(target_radius, 480 - target_radius))

# ゲームの状態
score = 0  # 成功回数
start_time = None  # 人差し指がターゲット内に入った時間
required_time = 1.0  # 1秒間キープで成功

# Pose & Hands モデルの初期化
with mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5) as pose, \
     mp_hands.Hands(min_detection_confidence=0.5, min_tracking_confidence=0.5) as hands:
    
    while cap.isOpened():
        success, frame = cap.read()
        if not success:
            print("カメラの映像を取得できませんでした。")
            break

        # 画像を左右反転(ミラー表示)
        frame = cv2.flip(frame, 1)

        # 画像をRGBに変換(MediaPipeの入力形式)
        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        results_pose = pose.process(frame_rgb)
        results_hands = hands.process(frame_rgb)

        # ターゲットの描画(塗りつぶしなし、太線)
        cv2.circle(frame, target_position, target_radius, (0, 0, 255), thickness=5)

        # 骨格(全身)の描画
        if results_pose.pose_landmarks:
            mp_drawing.draw_landmarks(frame, results_pose.pose_landmarks, mp_pose.POSE_CONNECTIONS)

        # 人差し指の座標リスト
        finger_positions = []

        # 手のランドマークを解析
        if results_hands.multi_hand_landmarks:
            for hand_landmarks in results_hands.multi_hand_landmarks:
                # 人差し指の先端座標を取得
                h, w, _ = frame.shape
                index_finger_tip = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
                finger_x, finger_y = int(index_finger_tip.x * w), int(index_finger_tip.y * h)
                
                # 人差し指の位置にマーカーを表示(青:右手, 黄色:左手)
                finger_positions.append((finger_x, finger_y))
                cv2.circle(frame, (finger_x, finger_y), 10, (255, 0, 0) if len(finger_positions) == 1 else (0, 255, 255), -1)

        # どちらかの人差し指がターゲット内に入っているか判定
        if any(np.sqrt((x - target_position[0]) ** 2 + (y - target_position[1]) ** 2) < target_radius
               for x, y in finger_positions):
            if start_time is None:
                start_time = time.time()  # 開始時間を記録
            elif time.time() - start_time >= required_time:
                # 1秒経過したらスコアを加算し、新しいターゲットを生成
                score += 1
                target_position = (random.randint(target_radius, 640 - target_radius),
                                   random.randint(target_radius, 480 - target_radius))
                start_time = None  # タイマーをリセット
        else:
            start_time = None  # ターゲット外に出たらリセット

        # スコア表示
        cv2.putText(frame, f"Score: {score}/5", (20, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

        # 5回成功でクリア
        if score >= 5:
            cv2.putText(frame, "CLEAR!", (180, 250), cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 0), 5)
            cv2.imshow('Pose Game', frame)
            cv2.waitKey(2000)  # 2秒待機して終了
            break

        # 画像を表示
        cv2.imshow('Pose Game', frame)

        # 'q'キーで終了
        if cv2.waitKey(5) & 0xFF == ord('q'):
            break

# カメラの解放とウィンドウの終了
cap.release()
cv2.destroyAllWindows()

 

もっと面白く

もっと面白くするには?

制限時間を追加して「スピードチャレンジ」にする!

音を追加して、成功時に「ピンポーン♪」と鳴らす!

ターゲットのサイズを変えて、難易度アップ!

AI × 画像認識の可能性は無限大!

さあ、自分だけのオリジナルゲーム を作ってみよう!

 

気になるワイヤレスイヤホン気になるワイヤレスイヤホン集 MoonDrop のワイヤレスイヤホン 水月雨 MoonDrop Space Travel ワイヤ...