OpenNIでKinectスケルトントラッキング
ついに自前のプログラムで、スケルトンのトラッキングができました。何のことかというと、Kinectです。
Kinectは、以前よりプログラミングでいじりたいと思っていました。OpenKinectやOpenNIの登場により、ずいぶんと身近になりましたので、ここ数日、KinectをWindows 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のAPIをC++/CLIで.NET用にラップしています。
また、上位APIらしき「NITE」の中にC#ラッパー「ManagedNite.dll」も見つけました。しかし、現状では、オブジェクトブラウザーの検索で予想する単語が見つからず、すべての機能があるか不安だったので使っていません。
今回のことが予習と呼べるように、将来、XNA Game StudioでKinectがサポートされたらいいなと思います。表示周りには使い慣れたXNA Game Studio 4.0を使っています。