【Raspberry Pi × MediaPipe】手の検出をOpenCVで可視化する方法

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.handsMediaPipeの手検出モデルを使用します
hands.process()画像から手を検出し、21個のランドマーク(関節位置)を取得します
mp_draw.draw_landmarks()検出された手の関節と線を画像上に描画します

実現できること・応用のヒント

このスクリプトを活用することで、以下のような応用が可能です。

  • 手の形を使ったインタラクション(ジェスチャー操作)
  • 指の本数のカウント
  • 教育用途のビジュアル学習教材
  • 人感センサーの代替(手があるかないかを検出)

注意点

  • MediaPipeは本来リアルタイムビデオ入力(Webカメラ)向けに最適化されていますが、Raspberry Piでは libcamera-still で1枚ずつ画像を取得し、それを逐次解析する方式が安定です。
  • 撮影タイミングにより、画像がブレたり、検出が間に合わないことがあります。必要に応じて timeout や撮影解像度を調整してください。

まとめ

MediaPipeは、高度な機械学習モデルをPythonから簡単に扱える強力なライブラリです。
本記事でご紹介した手検出の手法をベースに、ジェスチャー操作やインタラクティブなシステムをRaspberry Pi上で実現する第一歩として、ぜひご活用ください。

今後は、手の動きに合わせた処理(ライトのON/OFFなど)への発展も可能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。