実体のないマウスを作りました
はじめに
webカメラを下に向けて、骨格を認識させることで人差し指の先端をマウスカーソルとして使うことができるツールを作成しました。
実体がなくて何が嬉しいの?
遊んでて、なんか楽しいってだけじゃないんです。
実は実体がないことによる恩恵って結構あるんです。
たとえば、
- 机の材質をサラサラするものに変えて、その上で描くことで、絵が描きやすくなる?
- カメラの位置をディスプレイに合わせて設置して、ディスプレイをタッチディスプレイ化する
- グローバルホットキーを押している時だけ、人差し指がマウスカードルになるので、タイピングとの相性が良い。
- どこでも使えるので姿勢が自由になる?
現時点での問題点
ただ、いいことばかりじゃないんです。以下の問題点があります。
カメラ性能依存
macbookproのフロントカメラやlet's noteのフロントカメラだとなめらかに動作するんですが、logicoolの安いwebカメラだとカクつきます。
使用環境が明るくないといけない
暗い場所だとカメラが手を認識できないので、使えません。
カメラを正しく設置しないといけない
カメラを下に向けたり、後ろからディスプレイに向けたりするので、設置が少し大変。
手をまっすぐカメラに向けないといけない
手を斜めにすると、座標間距離が近くなったと認識して、クリックやスクロールなどと間違えられてしまいます。単純な座標として扱うのではなくて、機械学習などでジェスチャーとして登録すればうまくいくかもしれません。
というような感じです。カメラを使うならではの問題点です。
では次に、このマウスの詳細を見ていきましょう。
仕組み
仕組みと言っても超簡単です。主な機能は、Mediapipeから受けた座標を移動量に変換して、pynputのマウスを動かす関数に送っているだけです。
左クリック、カーソル、スクロールといった機能も、ある条件下で対象の関数を呼び出しているだけです。
(左クリックは、親指の指先と人差し指の第2関節の距離がしきい値を超えたら、左クリックの関数を呼び出します。カーソルは、人指し指の指先と中指の指の距離がしきい値を超えないとき、カーソル移動の関数を呼び出します。右クリックは、カーソルを動かさずに、クリック状態を1秒続けるとき、右クリックの関数を呼び出します。)
使い方
実行方法
実行可能ファイルをダウンロードして実行する方法と、pythonファイルとして実行する方法があります。
-
実行可能ファイルを実行
GitHubの最新のリリースから自分の環境に合わせたZIPをダウンロードしてください。 -
pythonファイルとして実行
以下のスクリプトを実行します。$ git clone https://github.com/takeyamayuki/NonMouse $ cd NonMouse $ pip install -r requirements.txt # 実行 $ python3 app.py
mediapipeのインストールで困ったら公式サイトを見てください。
※macの場合、システム環境設定からセキリュティとプライバシーのアクセシビリティの項目にターミナルやVScodeなど、実行する場所を追加する必要があります。
手の動き
カーソル止める | 左クリック | 右クリック | スクロール |
---|---|---|---|
カーソル
- マウスカーソル: 人差し指の先端
- マウスカーソルの動きを止める: 人指し指の指先と中指の指先をくっつける
左クリック
- 左クリック/リリース: 親指の指先と人差し指の第2関節をくっつける/離す
- ダブルクリック: 左クリックしてリリースするのを0.5秒以内に2回行う
その他
- 右クリック: カーソルを動かさずに、クリック状態を1秒続ける
- スクロール: 人差し指を折ると、人差し指でカーソルが動く。
止め方
Ctrl+C: ターミナルウィンドウがアクティブのとき
Esc: アプリケーションウィンドウがアクティブのとき
経緯
なんでこんなもんを作ろうと思ったのか、一応経緯を説明しておこうと思います。
最近自作キーボードって流行ってますよね。僕もそういうガジェット大好きなので、乗ろうと思ったのですが、やっぱみんなと同じじゃつまらないと思い!、自作マウスに挑戦しようとしたわけです。それで、最初に作ったのが、bluetoothのジャイロマウスでした。
↓0:42から機能紹介しています
これをフリスクケースに入れようとしているんですが、部品足りなくてまだ完成していません(笑)
それはそうと、これをフリスクケースに入れたところを想像しても、やはりなんか違う感があったわけです。ガジェット魂は燃えるかもしれませんが。まあ、もやもやした感じで、何も持たずに操作できたらいいなと思いました。その後、手の骨格認識ができるmediapipeの存在を知って、実際にできるかもしれないということになりNonMouseの開発を始めたわけです。
最後に
ご覧頂きありがとうございます。オモシロイと思ったら、ぜひいいね👍、star⭐お願いします🙏
この記事を書いていながら、まだ絶賛開発中です。主に、問題点に上げたところを解決するべく実装中です。
GitHubでのisuue, pull requestも大歓迎です。
Discussion