2014-09-24 (水)
* SfM(Structure from Motion)
SfMは,視点の異なる複数の画像から立体を復元する手法です.
よく使われているSfMのライブラリには,OpenMVG と Bundlerがあるようです.
どちらの実装も,GitHub上で公開されています.
とりあえずOpenMVGのほうがビルドが楽そうだったので,今回はOpenMVG.Bundlerもあとで試す.
OpenMVG とか Buldler使う前にこのあたりも読むと良さそう. http://www.ite.or.jp/data/journal/passed_issues/tool1104/
OpenMVGのビルド(Windows + VC++ Express)
環境.
- Windows 7
- Visual Studio 2012 Express
- cmake 3.0.2
ソースをGitHubからcloneしてきたら,cmakeを使ってVisual Studioのソリューションを作る.
デバッグビルドだと実行速度遅いし,途中でアサーションダイアログ出てきたりして面倒なので,とりあえずリリースビルドにしておくのが良いです.
なぜか,リンク時にlibを参照しているのに各プロジェクトがDLLを生成してたりするので,スタティックリンクライブラリを生成するようにプロジェクトの設定を直す.(もしかしたら,cmakeのオプション何か必要なのかも?)
ビルドしてたら,なぜかmake_pairでfloatからfloat&&に変換できないとか言われるので,適当になおす.
実行
Focalをピクセル単位で渡す必要がある.OpenMVGに含まれるcameraGenerated.txtにカメラあるセンサの情報や,自分で計算しても求められるけど,2000~4000くらいで適当に何度かやってよさ気なやつを選んだ.
setlocal set IMG_DIR=%1 set FOCAL=%2 openMVG_main_CreateList -f %FOCAL% -d cameraGenerated.txt -i %IMG_DIR% -o match%FOCAL% openMVG_main_computeMatches -i %IMG_DIR% -o match%FOCAL% openMVG_main_IncrementalSfM -i %IMG_DIR% -m match%FOCAL% -o out%FOCAL% -p 1 -c 1 Win64-VS2010\pmvs2.exe out%FOCAL%/PMVS/ pmvs_options.txt
こんな感じのバッチファイル書いて実行.
途中,最初にどの画像から処理するか聞かれるので適当に2つ選ぶ.
OpenMVGは特徴点の三次元情報と画像ごとに推定したカメラの姿勢とかを出力する.plyに特徴点が出力されているが,特徴点はSIFTに使ったやつっぽいので少ない.
カメラの姿勢データと画像から,立体を復元してくれるツールはいくつかありますが,ぐぐったら http://www.di.ens.fr/cmvs/ が簡単に使えそうだったので,最終的なplyファイルを生成.
この記事を参考にしました.http://cflat-inc.hatenablog.com/entry/2013/10/21/214859
実行結果
出力されるplyファイルは,点の座標が並んでるだけのテキストファイルなので,WebGLでレンダリングするjsとかもついでに書く.
座標系は,原点がカメラのうちの1つ.Z軸が視線方向.
Land of Lispと Oculus Rift DK2.こんな感じの写真を何枚か撮ってOpenMVGに食わせる.
3Dなデータが出てくるので,グリグリ回せる.DK2はのっぺりしていて上手く特徴点がとれていない.
WebGLは頂点配列が16ビット固定なので,頂点数65536超える一回でレンダリング出来ないのか.