Kinect for Windows SDK betaめも

MicrosoftからKinect for Windows SDK beta がでたので勉強してみようかと思い立ったのででめも。

  • 内容のレベルはおそらく低いです。
  • 途中で挫折するかも
  • 音声関連に手をつけるつもりは今のところなし
  • OpenCVと一緒に使いたい
  • C# は全く知らないので、ほんの少しだけ知っているC++で頑張る

とりあえずこの資料から
[http://research.microsoft.com/en-us/um/redmond/projects/kinectsdk/docs/ProgrammingGuide_KinectSDK.pdf/ProgrammingGuide_KinectSDK.pdf

Kinect for Windows SDK beta の肝の NUI(Natural User Interface) API のデータの肝

  • Color data

下の2つから選べる

    • RGB color
X8R8G8B8の32bitデータ(X8って不定ってこと?)。
    • YUV color
  UYUVのいわゆるYUV422フォーマット。sRGBのγをかけた後のデータ。このときは、解像度640x480, フレームレート15FPS固定。
  • Depth data
  距離データ。XY方向の解像度は640x480, 320x240, 80x60pixel。Z(奥行き)方向の解像度は13bitでミリメータ単位(スゲェ)。
  最も近いオブジェクトまでの距離を表す。
  画素値がゼロのときは、Kinectセンサーが何もオブジェ区尾を検出できてないことを表す。
  XY座標軸は は物理的な単位ではなく、depth imaging sensor内での画素。
  • Player segmentation data
 1つKinectセンサー(Kinectセンサーを複数扱うこともできるので)で2人の人間(player)を認識できる。各画素は、playerのインデックスに対応付けられる。
  depth dataとplayer segmentation dataがマージされた1つのフレームになる。
  距離を表す上位13birのデータと、playerのインデックスを表す下位3bitのデータ。

画像データの取り扱い方は、主に下の2つのうちのどちらか

  • モデルをポーリングする
  C++ では NuiImageGetNextFrame APIでcolor, depth dataをポーリングする。
  • event model
  いわゆるイベントドリブン型。スケルトンでイベントが発生したら取り込む?。NuiImageStreamOpen API を使う。

座標空間いろいろ

  • Depth Image Space

上のDepth dataを参照のこと

  • Skelton space

Depth Image Spaceと違って、距離で表される。右手の法則の座標空間で、Z軸はセンサーに向かう方向、Y軸は上方向、X軸はセンサーに対して(センサーを正面から見たときに)左方向に向かう。
重力の方向を設定することで、XY軸の調整ができるらしい。vNormalToGravity, NUI_SKELETON_FRAME, SkeletonFrame.NormalToGravity。

    • Floor Determination

スケルトン追跡システムは、背景を分離して人を抽出するために各フレームでフロアープレーンを推測する。

    • Skeletal Mirroring

通常は左右反転して取り込むけど、反転しないことも可能