python

Python CVZoneを使ったハンドジェスチャー|初心者必見ガイド

この記事ではPythonのライブラリ「CVZone」を使ってハンドジェスチャーを実施する方法を説明します。このガイドに従えばスムーズに進めることができます。

CVZoneとは

CVZoneは、コンピュータビジョンを容易にするためのPythonライブラリです。簡潔で使いやすいAPIにより、子供や初心者もプログラミングを通じてコンピュータビジョンに触れることが可能です。また、多様なデモやサンプルが提供されており、実際のアプリケーションに応用する手助けとなります。

英語ですがビデオ付きのコード解説や使用例もあり、アプリケーション作成をすぐに実施することができます。
Pythonプログラミングの基礎を学んだ後はこちらを使って学習することが効果的・経済的かと思います。

CVZoneのインストール

CVZoneはPythonのライブラリとして提供されているので、以下でインストールすることができます。

pip install cvzone

必要に応じて関連するライブラリもインストールされます。

手の動きのトラッキング

手の動きをトラッキングすることは、ジェスチャーの認識に欠かせません。CVZone内のトラッキング機能を用いると、手の位置や動きをリアルタイムで把握できます。これにより、ジェスチャーを連続して入力するアプリケーションの開発が可能です。手の座標情報を取得し、画面上のオブジェクトとのインタラクションに活用することで、より直感的な操作が実現します。

ソースコード

# ハンドジェスチャーモジュールおよびOpenCVモジュールのインポート
from cvzone.HandTrackingModule import HandDetector
import cv2

# PCカメラの初期化
cap = cv2.VideoCapture(0)

# HandDetectorのパラメータ設定
detector = HandDetector(staticMode=False, maxHands=2, modelComplexity=1, detectionCon=0.5, minTrackCon=0.5)

# カメラのフレーム取得を繰り返す
while True:
    success, img = cap.read()
    # 現在のフレーム画像から手を検出
    hands, img = detector.findHands(img, draw=True, flipType=True)

    # 手を検出したら情報を算出
    if hands:
        hand1 = hands[0]
        # 手のランドマーク座標
        lmList1 = hand1["lmList"]
        # 手の境界となる座標(矩形)
        bbox1 = hand1["bbox"]
        # 手の中心座標
        center1 = hand1['center']
        # 右手か左手か
        handType1 = hand1["type"]
        # 立っている指の数
        fingers1 = detector.fingersUp(hand1)
        print(f'H1 = {fingers1.count(1)}', end=" ") 
        length, info, img = detector.findDistance(lmList1[8][0:2], lmList1[12][0:2], img, color=(255, 0, 255),
                                                  scale=10)

        # 手が二つ検出されている場合は、もう一つの手の情報を算出
        if len(hands) == 2:
            # Information for the second hand
            hand2 = hands[1]
            lmList2 = hand2["lmList"]
            bbox2 = hand2["bbox"]
            center2 = hand2['center']
            handType2 = hand2["type"]
            fingers2 = detector.fingersUp(hand2)
            print(f'H2 = {fingers2.count(1)}', end=" ")
            length, info, img = detector.findDistance(lmList1[8][0:2], lmList2[8][0:2], img, color=(255, 0, 0),
                                                      scale=10)

        print(" ")  # New line for better readability of the printed output

    # 手のトラッキングを画像上に表示
    cv2.imshow("Image", img)

    cv2.waitKey(1)

上記のように手の数を検出しつつ、その手の情報について以下を算出し、画像の上に表示することができます。

  • 手の関節など21点のランドマーク座標
  • 手の位置を示す矩形の頂点座標
  • 手の中心座標
  • 右手か左手か
  • 立っている指の本数

これを応用することで、指の本数取得機能を用いたじゃんけんゲームなどを簡単に作成することができそうです。

実行結果

指し棒をキャプチャした結果が以下です。てとして検出した範囲、右手ということで「right」の表示、関節のようなものを示すランドマークの表示がされています。
これが30行程度のコードで実現できるのはすごいですね!

まとめ

CVZoneライブラリを使用することで、短いコードでハンドジェスチャを実現することができます。

CVZoneはハンドジェスチャー以外の画像認識機能のサンプルも多いため、Pythonを用いた画像認識の基礎を学ぶことにも活用できそうです。

とにかくすぐに動かせるので、まずは使ってみてどんなことができそうか想像を膨らますこともできそうですね!

所長
所長

-python