OpenNIでKinectスケルトントラッキング

 ついに自前のプログラムで、スケルトンのトラッキングができました。何のことかというと、Kinectです。

 Kinectは、以前よりプログラミングでいじりたいと思っていました。OpenKinectやOpenNIの登場により、ずいぶんと身近になりましたので、ここ数日、KinectWindows PCにつないで、いくつかのコードを書いてみていました。

動機 Kinectのスケルトントラッキングを何かに利用してみたい

経緯

 最初は、OpenKinectのインストール、RGB画像と深度画像を挑戦しました。続いて、OpenNIのインストールし、OpenNIを使ったプログラミングをしていました。
 OpenKinectにしても、OpenNIにしても、開発進行中のAPIなので、実行するOSによる制限事項や、インストール手順のややこしさなどがあり、それら情報はフォーラムやブログなどに点在している状態です。

 導入後、どちらでもRGB画像や深度マップの取得は、比較的簡単です。
 OpenNIで可能なスケルトントラッキングについては、手順を知るには少し手間がかかりました。これについては、NITEにある「StickFigure.cpp」がヒントになりました。また、そのサンプル「StickFigure」でも、「Psi」(Ψ)のポーズを知るまでは、トラッキングすら表示されません。

状況

 現在のところ、スクリーンショットのように、関節位置を赤い矩形のスプライトで表示しているだけです。とはいえ、このステップの達成は、嬉しい瞬間です。青字は、少しずつラッパーを実装しながら、取得できる情報を表示してみた結果です。
 列挙型には、24個の関節が定義されています。ここで実行した範囲で、実際に取得できた関節は15個でした。

 RGB画像と深度画像も重ねて表示できますが、非表示にしています。すでに、Kinectの利用に挑戦されている方もおり、深度画像やトラッキング自体は、特に目新しいことでもありません。

 スクリーンショット用の特別なツールは用意していなかったので、Windowsの標準機能を使ってキャプチャしました。ノートPCで作業していますがノートPCは置いておき、Kinectのプレイエリアに入るべく、USBキーボードをつなぎ、USBキーボードを操作しました。なんとなく、点が人型に並んでいるのがわかるでしょうか(キーボードを持ち、片足を上げている)。

プログラム「OpenNIDotNetSample」(仮称)の概要

Kinectにアクセスする基本のAPI OpenNI / C言語API
.NETからKinectにアクセスするためのラッパーAPI 自作「OpenNIDotNet」(仮称)
得られた情報の表示処理 XNA Game Studio 4.0

 今回は、まだOpenNIの仕組みもよくわからず、α版につきどんな問題があるかもわからない状態です。しかし、.NETから使いたかったので、直にCやC++APIを使うのではなく、ラッパーDLL「OpenNIDotNet」(仮称)を作成しながら、プログラムを作りました。
 「OpenNIのC」APIと「OpenNIのC++ラッパー」APIのどちらをベースにするか考えましたが、C++ラッパーは巨大なヘッダーファイルになっていて眺めるのが大変そうなので、Cで進めてみて対応可能な範囲にあればということで始めました。CのAPIC++/CLIで.NET用にラップしています。
 また、上位APIらしき「NITE」の中にC#ラッパー「ManagedNite.dll」も見つけました。しかし、現状では、オブジェクトブラウザーの検索で予想する単語が見つからず、すべての機能があるか不安だったので使っていません。
 今回のことが予習と呼べるように、将来、XNA Game StudioでKinectがサポートされたらいいなと思います。表示周りには使い慣れたXNA Game Studio 4.0を使っています。

蛇足

 この直前までには、XNA Game Studio 4.0のダイナミックオーディオを使ったソフトウェアシンセサイザーMML処理のアプリケーションなども開始していたのですが、これについてはまたの機会に。