飴屋

Leap Motionアプリ/日記005

ポーズを認識してみる

Leap Motionで丸を描くジェスチャーを認識してもらうのは簡単に実装できましたが、もうちょっと複雑な手の操作も認識してみてもらいたいところです。しかし、ジェスチャーは三次元座標に加えて時間軸を監視する必要があります。手のアニメーションを認識する前に、少し敷居を下げて手の静止画の認識から始めてみます。

Leap Motionが認識する手や指の姿勢情報はOnFrameメソッドの中でジェスチャー情報を取得したときと同じように取得できました。

メソッド、プロパティ内容
Frame.Gesturesメソッドジェスチャー情報の配列GestureList
Frame.Handsプロパティ手の情報の配列HandList
Frame.Fingersプロパティ指の情報の配列FingerList
Frame.Toolsプロパティ道具の情報の配列ToolList
Frame.Pointablesプロパティポインタブルの情報の配列PointableList

Leap Motionのコントローラーが認識するものをついでに少し整理してみます。

ジェスチャー(Gesture)
前に出てきた事前に用意されている4つの動作。前に出てきたので詳細は割愛。
手(Hand)
Leap Motion上の手とおぼしき物体。多分、0〜5本の指を持つ。Leap Motion上の座標や姿勢ベクトルなどの情報を持つ。指の形状から手に仮想の球体を持たせた場合の球の座標と半径などの情報も持つ
ポインタブル(Pointable)
手の指や手に持った鉛筆などの細長い形状のもの。(ポインターというとややこしいし、ポインタブルだと呼びにくいので適切な訳語が欲しいです。指示器?)長さや太さ、指し示す方向や爪先に当たる部分の座標などの情報を持つ。
指(Finger)
ポインタブルのうち手(Hand)から生えているもの。
道具(Tool)
一般的な指よりも長くて細くてまっすぐなものを指ではなくて道具と認識するらしい。

これらの認識物を使って特定のポーズをLeap Motionに認識させてみることにします。どんなポーズがいいか迷いましたが、とりあえず「グワシッ」を認識してみたいと思います。「グワシッ」は楳図かずお先生の作品「まことちゃん」で流行った親指と人差し指と薬指を立てて、中指と小指を折るというハンドサインです。

public override void OnFrame(Controller c)
{
Frame f = c.Frame();
if (!f.Hands.IsEmpty)
{
Hand h = f.Hands[0];
if (h.Fingers.Count==3)
{
float[] dots = new float[] {
h.Fingers[0].Direction.Dot(h.Fingers[1].Direction),
h.Fingers[1].Direction.Dot(h.Fingers[2].Direction),
h.Fingers[0].Direction.Dot(h.Fingers[2].Direction)
};
Array.Sort(dots);
if (Math.Abs(dots[2] - 0.87) < 0.05 & Math.Abs(dots[1] - 0.67) < 0.07 & Math.Abs(dots[0] - 0.61) < 0.05)
{
form.viewBalloon("グワシッ!");
}
}
}
base.OnFrame(c);
}

OnFrameメソッドで上記のようなコードを試しに書いてみました。まず、処理フレーム中に「手」の情報があるか確認し、「手」から「指」が3本生えていることを確認します。残念ながらどの指が生えている(伸びている)かはLeap MotionのSDKでは判断できないので、自分でそれっぽく書いてみました。やっていることは3本の指先が指し示す方向の単位ベクトルのそれぞれのドット積を計算して、それぞれの指の交差する角度がそれっぽい範囲であるかどうかを確認しています。厳密に「グワシッ」になっているかどうかを確認するには指先の位置や指の付け根の位置を確認した方がいいのかもしれませんが、「グワシッ」のし過ぎで手がビリビリしてきたのでこの辺で手を打ちました。

これで「グワシッ」を合図に何か処理を開始できるようになり、PCとますますお友達になれた気がします。

ポーズを認識させて思ったこと

必要な情報は全てLeap Motionが取得してくれるので、必要な情報を拾って、必要な範囲に値が存在すれば、他にもいろんなポーズの認識ができると思いました。ただ、折り曲げた指の情報はLeap Motionでは取得できませんし、指の関節の状態もわかりません。ハンドサインを認識させる場合はメリハリのあるもの指の形のものに限定されるのかもしれません。

もう一つ、ポーズを厳密に定義しようとすると、手の形の個人差に悩むケースがあるんじゃないかなと思いました。自分もうまくはできませんが「グワシ」をやろうとしてもどうしても薬指が曲がってしまう人もいらっしゃいますし、指の股がものすごい開く人と開かない人とでは今回のグワシの判別方法では閾値が変わってくるはずです。

それから、グワシには原作中でも2パターンほど種類があるらしく、古い方のパターンを愛する人からすると今回の実験は正しくない結果を返すことになります。ハンドサインはいろんな地方で使われる身近なものですので、それぞれに愛着や歴史があると思います。プログラムを実装する上で、提供相手の文化を考慮に入れておくことを忘れないようにしようと思いました。人前では使ってはいけないようなハンドサインもたくさんあるようです。

さらに考えすぎからもしれませんが、今回自分の手で作った「グワシ」を元にポーズ判別用の閾値を設定しましたが、逆にこの閾値から自分の手に関する情報が逆算され、思わぬ形で個人情報の漏えいにつながるんじゃないかと思いました。(いや、自分の手の情報が流出しても問題はないですね。)こういうセンサー機器から垂れ流れる信号情報は一見大事な情報には見えないですが、必要な情報を取捨することで思わぬ価値が生まれるものです。Leap Motionは大丈夫でも、Kinectや今後発売される同様の商品を使ってこっそりと個人を特定する情報が作成される未来がくるかもしれません。Kinectみたいなセンサーで服のサイズ選びをしたら、ウェストサイズが流出した、なんてこともあるかも。開発者側としては頭の片隅にそんなことも置いておいたらいいかもしれません。

日記一覧