実体のないマウスを作りました

2021/08/18に公開

はじめに

webカメラを下に向けて、骨格を認識させることで人差し指の先端をマウスカーソルとして使うことができるツールを作成しました。

https://github.com/takeyamayuki/NonMouse

実体がなくて何が嬉しいの?

遊んでて、なんか楽しいってだけじゃないんです。

実は実体がないことによる恩恵って結構あるんです。

たとえば、

  • 机の材質をサラサラするものに変えて、その上で描くことで、絵が描きやすくなる?
  • カメラの位置をディスプレイに合わせて設置して、ディスプレイをタッチディスプレイ化する
  • グローバルホットキーを押している時だけ、人差し指がマウスカードルになるので、タイピングとの相性が良い。
  • どこでも使えるので姿勢が自由になる?

現時点での問題点

ただ、いいことばかりじゃないんです。以下の問題点があります。

カメラ性能依存

macbookproのフロントカメラやlet's noteのフロントカメラだとなめらかに動作するんですが、logicoolの安いwebカメラだとカクつきます。

使用環境が明るくないといけない

暗い場所だとカメラが手を認識できないので、使えません。

カメラを正しく設置しないといけない

カメラを下に向けたり、後ろからディスプレイに向けたりするので、設置が少し大変。

手をまっすぐカメラに向けないといけない

手を斜めにすると、座標間距離が近くなったと認識して、クリックやスクロールなどと間違えられてしまいます。単純な座標として扱うのではなくて、機械学習などでジェスチャーとして登録すればうまくいくかもしれません。

というような感じです。カメラを使うならではの問題点です。

では次に、このマウスの詳細を見ていきましょう。

仕組み

仕組みと言っても超簡単です。主な機能は、Mediapipeから受けた座標を移動量に変換して、pynputのマウスを動かす関数に送っているだけです。

左クリック、カーソル、スクロールといった機能も、ある条件下で対象の関数を呼び出しているだけです。

(左クリックは、親指の指先と人差し指の第2関節の距離がしきい値を超えたら、左クリックの関数を呼び出します。カーソルは、人指し指の指先と中指の指の距離がしきい値を超えないとき、カーソル移動の関数を呼び出します。右クリックは、カーソルを動かさずに、クリック状態を1秒続けるとき、右クリックの関数を呼び出します。)

使い方

実行方法

実行可能ファイルをダウンロードして実行する方法と、pythonファイルとして実行する方法があります。

  1. 実行可能ファイルを実行
    GitHubの最新のリリースから自分の環境に合わせたZIPをダウンロードしてください。

  2. 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のジャイロマウスでした。
https://github.com/takeyamayuki/bluetooth_gyro_mouse

↓0:42から機能紹介しています
https://youtu.be/DzT40SCh3nI?t=42

これをフリスクケースに入れようとしているんですが、部品足りなくてまだ完成していません(笑)

それはそうと、これをフリスクケースに入れたところを想像しても、やはりなんか違う感があったわけです。ガジェット魂は燃えるかもしれませんが。まあ、もやもやした感じで、何も持たずに操作できたらいいなと思いました。その後、手の骨格認識ができるmediapipeの存在を知って、実際にできるかもしれないということになりNonMouseの開発を始めたわけです。

最後に

ご覧頂きありがとうございます。オモシロイと思ったら、ぜひいいね👍、star⭐お願いします🙏

この記事を書いていながら、まだ絶賛開発中です。主に、問題点に上げたところを解決するべく実装中です。
GitHubでのisuue, pull requestも大歓迎です。

Discussion