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

書籍はなかなか読み進められなかったので、飛ばし読みしてプログラムを動かしながら徐々にディティールを理解していく方針へ切り替えた(笑)
何度か格闘するも上手くいかないOpenCVのsfmモジュールのビルドもいったん諦めて、もっとプリミティブな関数をいじってお勉強しようと思う。
以前見つけたこちらのチュートリアルのサンプルコードでfindEssentialMat関数、つまりNist´erの5点アルゴリズムをいじってみる。

このサンプルコードはヘッダーファイルを含めても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)
- 画像ペア:
,
の取得
- 上記画像の歪みを補正する。
からFASTアルゴリズムで特徴点を抽出し、それらの特徴点の
までの移動を追跡する。 特徴点の数が特定の閾値を下回った場合、新しい特徴点を検出する。
- Nisterの5点アルゴリズム(with RANSAC)によってEssential Matrix(基本行列)を算出する。
- 上記ステップで求めたEssential Matrix(基本行列)から
と
を推定する。
- スピードメーター等の外部ソースからスケール情報を取得し、並進ベクトル
と回転行列
とを連結する。
ということで、詳しく知りたいのは特に4と5の基本行列を求めてそれを回転行列と並進ベクトル
へ分解するプロセスです。
サンプルコードで言うとほんの一部。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もいじってみた↓

関連記事
Deep Fluids:流体シミュレーションをディープラーニ...
geometry3Sharp:Unity C#で使えるポリゴ...
参考書
立体視を試してみた
Raspberry Piでセンサーの常時稼働を検討する
法線マップを用意してCanvas上でShadingするサンプ...
Mayaのシェーディングノードの区分
Composition Rendering:Blenderに...
科学技術計算向けスクリプト言語『Julia』
3分の動画でプログラミングを学習できるサイト『ドットインスト...
オープンソースの顔の動作解析ツールキット『OpenFace』
書籍『仕事ではじめる機械学習』を読みました
Swark:コードからアーキテクチャ図を作成できるVSCod...
画像認識による位置情報取得 - Semi-Direct Mo...
Caffe:読みやすくて高速なディープラーニングのフレームワ...
SSII 2014 デモンストレーションセッションのダイジェ...
Google App EngineでWordPress
C#で使える遺伝的アルゴリズムライブラリ『GeneticSh...
AndroidもopenGLも初心者さ (でもJavaは知っ...
R-CNN (Regions with CNN featur...
html5のcanvasの可能性
UnityのAR FoundationでARKit 3
Blender 2.8がついに正式リリース!
Runway ML:クリエイターのための機械学習ツール
PCA (主成分分析)
konashiのサンプルコードを動かしてみた
オープンソースのIT資産・ライセンス管理システム『Snipe...
Iterator
Point Cloud Libraryに動画フォーマットが追...
TensorFlowでCGを微分できる『TensorFlow...
WordPress on Google App Engine...
ROMOハッカソンに行ってきた
ブログのデザイン変えました
網元AMIで作ったWordpressサイトのインスタンスをt...
MB-Lab:Blenderの人体モデリングアドオン
Mitsuba 2:オープンソースの物理ベースレンダラ
MeshLab:3Dオブジェクトの確認・変換に便利なフリーウ...
ブラウザ操作自動化ツール『Selenium』を試す
PyTorch3D:3Dコンピュータービジョンライブラリ
Mayaのレンダリング アトリビュート
Regard3D:オープンソースのStructure fro...
Unity Scriptコーディング→Unreal Engi...


コメント