Kinectで3D撮影できる条件と撮影範囲

Kinectセンサなどのアクティブステレオ法による3Dセンサでは、投影した投影パターンが画像上にきちんと映っている対象(距離や表面の材質)のみ、正確に3次元復元できます。つまり、デプスを計算するための既知のパターンがヒントとして対象にしっかり投影されてその様子がカメラ画像に映っている範囲のみが3D化できるので、遠すぎてパターンが投影されていない場所や、カメラ画像にパターンが映っている表面部分しか3D化できません。

このように1台の3Dセンサは、カメラの視野角の範囲でパターンが映っている表面範囲しか3Dできません。例えば段ボール箱を撮影しようとしても、1回の撮影では、KinectのIRカメラに映る表面しか3D化できません。このように、3Dセンサから見えている透視投影変換の範囲の表面形状だけを撮影したデータを、完全な3D全周囲形状では無い部分的な3Dデータであるという意味で、 俗に「2.5Dデータ」と呼ぶ事があります。

以下の具体的な点群で2.5Dデータの性質を見てみましょう。これは以前、筆者の研究室をKinectで3D点群として撮影したデータを、カメラ位置付近から見たものと、上方の視点から見たものです。上方から見ると、データ全体が透視投影変換モデルによって、カメラの視野角の範囲に扇型に広がっていることがわかりやすいと思います。ただ、Kinectは距離画像撮影ですので、カメラで映っている表面までしかデプスは撮影できておらず、テーブルの上のコップの後方に点群が存在しないことが、上方視点の画像からわかると思います。

図 2.5Dデータ(カメラ視点で見た点群と上方視点から見た点群)

KinectはIRカメラから50cm以降~8mあたりまでの範囲が撮影可能です(Kinect for Windowsのnearモードでは40cm以降も撮影可能。また、信頼してデプスが計測できる領域は4mくらいまで)。遠くにある対象を撮影しようとすると、投影パターンを更に大きくして赤外光も強くしないといけないで、その分だけカメラに近い場所に映る投影パターンも小さくなり、計測される距離画像の解像度も落ちます。またさらに、20~30mも先にある遠い対象をもし撮影したい場合、そもそもズームレンズでもないと細かい投影パターンを画像でとらえられません。こうした点を考えると、焦点距離が固定値で3D撮影するのであれば、遠くても10mあたりまでというKinectの撮影範囲は妥当とも言えます。これはアクティブステレオ法・三角測量全体に共通する話でありますが、Kinect以外のセンサでも光パターンがきちんと投影しにくい遠い場所の撮影は得意ではありません。近めの範囲をしっかり高精度に3D撮影するのがアクティブステレオの得意とするところです。

一方、今度は投影光と環境光の干渉についての話です。Kinectは可視光ではなく赤外光レーザーを投影パターンとして使用していますが、これは太陽光下では太陽光と大きく干渉してしまい、赤外線カメラにうまく投影パターンが映らず3D撮影ができません。したがってKinectは「太陽光が差し込んでいない室内環境で撮影を行うセンサ」といえます。逆に、赤外線の投影とカメラ設営で済むので、可視光の色の領域はすべて3D化できることがポイントです(正確に言うと、赤外線領域でパターン光と少し色が近い表面の色の領域は多少影響が出ているでしょうが)。

また、もう1つの重要な点として、髪の毛や半透明の物、衣服のレース部分など、光の透過性がある程度以上ある表面領域ではしっかりとパターンが投影しきれないので、3D化の精度が落ちるという原理的な側面があります。また、しわの多い衣服など、凹凸が多い表面だと、表面としてIRカメラに映っている領域しか3Dしかできないので、途中に3D化できてない穴が多い測定データになりがちです。別にこれはKinectに限ったことではないので、こうして欠落した場所を穴埋めする後処理を行ったりすることもあります。後に紹介する「多数の視点から個別に撮影したデータを1つのデータに位置合わせしてつなげていく(例:Kinect Fusion)」という応用も、こういう3Dセンシングの問題点がモチベーションとなっています。