はじめに
今回は、Googleが提供するMediaPipeというフレームワークを使って、ハンドトラッキングをしてみます。ノートパソコン搭載のWebカメラを使います。
MediaPipeについて
Google が提供する、クロスプラットフォームのオープンソースフレームワークです。主に、リアルタイムの機械学習(ML)モデルを、カメラ映像やその他のセンサーデータと組み合わせて、様々なデバイス(モバイル、デスクトップ、Web)上で動作させることを目的としています。
今回は、ハンドトラッキングを使いますが、その他にも顔検出や姿勢推定、セグメンテーションなどの機能も提供されています。
実際にやってみる
必要なものは以下の通りです。
- Python環境(今回3.12)
- Webカメラ
コードは以下の通りです。
main.py
import cv2
import mediapipe as mp
# MediaPipe Handsのセットアップ
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_drawing = mp.solutions.drawing_utils
# カメラからの映像をキャプチャ
cap = cv2.VideoCapture(0)
# OpenCVのウィンドウを作成
cv2.namedWindow('Hand Tracking', cv2.WINDOW_NORMAL)
is_fullscreen = False
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 画像を水平方向に反転
frame = cv2.flip(frame, 1)
# 画像をRGBに変換
image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
# 手のランドマークの検出
results = hands.process(image)
# 画像をBGRに戻す
frame = cv2.cvtColor(image, cv2.COLOR_RGB2BGR)
# 検出結果がある場合、ランドマークを描画
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
# 画像を表示
cv2.imshow('Hand Tracking', frame)
# キー入力をチェック
key = cv2.waitKey(10) & 0xFF
if key == ord('q'):
break
elif key == ord('f'):
is_fullscreen = not is_fullscreen
if is_fullscreen:
cv2.setWindowProperty('Hand Tracking', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN)
else:
cv2.setWindowProperty('Hand Tracking', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_NORMAL)
# リソースの解放
cap.release()
cv2.destroyAllWindows()
このコードを実行すると、Webカメラからの映像ウィンドウが立ち上がります。
そこに映るように手を持っていくと・・・
できました!
このように、手を認識してポイントとノードでトラッキングされます。
手を動かしても、しっかりと綺麗に追従しています。
指が隠れるようなジェスチャーをしてみました。すると・・・
このように、指の位置も途切れませんでした!学習されたモデルが位置推定をしていると思われますが、かなり高精度のようです。
おわりに
想像していたよりもスゴイモノでした!ここまで高精度だとは...。この技術を活用すればいろいろ面白いことができそうではないでしょうか!(バーチャル空間とかにもいける・・・!?)
今回は、ここまでです。ありがとうございました!
篠木友馬
Mail:s233317@stn.nagaokaut.ac.jp
Portfolio:https://yumashinoki.my.canva.site
GitHub:https://github.com/YumaShinoki47