/GetDepthKinect2

Kinect (v2) からデプスとカラーを取ってテクスチャに突っ込むクラスとそのサンプルプログラム

Primary LanguageCzlib LicenseZlib

GetDepthKinect2

Kinect (v2) からカラーとデプスを取得する方法を解説するためのサンプルプログラム

Copyright (c) 2011, 2012, 2013, 2014, 2015 Kohe Tokoi. All Rights Reserved.

Permission is hereby granted, free of charge,  to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction,  including without limitation the rights
to use, copy,  modify, merge,  publish, distribute,  sublicense,  and/or sell
copies or substantial portions of the Software.

The above  copyright notice  and this permission notice  shall be included in
all copies or substantial portions of the Software.

THE SOFTWARE  IS PROVIDED "AS IS",  WITHOUT WARRANTY OF ANY KIND,  EXPRESS OR
IMPLIED,  INCLUDING  BUT  NOT LIMITED  TO THE WARRANTIES  OF MERCHANTABILITY,
FITNESS  FOR  A PARTICULAR PURPOSE  AND NONINFRINGEMENT.  IN  NO EVENT  SHALL
KOHE TOKOI  BE LIABLE FOR ANY CLAIM,  DAMAGES OR OTHER LIABILITY,  WHETHER IN
AN ACTION  OF CONTRACT,  TORT  OR  OTHERWISE,  ARISING  FROM,  OUT OF  OR  IN
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

KinectV2 クラスについて

  • KinectV2 クラスは Kinect (v2) からカラーとデプスを取得します。
  • 取得したカラーとデプスは OpenGL のテクスチャに格納します。
  • カラーのサンプリングに使うテクスチャ座標も計算します。
  • Kinect for Windows SDK 1.8 を使います。
  • 実は使い方をこれに合わせた "KinectV1" っていうクラスもあります。

KinectV2 クラスの使い方

  • KinectV2 クラスのオブジェクトを作ってください。
  • Kinect v2 は一台の PC につき一台しか使えません。
  • getActivated() メソッドは Kinect v2 が使えれば 1 を返します。
  • これが 0 なら Kinect の起動に失敗してます。
  • getDepth() メソッドを呼ぶとデプスをテクスチャに転送し、そのテクスチャを bind します。
  • この時、同時にカラーのサンプリングに使うテクスチャ座標も計算します。
  • getCoordBuffer() メソッドはテクスチャ座標の格納先のバッファオブジェクトを返します。
  • これを描画する VAO に組み込んでカラーデータをマッピングしてください。
  • getColor() メソッドはカラーをテクスチャに転送し、そのテクスチャを bind します。
  • getPoint() メソッドは頂点位置をテクスチャに転送し、そのテクスチャを bind します。
  • とにかく main.cpp を読んでください。

サンプルプログラムについて

  • OpenGL のテクスチャに入っている Kinect のデータを使ってポリゴンメッシュを描きます。

  • シェーダを使ってテクスチャに入っているデプスからポイントの座標を求めて FBO に格納します。

  • NuiTransformDepthImageToSkeleton() 相当の計算を position.frag で行っています。

  • position.frag で作ったテクスチャから normal.frag を使って法線ベクトルを求めています。

  • この二つのテクスチャとカラーのテクスチャを使ってメッシュをレンダリングしています。

  • 頂点属性はテプスとカラーのテクスチャをサンプリングするテクスチャ座標だけを送っています。

  • simple.frag の main() の内容を変更してみてください。

    • fc = idiff + ispec;

      • グレーに陰影がついたものになります。
      • マテリアルは main() の material で設定しています。
    • fc = texture(color, texcoord);

      • メッシュにカラーがマッピングされます。
    • fc = texture(color, texcoord) * idiff + ispec;

      • メッシュにカラーをマッピングして、さらに正面から光を当てます。
      • 陰影をつけたものに陰影を重ねてつけるので、かなり変になります。
  • すんません Release ビルドだと Kinect からデータを受け取れません。

サンプルプログラムの操作方法

  • マウスの左ドラッグで視点を上下左右に移動できます。
  • マウスの右ドラッグで視点の向きを変更できます。
  • マスのホイールで向いている方向に前後できます。
  • ESC で終了します。

その他

  • このプログラムは学生さんに説明するために書き始めたものですので、実用的ではありません。
  • テプスを頂点属性ではなくテクスチャにしたのは GPU によるフィルタリングの実験に使うためです。
  • 計測不能点は discard してもよかったんですが、これもある目的のために遠方に飛ばしています。