読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

FloorClipPlaneを使ってKinectの傾きを補正する

Kinect for Windows v2

こんな感じでKinectを斜めに設置したとき、

f:id:kaorun55:20160418142547j:plain

得られるデータ(カメラ座標系)はナナメになります。

f:id:kaorun55:20160418144011p:plain

これを補正するために、FloorClipPlaneという「床の向きベクトル」と「Kinectの高さ」があるのですが、実際の補正コードがあまり見つからなかったので残しておきます。

FloorClipPlaneを適用するとこんな感じになります。

f:id:kaorun55:20160418144133p:plain

真横から。

f:id:kaorun55:20160418144158p:plain

床のY座標が0になり、傾きも補正されます。

コード

コードのベースはこちらを使用していますが、実際に動くコードではないので動くようにしました。

gamedev.stackexchange.com

コード全体はこちらです。

github.com

表示には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だとこのあたりも参考になるかと思います

www.buildinsider.net