モーションセンサとしてのKinectと、その計測誤差

Kinect登場以前の構造光方式3Dセンサは、グレーコード法や位相シフト法のように、3~5枚ほどの複数パターンを数回に分けて投影した複数毎の画像から1つの3次元形状を復元するという仕組みが主流でした。こうした手法では、複数ごとを連続的に切り替えて撮影する数秒間のあいだは撮影対象が動かないようにしなければならず、そもそも移動する物や人は3次元化の対象外であることがほとんどでした。これに対してKinectでは、同じアクティブステレオでも動画で毎フレーム独立してデプス計算ができる仕組みになったので、後に説明するような人物姿勢推定と、それによるナチュラルユーザーインタフェース(ジェスチャー認識)を目的として「モーションセンサ」として幅広く実用できる3Dセンサとなったわけです。

一方で、Kinectはモーションとして人などの動きをとらえるのには向いている反面、デプスの精度は必ずしも正確ではなく、細かい形状を正確に捉える目的には限度があります。Kinectの精度については、登場時から多くのコンピュータビジョン研究者や技術者によって検証されているのですが、Kinectは近接撮影の範囲においても、最低でも1.5cm~2.5cmの計測誤差があることがわかっています。

姿勢推定のように人の大きなジェスチャーを捉えるのにはこの誤差でも十分ですが、例えば工場検査用途などの目的で数ミリ精度以上の精密な物体形状を計測したい場合にはKinectは使用できないことがわかると思います(Kinectのデプス計測誤差を他の計測手法と組み合わせて少し改善する手法はいくつか存在しているのですが、今回はそれらの紹介は省略します)。とはいえ、安価な3Dセンサであるのに、近接した範囲で対象を撮影すれば平均2cm程度の誤差で済むというのは、3Dセンサの業界から言えば革命的で素晴らしいことだと言えると思います。

Kinectで撮影できるデータの構造と撮影範囲。

Kinectは、ここまでデプス計測原理を説明してきた「IRカメラ-IRプロジェクタ」のペアに加えて、RGBカメラが搭載されている構成です。カメラ2台の撮影を同期した状態で、IR-カメラ-IRプロジェクターにより距離画像を、RGBカメラによりカラー画像をそれぞれ撮影するRGB-Dセンサです。以下のデモアプリケーションは、Kinectで撮影できるRGB画像(左)と距離画像(右)をそれぞれ表示してくれています。このようにKinectでは動画として2つの画像が連続的に計測されています。

Kinectで撮影できるRGBと距離画像

「距離画像」とは、カメラ撮影平面における画像の各画素に対応するその点のデプス値が保存されたグレー画像です。KinectではIRカメラのフレームレートである30fpsで距離画像が計測されます(IRカメラの画像から各画素でのデプス値を計算して距離画像を作成することによる)。距離画像では、カメラの撮影平面における各座標(x,y)におけるKinect(のIRカメラ)からのデプスZの値が画素値からわかるだけであり、まだその点における実世界のX,Y座標の値は求まっていません。そこで距離画像からカメラの透視投影変換モデルにより、実際の3次元座標に距離画像上でのX,Yの値を投影することで、3次元空間での各点X,Yの座標値が算出できます。

図:距離画像と、その透視投影

「透視投影変換」と専門用語で言うと難しく聞こえますが、要するにカメラ平面の情報を、カメラの視野角うち各画素が何度分の位置にあるかを画像全体の画素数からの比率により計算して、その求めた比率角により三角定理でデプスの値からX,Yの値を求めるだけの単純な投影処理です。現在の注目点が、カメラ平面が投影された仮想平面こうして、距離画像を透視投影変換で3D空間に投影すると、めでたく距離画像の各点の実世界での座標が、KinectのIRカメラ中心を原点とした座標系での座標値(X,Y,Z)として求まりました

このようにして撮影された、3次元上の点(X,Y,Z)の集合を、通称「点群(または「ポイントクラウド」)」と呼びます。Kinectなどの3Dセンサで計測できる距離画像のデプス値、および点群は、「実スケールの座標で得られる」という点が非常に重要です。例えば画像で人を撮影しただけでは、その人の身長や横の幅の実寸は(スケールのわかる目印を同時に映さないと)わからないですが、Kinectなどの3Dセンサの場合、点群は全て実寸で計測されるので、例えば撮影した人の3D形状からそのまま身長や胴回りを計ることも可能になります。3D形状計測を行うと、実世界のスケールで3D形状をそのまま獲得することができることになり、これは画像を入力で行うコンピュータビジョンからの大きな優位性となります。