目次
Pythonとlibcameraで実現するハンドトラッキングの第一歩
Raspberry Piを使ってカメラ映像から「手(Hand)」を検出するには、Googleが提供する機械学習ライブラリ MediaPipe が非常に有効です。
本記事では、Raspberry PiとPython、OpenCV、MediaPipeを活用して、カメラ画像から手の位置を検出し、指の関節を視覚的に表示する方法をご紹介します。
使用するライブラリと事前準備
使用ライブラリ
- MediaPipe(手の検出)
- OpenCV(画像処理と表示)
- libcamera(Piカメラでの撮影)
インストール手順(pip)
Raspberry Pi OS(特にBookworm以降)では、通常の pip install
が制限されている場合があります。
そのため、次のように --break-system-packages
オプションを使用してインストールします。
pip install mediapipe --break-system-packages
pip install opencv-python --break-system-packages
この2つのライブラリが正しくインストールされていれば、以下のコードを使用することで、Piカメラに映った手の検出が可能になります。
実行コード:手の関節をリアルタイムに描画するPythonスクリプト
import cv2
import mediapipe as mp
import os
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(static_image_mode=True, max_num_hands=2)
mp_draw = mp.solutions.drawing_utils
while True:
os.system("libcamera-still -n -o hand.jpg --width 640 --height 480 --timeout 1")
img = cv2.imread("hand.jpg")
if img is None:
break
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
results = hands.process(img_rgb)
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
mp_draw.draw_landmarks(img, hand_landmarks, mp_hands.HAND_CONNECTIONS)
cv2.imshow("Hand Detection", img)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.destroyAllWindows()
コードの解説(ポイントのみ簡潔に)
処理内容 | 説明 |
---|---|
libcamera-still | カメラ画像を静止画として撮影します |
cv2.imread | 撮影画像をOpenCVで読み込みます |
mp.solutions.hands | MediaPipeの手検出モデルを使用します |
hands.process() | 画像から手を検出し、21個のランドマーク(関節位置)を取得します |
mp_draw.draw_landmarks() | 検出された手の関節と線を画像上に描画します |
実現できること・応用のヒント
このスクリプトを活用することで、以下のような応用が可能です。
- 手の形を使ったインタラクション(ジェスチャー操作)
- 指の本数のカウント
- 教育用途のビジュアル学習教材
- 人感センサーの代替(手があるかないかを検出)
注意点
- MediaPipeは本来リアルタイムビデオ入力(Webカメラ)向けに最適化されていますが、Raspberry Piでは
libcamera-still
で1枚ずつ画像を取得し、それを逐次解析する方式が安定です。 - 撮影タイミングにより、画像がブレたり、検出が間に合わないことがあります。必要に応じて
timeout
や撮影解像度を調整してください。
まとめ
MediaPipeは、高度な機械学習モデルをPythonから簡単に扱える強力なライブラリです。
本記事でご紹介した手検出の手法をベースに、ジェスチャー操作やインタラクティブなシステムをRaspberry Pi上で実現する第一歩として、ぜひご活用ください。
今後は、手の動きに合わせた処理(ライトのON/OFFなど)への発展も可能です。