Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】I Tried Building a Hand Gesture Mouse Controller in Python

2025年10月01日に「Dev.to」が公開したITニュース「I Tried Building a Hand Gesture Mouse Controller in Python」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Pythonを使い、OpenCVやMediaPipeで手のジェスチャーを認識し、PCを操作するマウスコントローラーを開発した。ウェブカメラで手の動きを検出し、マウス移動、クリック、スクロール、音量調整などを実現。画像処理ライブラリの活用と、未来的なシステム構築の体験を紹介する。

ITニュース解説

このニュース記事では、プログラミング初心者がPythonを使って手のジェスチャーでコンピューターを操作するマウスコントローラーを開発した経緯と、その具体的な仕組みが解説されている。手の動きだけでパソコンを操作するという、SFのようなアイデアを実現しようと試みたプロジェクトである。完璧な動作ではなかったものの、画像処理やPythonライブラリの活用、そして手のジェスチャーで現実の行動を制御する可能性について多くの学びを得たと報告されている。

このシステムを構築するために使われた主な技術は以下の通りだ。まず「Python」は、このプロジェクト全体の開発言語として利用されている。次に「OpenCV」は、Webカメラからの映像を取り込み、画像データを処理するために使われるライブラリである。「MediaPipe」は、手や指の位置をリアルタイムで高精度に検出するためのGoogle製のライブラリである。検出された手の動きをコンピューターのマウス操作に変換するために「PyAutoGUI」が使われている。これはマウスカーソルの移動やクリック、スクロールといった操作をプログラムから自動で行うためのライブラリだ。最後に「pycaw」は、Windowsのシステム音量を調整するために利用されるライブラリである。

このハンドジェスチャーマウスコントローラーの基本的な動作原理は、大きく分けて以下のステップで構成されている。まず、Webカメラから映像をリアルタイムで取り込む。次に、取り込んだ映像の中から手の形を認識し、指の関節など主要な点の位置(ランドマークと呼ばれる)を特定する。その上で、特定された指の位置や手の動きに基づいて、どのジェスチャーが行われているかを判断する。そして、そのジェスチャーに応じたマウスの移動、クリック、スクロール、あるいは音量調整といったパソコンの操作を実行するという流れである。

具体的な実装の詳細を見てみよう。まず、プログラムの冒頭では必要なライブラリがインポートされ、いくつかの初期設定が行われている。例えば、cv2はOpenCV、mediapipeはMediaPipe、pyautoguiはPyAutoGUIを示す。pycawに関する記述は、Windowsのオーディオデバイスにアクセスし、音量調整機能を利用するための準備である。Webカメラの映像サイズや、マウスカーソルの動きを滑らかにするためのsmootheningといった数値もここで設定されている。また、マウスのクリック状態を管理するためのclick_stateや、スクロール操作の間隔を制御するscroll_timerなども定義されている。

プログラムは、while Trueという無限ループの中で繰り返し実行される。このループの中で、Webカメラからフレーム(静止画)を1枚ずつ読み込み、それを左右反転し、色空間を変換する処理が行われる。左右反転は、鏡を見ているような自然な操作感を実現するためである。変換された画像データはMediaPipeのhands.process()メソッドに渡され、手とそのランドマークが検出される。

もし映像の中に手が検出された場合、results.multi_hand_landmarksにその情報が格納される。ここから、検出された手の各ランドマーク(指の関節や手のひらの特定の位置など、全部で21点ある)の座標が取得される。特に重要なのは、親指、人差し指、中指、薬指、小指の先端(tips)と、それぞれの指の付け根の関節の座標である。これらの座標を比較することで、各指が伸びているか、曲がっているかを判断する。例えば、指先が指の付け根よりも高い位置にあれば「伸びている」と判断される。

ジェスチャーの検出とその後の操作は、指の状態や手の動きに基づいて行われる。

  1. マウスカーソルの移動: もし人差し指だけが伸びている状態であれば、このジェスチャーがマウスカーソル移動に割り当てられる。人差し指の先端の座標が取得され、その座標をWebカメラの映像範囲からPCの画面全体の範囲にマッピングする。このマッピングにはnp.interp関数が使われ、カメラ映像内の指の位置が画面上のどの位置に対応するかを計算する。計算されたマウスカーソルの移動先は、急激な動きにならないようsmootheningという値を使って滑らかに補間され、最終的にpyautogui.moveTo()関数によってマウスカーソルがその位置へ移動する。

  2. クリック: 親指と人差し指の先端の距離が非常に近い場合(特定のしきい値0.03以下)、クリックジェスチャーと判断される。np.linalg.norm関数がこの距離の計算に使われる。一度クリックが検出されると、すぐに再度クリックが実行されないようにclick_stateというフラグが立てられる。指が離れて距離が一定以上(0.05以上)になると、click_stateがリセットされ、次のクリックが可能になる。

  3. スクロール: 人差し指と中指の両方が伸びている状態がスクロールジェスチャーである。この状態において、人差し指と中指の先端が付け根よりも上にあるかどうかで、上方向へのスクロールか下方向へのスクロールかを判断する。また、連続してスクロールが実行されないように、scroll_timerを使って0.25秒の間隔を空けるように制御されている。pyautogui.scroll()関数により、指定された量だけ画面がスクロールされる。

  4. 音量調整: すべての指が曲がっている状態、つまり手でグーを作っている状態が音量調整ジェスチャーである。このジェスチャーでは、手のひらの付け根部分の左右2点(親指側と小指側)の座標を使い、手の傾き角度を計算する。計算された角度が正の大きな値(30度より大きい)であれば音量を上げ、負の大きな値(-30度より小さい)であれば音量を下げる。pycawライブラリのvolume.SetMasterVolumeLevel()メソッドで音量が実際に変更される。

  5. スクリーンショット: すべての指が伸びている状態は、スクリーンショット撮影ジェスチャーに割り当てられている。この状態が2秒以上継続した場合にのみ、pyautogui.screenshot().save()関数が実行され、画面全体のスクリーンショットがscreenshot.pngというファイル名で保存される。誤作動を防ぐため、2秒間の継続が必要である。

各ジェスチャーの処理が終わった後、検出された手のランドマークとその接続線がmpDraw.draw_landmarks()関数を使って、Webカメラの映像上に描画される。これにより、ユーザーは自分の手の動きがどのように認識されているかを視覚的に確認できる。最後に、加工された映像が「Hand Gesture Controller」というウィンドウで表示される。ユーザーがキーボードの'q'キーを押すと、ループが終了し、Webカメラのリソースが解放され、ウィンドウが閉じられてプログラムが終了する。

このプロジェクトは、Pythonというプログラミング言語と、OpenCV、MediaPipe、PyAutoGUI、pycawといった強力なライブラリを組み合わせることで、どのようにして現実世界とコンピューターを繋ぐインタラクションシステムを構築できるかを示している。画像処理による特徴点検出、条件分岐によるジェスチャー判定、そしてシステム操作ライブラリによるアプリケーション連携という一連の流れは、システムエンジニアを目指す初心者にとって、プログラミングの面白さと実用性を学ぶ良い教材となるだろう。未来のテクノロジーがどのように実現されるかの一端を垣間見ることができる、実践的な開発事例である。

関連コンテンツ

関連IT用語