Kinectをマウス、キーボード、タッチの代わりに使う - その2

さて、私が考えたアイデアを披露しますね。

そもそも何が難しいというかといえば、「センサーからの取得データには常に何がしかの誤差が含まれていて、ホワイトノイズがのってしまう」という点が一つ目。そして、「人は意図しない動作を沢山しているものだ」という点が二つ目。

Kinect SDKのAPIを見て最初に思いつくのは多分、更新された座標情報の差分を取って上下左右の移動を検知しようという方法ではないでしょうか。でもこれだと、ノイズをどう除去するか、とか、人間の体は常に動いている為、実は、意図したのが上下左右なのかは、十中八九判りません。連続的に動く点を追うのは難しいので、画面を一定の大きさのセルに分割してしまいます。そして、Kinectから体の部位の座標データが来たら、何処のセルに目標の部位が入っているかをトラッキングします。

通常のアプリでは、マウス移動の際は絶対的な距離よりも、どっち方向に動いたか、ゆっくりか素早くかぐらいしか重要ではないので、いくつセルを移動したかが把握できれば十分でしょう。
マウスの場合、クリックという動作がありますが、これをKinectでやるには、以外に大変です。一応私のアイデアでは、セルに一定時間からだの部位が留まる(Hold)、手を前に出す(Push)、予め決まったセルをなぞる(Rule)などを活用すればよいかな、という3種類を思いつきました。実際にやってみたところ、1番目のHoldが一番使い勝手がよく、2番目のPushはかなり難しく、3番目も決まった軌跡をなぞるのは結構難しいものでした。

他にも、手をゆっくり動かす、素早く動かすなどの区別は、Hold状態のセルから別のセルに手が移ったときの時間間隔である程度は識別可能です。バグは取りきれていないですが、是非お試しあれ。
まぁ、Codeplexには既にKinect.Toolkitというライブラリーが既に公開されているので、それも参考にしてくださいね。

サンプルコードはこちらから。ファイルは、KinectNUISample.zipです。

と、ここまでは、セミナーの前に書いておいたのですが、ジェスチャー認識などは、既に数理モデル的に確立されているとの事なので、大学などで研究されている皆様、是非Kinect SDK向けのミドルウェアなど、開発していただければ幸いです。

最後に、暑い中ご参加頂いた皆様、Ustの視聴者の皆様、ありがとうございました!!