第16回目の今回から数回にわたって、カメラを用いた3次元計測手法について紹介します。
今回は、まず全体像について説明します。
カメラを用いた3次元計測技術は、下記のとおりに大別できます(※この分類は一例です)。
・ステレオ法
・Shape from X
・ToF (Time of Flight)
ステレオ法
ステレオ法には、2台のカメラを用いるパッシブステレオ法(ステレオカメラ)と、スリット光やパターン光を投影するアクティブステレオ法があります。スバルのEyeSightは、前者のパッシブステレオ法を採用しています。Microsoftの第一世代のKinectは後者のアクティブステレオ法を用いています。
■パッシブステレオ法(ステレオカメラ)
ステレオカメラでは、図1に示すとおり視点の異なる2台(または3台以上)のカメラを用いて、三角測量の原理で距離を求めます。例えば、実空間中の3次元点PをカメラAとカメラBで撮影すると、カメラAの画像平面上の撮像された点の座標PAと、カメラBの画像平面上の撮像された点の座標PBにズレが生じます。パッシブステレオ法は、この見え方の差(視差)から距離を計測する手法です。
図1 ステレオカメラの概要
■アクティブステレオ法
アクティブステレオ法は、パッシブステレオ法の片方のカメラが、光を投影するプロジェクタに置き換わったものです。古くから研究開発されてきた、スリット光を用いた光切断法という手法があります。直線状のスリット光を照射すると、物体の形状による起伏により直線が歪みます。その直線の歪みをもとに物体の3次元形状を計測する技術が、アクティブステレオ法です。
また、スリット光以外にパターン光を用いる手法もあります。Microsoftの第一世代のKinectでは、目に見えない近赤外線のドットパターンを投影し、それをカメラで撮影してドットパターンのズレを求め、距離を計測します。第一世代のKinectについては、こちらの記事が参考になります。
Shape from X
Shape from Xは、カメラで撮影した画像と+αの情報を用いて、被写体の3次元形状を測定する手法です。その+αがShape from Xの「X」です。Xには、動き(Motion)、輪郭(Silhouette)、陰影(Shading)などがあります。
■Structure from Motion (Visual SLAM)
Shape from Motionは、一般的にはStructure from Motion、あるいはVisual SLAM(Simultaneous Localization and Mapping)と呼ばれています。Structure from Motionは、複数の視点から撮影した複数の画像から3次元形状を計測する技術です。下の動画は、ECCV2014で発表されたLSD-SLAMと呼ばれる手法です。カメラを動かし、様々な視点から撮影することで3次元形状を計測している様子が分かるかと思います。
■Shape from Silhouette
Shape from Silhouetteは、複数の視点で撮影した画像中の物体のシルエットから、3次元形状を復元する手法です。視体積交差法と呼ばれています。物体のシルエットを正確に切り出す必要があるため、3次元計測対象の物体が存在しない画像を事前に撮影するか、背景を単色など(下の動画では黒)にする必要があります。
■Shape from Shading
Shape from Shadingは、物体の表面の陰影から形状を復元する手法です。例えば、球体に光が当たると真正面から光が当たった部分が最も明るく、そこから遠ざかるにつれて徐々に暗くなっていきます。Shape from Shadingでは、この明るさの変化から物体の形状を復元するわけです。材質や表面のテクスチャの影響を大きく受けるというデメリットがあります。
ToF(Time of Flight)
Microsoftの第二世代のKinectではこの手法が採用されています。原理を簡単に説明すると、光を照射し、その光が物体に当たって反射して戻ってくるまでの時間をもとに距離を計測する手法です。Kinectについては、こちらで詳しく解説されていますので、興味のある方は読んでみてください。
次回は、スバルのEyeSightで採用されているステレオカメラ(パッシブステレオ法)にフォーカスして、OpenCVに実装されている一般的な手法について説明します!