こんな感じでKinectを斜めに設置したとき、
得られるデータ(カメラ座標系)はナナメになります。
これを補正するために、FloorClipPlaneという「床の向きベクトル」と「Kinectの高さ」があるのですが、実際の補正コードがあまり見つからなかったので残しておきます。
FloorClipPlaneを適用するとこんな感じになります。
真横から。
床のY座標が0になり、傾きも補正されます。
コード
コードのベースはこちらを使用していますが、実際に動くコードではないので動くようにしました。
コード全体はこちらです。
表示にはSharpGL、ベクトル演算はMath.Netを使っています。Kinect SDKも含めてNuGetで入れていますので環境ができていれば追加のインストールはありません。
FloorClipPlaneからmatrixの計算はこんな感じです。FloorClipPlaneはVector4型の値であり、X,Y,Zは床の向きベクトル、WはKinectの高さとなっています。床が検出できない場合はWが0になります。
上記サイトと比べて、行と列が逆、rotationとtranslationのかける順序が逆になります。
gist62fd26e82208bd0e388b12c081ffe563
計算したmatrixを点群の座標に適用すると補正された値になります。ちなみにこの補正はカメラ座標系に効くのでBodyの補正もできます。
gist566eb8f2037eed23cb110f5652f68d10
C++(PCL,Eigen)
C++でPCLとEigenだともう少しコードがシンプルでいいんですけどね。
gist9d204509dc181c403891d1cf2110ac61
Unity
Unityだとこのあたりも参考になるかと思います