cvl-robot's diary

研究ノート メモメモ https://github.com/dotchang/

OpenCVでステレオ画像処理

(編集中)

3次元形状データは,キネクトやRealSenseのようなデバイスを使えば簡単に取得できるようになってきています.しかし,赤外線を使うデバイスは,屋外の太陽光の下で使用できないという課題があります.そのため,自動車の運転補助に使われるデバイスとして,しばしばステレオカメラが用いられます.

ステレオカメラの基本原理は三角測量なので簡単ですが,実際に使おうとするとキャリブレーションの精度と計算速度に悩まされることになります.

準備

(a)だいたい特性の揃った2つ以上のカメラを,数cm~数10cm離して物理的に固定する.参考までに,人間の目はだいたい60~70㎜離れているそうです.調整可能なレンズの場合,およそ同じようにズームや絞りを調整して動かさないようにしておく.

f:id:cvl-robot:20140203174954j:plain

(b)キャリブボードを作成する.平らな硬い板にチェッカーパターン(たとえば、http://opencv.jp/sample/pics/chesspattern_7x10.pdf)を印刷した紙を張り付ける.縦横のマス目の数と,1マスの1辺の長さを定規などで実測しておく.

(c)全てのカメラで計測した画像をファイルに出力するプログラムを書く.

参考までに,PointGreyのGigEカメラ BlackFly2台ではこんな感じに書きます.

念のため,GigECameraを2台以上1台のPCにつなぐ場合,HUBを介して2本を一本に束ねて繋ぐのではなく、USBやサンダーボルトなどのネットワークインターフェースをそれぞれに用意して,ネットワーク帯域を確保してやる必要があります.

GigECameraCap.h 

https://gist.github.com/8780537.git

gist.github.com

GigECameraCap.cp

https://gist.github.com/8780586.git

GigEStereoCapture.cp

https://gist.github.com/8780606.git

 rキーで画像をファイルに保存します.

キャリブレーション

カメラキャリブレーションは,カメラのレンズ歪みなどを表す内部カメラパラメータと、2つのカメラの相対位置姿勢を表す外部カメラパラメータを求める処理です.古典的な方法では,大きさや配置が既知のチェッカーボードをカメラの前で,計測したい範囲にまんべんなく動かし,各場所で様々に姿勢を変えて画像を記録して,チェッカーボードの交点をヒントに特徴点を抽出して各パラメータを求めます.すべてのカメラからキャリブレーションボードが正しく見えている必要があります.てっとり早くキャリブレーションをしてみたい場合,openCVのサンプルを使います.

参照先は、c:/opencv/sources/samples/stereo_calib.cppを見てください.

main関数の中で呼ばれている、

StereoCalib(imagelist, boardSize, true, showRectified);

が重要な関数で,その前までは画像リストを作っているだけです。

参考文献:

[1]Gary Bradski, Adrian Kaebler: 詳解OpenCV, オライリージャパン, pp.453--460, 2009.

[2]http://blackfly.ptgrey.com/GIGE/Blackfly

[3]http://taishoh-lab.net/blog/?p=35