bohemia日記

おうちハックとか画像処理、DeepLearningなど

「にっこにっこにー」のジェスチャーを認識する

RealSenseには、デフォルトでいくつかのジェスチャーが実装されている。 頑張ってにっこにっこにーのジェスチャーを認識させるようにしたお話。

f:id:bohemian916:20160208223613p:plain

RealSenseとは

Intelが進めている、NUIのためのセンサデバイスです。通常のカメラ以外に深度センサが搭載されており、顔・手の検出・トラッキング、ジェスチャー、3Dスキャンなどの機能がある。最近市販PCの組み込みが始まっている。

こちらの画像がわかりやすい。

https://software.intel.com/sites/default/files/managed/0c/78/col2.png

できることは、こちらによくまとまってる。 tips.hecomi.com

RealSenseのジェスチャー認識

RealSenseに組み込まれているジェスチャーは、以下のようなものがある。

http://image.slidesharecdn.com/firststepswithintelrealsensesdk-150325122815-conversion-gate01/95/first-steps-with-intel-realsense-sdk-by-xavier-hallade-28-638.jpg?cb=1427286602

グー、チョキ、パー、いいね、などの静的なものから、スワイプ、ピンチ、ウェーブなどの動的なものがある。 それぞれの認識精度はまちまちで、認識されやすかったりされにくかったりする。 これ以外のジェスチャーを認識させるためには、自分で頑張るしかない。

にっこにっこにーの認識

まず前提として、RealSenseでは、手の各点の座標が取れる。 取れる点はこの通り。

https://camo.githubusercontent.com/a276de12dd67dacfea2aff70eeea9d5ef6176d91/68747470733a2f2f736f6674776172652e696e74656c2e636f6d2f73697465732f6c616e64696e67706167652f7265616c73656e73652f63616d6572612d73646b2f32303134676f6c642f646f63756d656e746174696f6e2f68746d6c2f6d616e75616c735f636c6970303034342e706e67

点の座標を表示させた状態で、にっこにっこにーを行うと、こんな感じ。 f:id:bohemian916:20160208222400p:plain

もう少し詳しくみてみる。 片手の状態だと、このように、人差し指と小指は立てたまま、中指と薬指を折り曲げた状態になる。 f:id:bohemian916:20160208222609p:plain

とすると、にっこにっこにーの手の時は、人差し指と小指のy座標が、中指と薬指のy座標よりも小さくなっている状態である。 とすると、下記の条件を満たす時、手の形をにっこにっこにーと判定すればよい。

各指の先端のy座標をそれぞれ、人y, 中y, 薬y, 小y, 閾値をThとすると、

人y - 中y > Th ・・・①
人y - 薬y > Th ・・・②
小y - 中y > Th ・・・③
小y - 薬y > Th ・・・④

上記の①②③④を全て満たした時、その手はにっこにっこにーのポジションをしている。 きちんと指を立たせていることも大事なので、一定距離以上高さに差がないと判定されないように、閾値Thを用いている。 両手ともこの条件を満たせば、にっこにっこにーをしていると判定できる。

実装

実装は、プロジェクションマッピングなどで使われている、TouchDesignerというツールを用いた。 箱をつなぐだけで簡単にプログラミングができる。 RealSenseやKinnectのセンサデータを、生データをリアルタイムで見ながらデバッグできるので便利。

TouchDesignerの使い方は、こちらのブログがわかりやすい

www.shuhei-matsuyama.com

デモ

こちらが片手のデモ。左側の箱が、先ほどの条件を一つづつ表したボックスで、指を動かすと、箱の中の状態が変わっている。 白くなると、その条件が満たされた状態。4つの条件を満たした時のみ、右の箱が白くなる。きちんとにっこにっこにーのときだけ判定されている。 www.youtube.com

使ってみて

片手でやるときはうまくいくが、両手になると、RealSenseの問題で左右の手のポイントがうまく取得できないことがある。 片手しか認識されなかったり、中指なのに人差し指として認識されていたり。 そもそも点がちゃんと取れないと、この方法ではうまく判定できない。精度の改善に期待。