KinectによるNUI
7月11日のTFセミナーに参加された皆さん、Ustで視聴された皆さん、ありがとうございました。
ここ最近このセミナーに向けて、Kinect SDKでできることの調査やデモアプリ作成をしてきたわけですが、そこで感じた事を纏めてみました。
1. Kinectはやっぱりセンサーだね
ご存知の皆さんも多いかと思いますが(多いと嬉しい)、一昨年前からWindows 7 Sensor & Location Platform(以下SLPと略)の普及・啓発活動を行ってきたわけですが、Kinect SDKのAPIでプログラムを組んでみて、一番感じたのがこの点です。SLPでも、加速度センサーつきのグローブを作って、手の3Dモデルを動かしたり、ピアノを弾いたり、脳波で地球を廻したり、電力測ったり、風水盤つくったり、人感したり・・・と色々沢山デモを作ったわけですが、重要なのはデバイスで測ったデータをどう処理するか、全く別の概念とどう結びつけるかという、アイデアとそれを実現する為の各種テクノロジーとの連携であるという点に変わりはありません。
ですから、Kinect SDKのAPI自体はそれほど複雑怪奇ではないですが、Kinect SDKを使ったプログラムを作る時は、皆さんのイマジネーションやインスピレーションを是非、燃やしてください。
2. ARでの活用
これまではARToolkitの様に、特殊なマークを実世界で用意して、それを画像処理で認識し、それにグラフィックスを重ねるというのが一般的でしたが、Kinectの場合、簡単に頭や手、体、足といった体の各部位の実空間上の位置情報が簡単に手にはいるわけです。この座標を基準にグラフィックスを重ねてしまえば、凄く簡単にAR的なものが出来上がります。なんというか、実感としては”AR3分間プログラミング”って感じです。まぁ、もちろん、画像や3Dモデルを用意するのはそれなりに大変なのですが。
Kinectだからこその注意点を挙げておくと、Kinectが深度やスケルトンを認識する領域が、底辺が4m×4m、高さが4mの四角錘(センサーから0.85m以内を除く)であるという点です。AR的に見せる一番簡単な方法は、KinectのVideo画像を表示して、それに、スケルトンフレームから取得したジョイント座標を元に画像を貼り付けるというものですが、Video画像自体は二次元なので、体とセンサーの距離によってVideo画像上の相対的な体の大きさが変わってしまいます。当然のことながら人の身長は変わらないので、180cmの人がKinectの真正面に立って前後に移動すれば、座標は(0,1.8,距離)になり、y座標は変わりません。しかしVideo画像上では、距離が遠くなれば人体はVideo画面の見かけ上小さくなり、Kinectに近づけば、見かけ上大きくなります。このため、人のサイズに合わせて別の画像を貼り付ける時には、Kinectからの距離を使って、Video画像上の見かけの大きさを計算して画像の大きさを変えなければなりません。これを留意すればより自然なARが出来上がります。
3.スケルトンについて
Kinectは赤外線で距離を測っているため、Kinectから見て何か別のものと重なっていると正しく認識できません。例えば二人の人を認識している場合、二人の体が重なった場合などは誤認識の場合があります。ほかに、くるっと一回り回転するという動作の判別は、ジョイント座標を見ているだけではちょっと難しいです。
4.動作の抽出
Kinectでプログラムを組んでいると、多分、必ず、入力情報をマウスやキーボード、タッチの代わりにしたいという欲求が沸きあがってくるでしょう。しかし、やってみるとかなり難しい。人間は何かの動作をする時、無意識に実に沢山の無駄な動きをしています。例えば、手を動かして、右にいくよう指示したい場合、手を右に動かすと、動かし終わったときに、自然と左に戻ってしまいますよね。これはセンサーデータから見ると、右方向移動→左方向移動となってしまい、本来動作者が意識している右方向移動のみを取り出すことの妨げになるわけです。このあたりは、加速度センサーのみで動きを取り出そうという場合に非常に良く似ています。これを解決する幾つかのアイデアは既に考案されているようですが、一度どうすればよいかを考えてみるのも良いでしょう。
何となくなのですが、マウスやキーボード、タッチの単なる代替は、Kinectの正しい使い方では無いように思っているので、Kinectならではのアプリ操作方法のアイデアを皆さんが出してくれることに期待しています。