OpenCVのfindEssentialMatでの内部パラメータの用途

OpenCV

5-point algorithm (5点アルゴリズム)を使いたくて、OpenCVに確か実装されてたよなーって思って調べてみると、なぜか関数の入力に内部パラメータが必要とされていました。
OpenCVの5-point algorithmはこの論文を実装してるはずなので、軽く読んでみたけどやっぱり焦点距離は必要ない気がしたので、OpenCVのコードを見てみました。

Nistér, D. An efficient solution to the five-point relative pose problem, CVPR 2003.

findEssentialMat

OpenCVで5-point algorithmを扱っているのはfindEssentialMatという関数で、中身はこんな感じになっています。

29行目から32行目で内部パラメータを使っています。どうにも画像座標をカメラ座標へ変換するのに使っているようです。
また、38行目で焦点距離でRANSACで使う閾値を除算しています。これは29~32行目で焦点距離で除算してるのに合わせてるだけっぽいです。

なのでおそらく、ここでは焦点距離の値は何でもよくて、画像座標系の原点を画像の左上から画像の中心(光学中心)に移動させるっていう意味合いが強いのだと思います。
ですので、あらかじめ各特徴点を光学中心を原点にしたものに変換してから_points1, _points2に与えてやれば、内部パラメータは焦点距離=1.0, 光学中心=(0.0, 0.0)としても多分問題ないです。

だからこんな感じでデフォルトパラメータの焦点距離が1.0で光学中心が(0.0, 0.0)になっているのでしょうね。

findEssentialMatは2枚の画像で同じ内部パラメータを使う前提なのですが、あらかじめカメラ座標系に変換してやって_points1, _points2に渡してやることで、2枚の画像で別々の内部パラメータを使うことができるはずです。

※ 論文もコードも深追いしたわけではないので、間違えがあれば教えてください。

コメント

%d人のブロガーが「いいね」をつけました。