「第6回 カメラを用いた3次元計測(1)」の続きです。今回はSubaruのEyeSightで採用されているステレオカメラ(パッシブステレオ法)にフォーカスを当て、OpenCVに実装されている一般的な手法について説明します。

ステレオカメラによる3次元計測は、下記の要素技術に大別できます。

  • カメラキャリブレーション
  • レクティフィケーション
  • 対応点探索(ステレオマッチング)

カメラキャリブレーションとレクティフィケーション

ステレオカメラでは、図1に示すとおり視点の異なる2台(または3台以上)を用いて、三角測量の原理で距離を求めます。たとえば、実空間中の3次元点P1CameraLCameraRで撮影すると、CameraLで撮像された点の座標pLと、CameraRで撮像された点の座標pRにズレが生じます。この見え方の差(視差)から距離を計測する手法です。

視差を求めるためには、CameraLの画像中の点に対応する点をCameraRの画像中から見つけ出す必要があります(対応点探索、ステレオマッチング)。そして、視差から3次元座標を計算するためには、CameraLCameraRの内部パラメータ、歪係数、さらにカメラAとカメラB間の外部パラメータが必要となります。これらのパラメータを求める処理がステレオカメラに必要なカメラキャリブレーションです。

これらのパラメータが求まっていれば、エピポーラ幾何と呼ばれる幾何学的な拘束条件により、対応点探索を効率的に行うことができます。CameraLCameraRを結ぶ直線と画像平面との交点はエピポール(eL , eR)と呼ばれています。また、3次元点P1CameraLの位置、CameraRの位置は同一平面上に存在し、その平面と画像平面が交わる直線pR-eRがエピポーラ線です。点P1, P2,……,P5 は、CameraLの画像では同一の点pLに投影されます。一方、点pLに対応するCameraRの画像上の点pRはエピポーラ線上に必ず存在することになります(図1)。つまり、対応点探索はエピポーラ線上のみを処理すれば良いわけです。

図1 エピポーラ幾何

エピポーラ幾何の拘束条件を用いることで、対応点探索はエピポーラ線上のみで良いのですが、エピポーラ線は多くの場合、画像上で斜めになってしまい、メモリアクセスやエピポーラ線の計算の効率が良くありません。そこで、カメラを平行に設置した平行ステレオ視が一般的に用いられます。カメラキャリブレーションにより求めた内部パラメータ、外部パラメータ、歪係数を用いることで画像を平行化できます(図2)。平行化処理は、レクティフィケーションと呼ばれています。レクティフィケーション後の画像では、エピポーラ線が画像の横軸と平行になるため、高速に対応点探索を行えるわけです。

図2 画像の平行化(レクティフィケーション)

対応点探索

対応点探索には、小領域毎に視差を求めるテンプレートマッチングによる方法、画像全体で最適な解を求めるグローバルマッチングによる方法、注目画素の周辺のみで最適な解を求めるセミグローバルマッチングによる方法があります。リアルタイム性を重視するのであれば、テンプレートマッチングによる方法が良いでしょう。リアルタイム性を重視しないのであればセミグローバルマッチングやグローバルマッチングを用いることもできます。

コーディング

OpenCVでは、“opencv/sources/samples/cpp/”にサンプルコード
“stereo_calib.cpp”と“stereo_match.cpp”が用意されていますので参考にしてみてください。ステレオカメラのカメラキャリブレーションでは、2台のカメラでキャリブレーションパターンを同時に撮影し、その画像セットをcv::stereoCalibrate(魚眼レンズの場合はcv::fisheye::stereoCalibrate、全方位カメラの場合はcv::omnidir::stereoCalibrate)の入力として、2台のカメラの内部パラメータ、歪係数、カメラ間の外部パラメータを求めることができます。そして、画像を平行化するレクティフィケーション処理は、cv::StereoRectify
(魚眼レンズの場合はcv::fisheye::StereoRectify、全方位カメラの場合はcv::omnidir::StereoRectify)で平行化するためのパラメータを求め、cv::initUndistortRectifyMap(魚眼レンズの場合はcv::fisheye::initUndistortRectifyMap、全方位カメラの場合はcv::omnidir::initUndistortRectifyMap)を用いて画素毎の変換テーブルを作成し、cv::remapで画像を補正します。

図3は、ステレオカメラの処理フローと処理結果です。Disparity Map(視差マップ)は、近くを白、遠くを黒として可視化したものです(テンプレートマッチングによる手法で求めた結果)。レクティフィケーションにより、2台のカメラにより撮像した画像を平行化できていることがおわかりいただけるかと思います。

図3 ステレオカメラの処理フローと処理結果

著者プロフィール

樋口未来(ひぐち・みらい)
日立製作所 日立研究所に入社後、自動車向けステレオカメラ、監視カメラの研究開発に従事。2011年から1年間、米国カーネギーメロン大学にて客員研究員としてカメラキャリブレーション技術の研究に携わる。

現在は、日立製作所を退職し、東京大学大学院博士課程に在学中。一人称視点映像(First-person vision, Egocentric vision)の解析に関する研究を行っている。具体的には、頭部に装着したカメラで撮影した一人称視点映像を用いて、人と人のインタラクション時の非言語コミュニケーション(うなずき等)を観測し、機械学習の枠組みでカメラ装着者がどのような人物かを推定する技術の研究に取り組んでいる。また、大学院での研究の傍ら、フリーランスとしてコンピュータビジョン技術の研究開発に従事している。

専門:コンピュータビジョン、機械学習