C++ ときどき ごはん、わりとてぃーぶれいく☆

USAGI.NETWORKのなかのひとのブログ。主にC++。

memo; KinectのrawなDepth値と実空間での距離の関係

疑問

Kinectから取得できるイメージセンサーの情報は基本的に2つ。1つはRGB/IR-camのデータ(例えばVGA、R8G8B8、30FPSの色付き画像群)、もう1つはdepthデータ(例えばVGA、D11、30FPS)。しかしこのdepthデータが曲者で、D11の値そのままでは値の物理的対応が不明で割とどうにも役に立たない。役に立たない事にはすぐに気がつくし、OpenKinect/libfreenectやOpenNIのリファレンスサンプルで謎の非線形応答のファクターがセンサーから取得したRAWなD11値に掛けてあったりするのも見つけられる。例えばlibfreenectのサンプルでは「正規化して3乗して6倍」しているのだが理由がはっきりと分からない。無次元数でそうすると上手く行くとしても、センサーの物理的特性がそないだから、ではどうももやもやが残る。

答え

そこで少々調べて見ると最初にReferenceとして紹介した先人Nathan Crockのhttp://mathnathan.com/2011/02/03/depthvsdistance/なる記事が見つかった。感謝しつつ以下にこの概要をメモする。

Nathanの記事は「Kinectのdepth値の実空間への対応は科学的に取り扱おうって人には気になるよね」みたいな導入になっている。

実験

とりあえず測って対応付けよう、と。そして実際の[2,3..10]ftの距離におけるKinectのRAWなdepth値をプロットした結果を示している("Kinect Depth Measurement vs. Actual Distance")。

実験結果

この結果をNathanのボスに報告したところKinectのRGB-camとIR-camについての視線とKinectの撮像面、焦点距離などから続く結論の式を得た。

結論
z = 34800/(1091.5-d)
where
  z: actual distance [cm]
  d: Kinect raw depth value [-]