飴屋

Leap Motionアプリ/日記004

Gestureを試してみる

Listenerを継承したクラスを作ってLeapMotionの信号を処理できる基礎部分ができました。あとはOnFrameメソッド上で指や掌の姿勢に関するデータを処理する部分を書けばいいだけですが、LeapMotionには予め所定の指の動きを認知してくれる機能が備わっているようです。これらの動きはGestureと呼ばれるようです。

名称内容列挙型
サークル指で丸を描くような操作Gesture.GestureType.TYPECIRCLE
スワイプ指で直線を描くような操作Gesture.GestureType.TYPESWIPE
キータップ指で鍵盤を押すような操作Gesture.GestureType.TYPEKEYTAP
スクリーンタップ指で画面を押すような操作Gesture.GestureType.TYPESCREENTAP

Gestureの認識にはそれなりに負荷がかかると思われ、認識させるためには明示的に示してやる必要があるようです。使わない場合は処理を省いて計算量を減らしてやることができるわけですね。

public override void OnConnect(Controller c)
{
c.EnableGesture(Gesture.GestureType.TYPECIRCLE);
base.OnConnect(c);
}

こんな感じでOnConnect呼び出し時にControllerに使いたいGestureを許可しました。今回はサークルのみ許可しています。

public override void OnFrame(Controller c)
{
Frame f = c.Frame();
GestureList gl = f.Gestures();
for (int i = 0; i < gl.Count; i++)
{
switch (gl[i].Type)
{
case Gesture.GestureType.TYPECIRCLE:
form.viewBalloon("Circle");
break;
}
}
base.OnFrame(c);
}

OnFrameメソッドが呼び出された際にフレーム情報を取得しています。LeapMotionは1秒間に200フレームぐらい取得するらしいので、細かい指の動きも逃さず捕えることができそうです。マウスのフレームレートは125〜1000ぐらいみたいです。あんまり思い処理をOnFrameメソッドに盛り込んでしまうと処理が詰まってしまうかもしれませんね。

Frame情報の中にはGestureが成立した(指で丸が描かれた)タイミングでGestureList情報にそのGestureの情報が入ります。一度に複数のGestureが成立することを想定してGestureListという配列になっているのでしょう。ループを作って配列の中身を調べてやります。

Gesture情報のTypeプロパティをチェックして「サークル」の動作があった場合には「Circle」とバルーンに表示させています。バルーンを出す代わりに何か目的の処理を行えば「ジェスチャーによるショートカット」という目的のプログラムができそうです。

Gesture情報を元にCircleGestureを取得すれば、描かれた円の半径や法線ベクトルや描いた指、丸を書いた回数なども取得できるようです。いろいろアイディアが膨らみそうですね。

先日、Kinectを使って手話を認識させるというニュースを見かけたのですが、LeapMotionを使ってオレオレ手話を作って機械と対話するというのは将来の目標として面白いのかもしれません。とりあえず、「丸」「直線」「タップ」という手話は予めLeapMotionが覚えていてくれているということで、次は自分用のGestureを考えて実装してみたいです。

日記一覧

Last-Modified