OpenCVのfindEssentialMat関数を使ったサンプルを読んでみる

本来なら例の書籍を読み進めて少しずつ理解していくつもりだったけど、しんどい。。。

書籍『3次元コンピュータビジョン計算ハンドブック』を購入
期待していた書籍「3次元コンピュータビジョン計算ハンドブック」がついに発売されたので購入。 3次元シーンを撮影した画像を解析して3次元情報を抽出するコンピュータビジョンの基礎技術を記述している.理論は最小限に抑えて,実際にプロ...

書籍はなかなか読み進められなかったので、飛ばし読みしてプログラムを動かしながら徐々にディティールを理解していく方針へ切り替えた(笑)

何度か格闘するも上手くいかないOpenCVのsfmモジュールのビルドもいったん諦めて、もっとプリミティブな関数をいじってお勉強しようと思う。
以前見つけたこちらのチュートリアルのサンプルコードでfindEssentialMat関数、つまりNist´erの5点アルゴリズムをいじってみる。
OpenCVでカメラ画像から自己位置認識 (Visual Odometry)
書籍「ROSではじめる ロボットプログラミング」を一通り読み終わって、何となくロボットの自己位置認識の重要性を感じている。 ロボット自身の移動量を計測する手法全般を"Odometry"と言うらしい。 中でも1番簡単なやり方は、車...

このサンプルコードはヘッダーファイルを含めても300行未満なので読みやすいはず。

このリポジトリのmono-vo/src/visodo.cppを読んでみる。

というか、まずはこのブログ記事を読むところからかな。


スポンサーリンク



ブログ記事の一部を雑に日本語訳。

課題設定 (Formulation of the problem)

Input

カメラから取得したグレイスケールのストリーム画像を入力とし、時刻 t, 時刻t+1の時点で取得した画像をそれぞれI^t, I^{t+1}と呼びます。カメラの固有パラメータは事前にキャリブレーションによって取得済みです。キャリブレーションはOpenCVでも行うことができます。

Output

全ての画像ペアで、2枚の画像間の車両の移動を表す回転行列 Rと並進ベクトルtを求める必要があります。我々の単眼手法では並進ベクトルtのスケール要素までは計算できません。

アルゴリズムの概要 (Algorithm Outline)

  1. 画像ペア:I^t, I^{t+1}の取得
  2. 上記画像の歪みを補正する。
  3. I^tからFASTアルゴリズムで特徴を抽出し、それらの特徴のI^{t+1}までの移動を追跡する。 特徴の数が特定の閾値を下回った場合、新しい特徴の検出を検出する。
  4. Nisterの5点アルゴリズム(with RANSAC)によってEssential Matrix(基本行列)を算出する。
  5. 上記ステップで求めたEssential Matrix(基本行列)から Rtを推定する。
  6. スピードメーター等の外部ソースからスケール情報を取得し、並進ベクトルと回転行列とを連結する。

ということで、詳しく知りたいのは特に45基本行列を求めてそれを回転行列Rと並進ベクトルtへ分解するプロセスです。
サンプルコードで言うとほんの一部。116~119行目の辺りですね↓

  //recovering the pose and the essential matrix
  Mat E, R, t, mask;
  E = findEssentialMat(points2, points1, focal, pp, RANSAC, 0.999, 1.0, mask);
  recoverPose(E, points2, points1, R, t, focal, pp, mask);

findEssentialMatで求めた基本行列を回転行列と並進ベクトルへ分解する関数は上記のrecoverPoseだけじゃなく、decomposeEssentialMatというのも用意されてるんだが、decomposeEssentialMatでは特異値分解で2種類のRと1つのt(\pm組み合わせで4つの解)が算出される。
唯一の解を求めたい場合はrecoverPoseを対応点の情報も突っ込んで使う。

ちなみに、findEssentialMat関数の中身のコードはこちら→modules/calib3d/src/five-point.cpp
five-point(5点アルゴリズム)ってファイル名なのね。

さて、オイラが何でこんなにしつこく勉強しているかというと、画像認識技術を測量ツールとして使いたかったりするのです。

2D→3D復元技術で使われる用語まとめ
2次元の画像から3次元の情報を復元するプログラムを本格的に実装してみようと思って、まずはOpenGVから触り始めたんだけど、オイラの基礎知識が乏し過ぎて苦戦中。 まだOpenGVに同梱されているtestコードをいじってみている段階...

http://pukulab.blog.fc2.com/blog-entry-44.html


スポンサーリンク

関連記事