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

4 min read

はじめに

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

https://github.com/takeyamayuki/NonMouse

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

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

実は、これ、更に工夫をすることでより使いやすくなるんです。

たとえば、指だけで書けるわけですから、

  • 机の材質をサラサラするものに変えて、その上で描く
  • カメラの位置をディスプレイに合わせて設置して、ディスプレイをタッチディスプレイ化する

などといった工夫をすることで、マウス、トラックパッド、タッチディスプレイもどきが作れてしまうんです。

現時点での問題点

ただ、いいことばかりじゃないんです。2021/8/23現在、以下の3つの問題点があります。

カメラ性能依存

macbookproのフロントカメラやlet's noteのフロントカメラだとなめらかに動作するんですが、logicoolの安いwebカメラだとカクつきます。ただ、実装方法によって改善可能だと思われるので、今後の課題です。

CLI操作必須なので、完全なパソコン初心者人は使いづらい

アプリケーション化はやってないだけなので、これも今後の課題です。
CLI操作の問題は解消されました。(2021/9/13追記)

操作覚えるのが少し面倒

何事も使い始めは操作を覚えるのが面倒なので、問題点とも言い難いですね。あと、なるべく直感的に操作できるようにしたつもりです。

というような感じです。問題点と言っても、そこまで大きな問題ではないですね。

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

仕組み

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

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

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

使い方(2021/8/23現在)

実行方法

実行可能ファイルをダウンロードして実行する方法と、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など、実行する場所を追加する必要があります。

$ pip install -r requirements.txtにより、mediapipe, numpy, opencv-python, pynputがインストールされます。

実行は、パラメータの調整を簡単にするためシェルスクリプトにまとめてあります。

  • launch.shの中身は$ python3 app.pyだけで、デフォルトのパラメータの状態で起動します

  • launch-frcam.shはラップトップのフロントカメラを使用するように調整(カメラのデバイス番号は人の環境によって違うかもしれないので、GitHubのREADMEを見て設定してください)中身は$ python3 app.py --device 2 --direction 1

  • launch-ceiling.shは天井に取り付けたwebカメラを使用するように調整。中身は$ python3 app.py --distance 50 --kando 5

GUIでの設定ができるようになりました(2021/9/4追記)

手の動き

アクティブ化 カーソル 左クリック 右クリック スクロール

カーソル

  • マウスカーソル: 人差し指の先端
  • マウスカーソルの動きを止める: 人指し指の指先と中指の指先をくっつける

左クリック

  • 左クリック/リリース: 親指の指先と人差し指の第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

ログインするとコメントできます