ステレオマッチング 自分メモ
とある目的のためにステレオマッチングをやりたい。
python + OpenCVでやる予定だけど、原理の話がわからなければ、関数を使えるわけもなし。
ざっくりと資料を集めて読んでいたらなんとなくわかってきたので、自分メモ。
メニュー
進行・わけかたは、tutorial*1になんとなくだいたい依拠します。
- カメラのキャリブレーション
- 姿勢推定
- エピポーラ線を求める
- ステレオマッチング
1.カメラキャリブレーション
以下の3つを求める作業。*2
・内部パラメータ
f:ピント c:画像中心。(下記の式のA)
・歪み係数
レンズの歪みで線がまるくなるのをまっすぐに直すためのパラメ。カメラに固有の値。(下記の式にはない。でもtutorialにはある。)
・外部パラメータ
カメラの姿勢に関するパラメ。回転行列Rと並進ベクトルtからなる。カメラに固有の値ではない。が、画像1枚1枚に依存する値なのかもよくわからない。
内部パラメータと歪み係数は、カメラに固有の値なので、ステレオマッチングの際も、カメラ1個ごとにそれぞれ求める(たぶん)。
外部パラメータは、ステレオカメラの場合は、2個同時に(2個を含んだ世界の座標系として)求める必要がある(たぶん)。
tutorialでキャリブレーションと呼んでいるのは、内部パラメータと歪み係数を求めることのみである。
画像内の座標(u, v)をベクトルm、
THE☆ワールド(実世界)の座標(x, y, z)をベクトルXとすると、
この両者の関係を内部パラメータと外部パラメータを使って以下のように表せられる。(by 教科書*5
m ~ A(R|t) X (~:両辺がその定数倍を許して等しい*6)
つまり3つのパラメータを求めることで、画像から3次元空間の測量ができる下地が出揃う。
具体的なキャリブレーションの方法
Zhangの方法とよばれる方法が一般的。他には、Tsaiの方法という3次元の方法もある*7。
サイズが既知のチェックボードを撮影し、その交点を自動的に探索させ、対応する画素と、現実の座標系上の点のペアを何個も何個も求める。
外部パラメータの同定にも、このチェックボードを使った方法を用いるはずなんだが、ステレオカメラを同時にする方法について説明しているドキュメントは少ない。この記事くらい。*10
これのpython版をつくる(よてい)
3つのパラメータ同定を同時にやっていいのか、
それとも内部パラメータだけ先に求めたりするのかも今のところ不明。
2.姿勢推定
たぶん外部パラメータを求めることを指す。
3.エピポーラ線を求める
求めない(え。
4のステレオマッチングに使う技術らしい。直接原理を理解して関数を書くのではなさそう。
外部パラメータの回転行列を求めて画像の平行化処理を行うと、マッチングがしやすくなるらしい。*11
4.ステレオマッチング
・ステレオカメラの設置の方法2種類
・トーイン撮影
・平行ステレオ
・平行ステレオだと、基線長(2つのカメラの物理的距離)と焦点距離の2つの定数を使った、簡単な式で、奥行が求められる。(じゃあ今までのキャリブレーションの話はなんだったんじゃい!)
・マッチングは自動処理。アルゴリズムにも、ブロックマッチングやグラフカットなど種類が。
*1:Camera Calibration and 3D Reconstruction — OpenCV-Python Tutorials 1 documentation
*2:と、ここではする。tutorialのキャリブレーションについてのドキュメントでは、内部パラメータと歪み係数を求めることのみの記述。
*3:Camera Calibration — OpenCV-Python Tutorials 1 documentation
*4:Camera Calibration — OpenCV-Python Tutorials 1 documentation
*6:そして正しくは、式のmとXは、ベクトルではない。ベクトルが表す同次座標であり、そのことを示す記法(記号の上に~がつく)を教科書ではしている。同次座標がなんなのかは知らない。
*7:http://www.eyedeal.co.jp/doc/stereo_algorithm.pdf
*8:http://www.eyedeal.co.jp/doc/stereo_algorithm.pdf