サイトアイコン NegativeMindException

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

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

Output

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


スポンサーリンク

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

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

ということで、詳しく知りたいのは特に45基本行列を求めてそれを回転行列と並進ベクトルへ分解するプロセスです。
サンプルコードで言うとほんの一部。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種類のと1つの(組み合わせで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点が任意の位置にあるような条件らしい。

追記:その後、OpenCVの三角測量関数 cv::triangulatepointsもいじってみた↓
OpenCVの三角測量関数『cv::triangulatepoints』
だいぶ時間が空きましたが、引き続きOpenCVの3次元復元系の関数を見ていく。今回はcalib3dモジュールにあるtriangulatePoints関数。つまり三角測量を行う関数ですね。void cv::triangulatePoints(...


スポンサーリンク

関連記事

  • PythonでMayaのShapeノードプラグインを作る
  • OpenMVS:Multi-View Stereoによる3次元復元ライブラリ
  • WordPressのサーバ引っ越し方法を考える
  • Qlone:スマホのカメラで3Dスキャンできるアプリ
  • 手を動かしながら学ぶデータマイニング
  • Autodesk Mementoでゴジラを3次元復元する
  • MLDemos:機械学習について理解するための可視化ツール
  • 「ベンジャミン·バトン数奇な人生」でどうやってCGの顔を作ったのか
  • OpenCVでiPhone6sのカメラをキャリブレーションする
  • ブラウザ操作自動化ツール『Selenium』を試す
  • COLMAP:オープンソースのSfM・MVSツール
  • 顔画像処理技術の過去の研究
  • Maya API Reference
  • Unity MonoBehaviourクラスのオーバーライド関数が呼び出される順番
  • 読みやすくて高速なディープラーニングのフレームワーク『Caffe』
  • SSII2014 チュートリアル講演会の資料
  • OpenCV 3.1のsfmモジュールを試す
  • BlenderのPython環境にPyTorchをインストールする
  • UnityのGameObjectの向きをScriptで制御する
  • Mayaのシェーディングノードの区分
  • UnrealCLR:Unreal Engineで.NET Coreを利用できるプラグイン
  • HD画質の無駄遣い その2
  • UnityでLight Shaftを表現する
  • libigl:軽量なジオメトリ処理ライブラリ
  • 書籍『3次元コンピュータビジョン計算ハンドブック』を購入
  • Mean Stack開発の最初の一歩
  • Mayaのレンダリング アトリビュート
  • 池袋パルコで3Dのバーチャルフィッティング『ウェアラブル クロージング バイ アーバンリサーチ』
  • OpenGVの用語
  • オープンソースのプリント基板設計ツール『KiCad』
  • AMIMOTO(PVM版)で作成したインスタンスをAMIMOTO (HVM版)へ移行する
  • Mitsuba 2:オープンソースの物理ベースレンダラ
  • SDカードサイズのコンピューター『Intel Edison』
  • ROSの薄い本
  • OpenAR:OpenCVベースのマーカーARライブラリ
  • Unityの各コンポーネント間でのやり取り
  • DCGAN (Deep Convolutional GAN):畳み込みニューラルネットワークによる敵...
  • SSD (Single Shot Multibox Detector):ディープラーニングによる一般...
  • 機械学習に役立つPythonライブラリ一覧
  • WordPress on Google App Engineを1週間運用してみて
  • AmazonEC2のインスタンスをt1.microからt2.microへ移行する
  • 書籍『イラストで学ぶ ディープラーニング』
  • モバイルバージョンを終了