スポンサーリンク
スポンサーリンク
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 ワイヤ...
スポンサーリンク