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

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



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

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


このサンプルコードはヘッダーファイルを含めても300行未満なので読みやすいはず。
https://github.com/avisingh599/mono-vo

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

というか、まずはこのブログ記事を読むところからかな。
http://avisingh599.github.io/vision/monocular-vo/


スポンサーリンク


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

課題設定 (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. スピードメーター等の外部ソースからスケール情報を取得し、並進ベクトルtと回転行列Rとを連結する。

ということで、詳しく知りたいのは特に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点アルゴリズム)ってファイル名なのね。

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



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

5点アルゴリズムで推奨されるのは、5点の内の3点が同一平面状にあり、残り2点が任意の位置にあるような条件らしい。


スポンサーリンク

関連記事

読みやすくて高速なディープラーニングのフレームワーク『Caffe』
ブログが1日ダウンしてました
1枚の画像からマテリアルを作成できる無料ツール『Materialize』
3Dデータ処理ライブラリ『Open3D』
顔検出・認識のAPI・ライブラリ・ソフトウェアのリスト
ニューラルネットワークで画像分類
python-twitterで自分のお気に入りを取得する
OpenCVの三角測量関数『cv::triangulatepoints』
書籍『ROSプログラミング』
3Dオブジェクトの確認・変換に便利なフリーウェア『MeshLab』
オープンソースの汎用レンダラ『Mitsuba 2』
AMIMOTO(PVM版)で作成したインスタンスをAMIMOTO (HVM版)へ移行する
RefineNet (Multi-Path Refinement Network):ディープラーニン...
UnityのMonoBehaviourクラスをシングルトン化する
Mask R-CNN:ディープラーニングによる一般物体検出・Instance Segmentatio...
手を動かしながら学ぶデータマイニング
OpenCV 3.1のsfmモジュールのビルド再び
WebGL開発に関する情報が充実してきている
Mechanizeで要認証Webサイトをスクレイピング
Raspberry PiでIoTごっこ
WordPressの表示を高速化する
3D復元技術の情報リンク集
Kinect for Windows v2の日本価格決定
オープンソースの人体モデリングツール『MakeHuman』のAPI開発プロジェクトがスタート
WordPressプラグインの作り方
OpenCV 3.3.0 contribのsfmモジュールのサンプルを動かしてみる
Verilog HDL
写真に3Dオブジェクトを違和感無く合成する『3DPhotoMagic』
OpenCVのための軽量GUIライブラリ『cvui』
UnityプロジェクトをGitHubで管理する
PyDataTokyo主催のDeep Learning勉強会
PCA (主成分分析)
OpenCVの超解像処理モジュール『Super Resolution』
オーバーロードとオーバーライド
オープンソースのロボットアプリケーションフレームワーク『ROS (Robot Operating S...
MythTV:Linuxでテレビの視聴・録画ができるオープンソースプロジェクト
ZScript
3Dボリュームデータ処理ライブラリ『OpenVDB』
WordPressのサーバ引っ越し方法を考える
iOSデバイスのためのフィジカル・コンピューティングツールキット『konashi(こなし)』
SegNet:ディープラーニングによるSemantic Segmentation手法
フィーリングに基づくタマムシの質感表現

コメント