この前見つけたOpenMVSをビルドしてみようと思ってドキュメント見たら、すでにサンプルをWindows用にビルドしたバイナリが配布されているではないか!
公式ドキュメントのUsageページの内容も、配布されているopenMVS_sampleを使えばできそうな感じ。
ただ、ドキュメントがやや古いのか、書いてある実行ファイルの名称が配布されているものとちょっと食い違っているみたい。
たぶん、ドキュメントで”openMVG_main_openMVG2openMVS
“って書かれているのは、現在のサンプルの中にある”InterfaceOpenMVG
“のこと。ソースコードのInterfaceOpenMVG.cppの中身をちょっと見てみると、ドキュメント記載の”openMVG_main_openMVG2openMVS
“と同じ引数を受け取りそうな感じ。
openMVGでSFMデータ(sfm_data.bin)を作成する
とりあえず、OpenMVSに食わせるためのsfm_data.bin
をopenMVGでちゃちゃっと生成してしまう。この前ビルドしたopenMVGのSfM toolsを使う。
OpenMVSの使い方の例に合わせてSceaux Castleの画像セットを使用する。
Sceaux Castle画像セットを入力として以下のツールを順に実行すると、最終的にsfm_data.bin
が出力される。コマンドライン引数はそれぞれのドキュメント参照。
- openMVG_main_SfMInit_ImageListing:画像リストの作成
- openMVG_main_ComputeFeatures:画像特徴の検出・記述
- openMVG_main_ComputeMatches:画像の対応関係の計算
- openMVG_main_IncrementalSfM:3次元再構築(Structure from Motion)
sfm_data.bin
と一緒にいくつか.ply
ファイルも出力される。この.ply
ファイルをMeshLabで開けば3次元再構築の結果を確認できる。
で、出力されたsfm_data.bin
を使ってOpenMVSのMulti-View Stereoによる密な点群の復元を試すわけだけど、まずは現在配布されているOpenMVSの最新のサンプルの構成に合わせて、やや古いOpenMVS公式のドキュメントの記述を読み換えながら訳してみる。
OpenMVSモジュールの使い方
次は、利用可能なモジュールの使い方の説明です。
今回は、OpenMVGのパイプラインを使い、Sceaux Castle画像セットからカメラ位置と疎な点群の復元を行いました。
ここで示すアウトプットは、全てOpenMVSのパイプラインで自動的に生成したものであり、手作業による調整は一切行っていない結果であることに注意してください。
完全なサンプル(モジュール用のWindows x64バイナリを含む)はOpenMVS_Sampleにあります。
OpenMVSのバイナリは、全てコマンドライン引数をサポートしています。引数の詳細については、引数無し、または-h
コマンドで実行すると表示されます。
@FlachyJoe氏がOpenMVGとOpenMVSの連携プロセスを自動化した、コマンド1つで実行できるscriptを提供しています。
以下のコマンドを実行すれば同様の結果が得られるはずです:
python MvgMvs_Pipeline.py
OpenMVGのシーンを変換する
シーンの再構築後、OpenMVGはデフォルトでカメラ位置と疎な点群情報の入った
sfm_data.bin
ファイルを生成します。
エクスポーターツールを以下コマンドで実行すれば、このファイルをOpenMVSのプロジェクトファイルscene.mvs
へ変換できます。
InterfaceOpenMVG -i sfm_data.bin -o scene.mvs
OpenMVGが古い.json
アスキー形式のファイルを使っている場合は、以下のように実行してください。
InterfaceOpenMVG -i scene.json -o scene.mvs
ここまでのステップで得られた疎な点群は以下の画像のようになるはずです:
密な点群の再構築(オプション)
シーンに欠けている部分があっても、dense reconstruction(密な再構築)モジュールを使って密な点群を推定すれば復元することができます。
DensifyPointCloud scene.mvs
得られた高密度の点群は以下の画像のようになります(頂点の色は可視化のためのおおよそのものであり、以降の処理には影響しないことに注意):
ラフなメッシュの再構築
ここまでのステップで得られた疎、密な点群をmesh reconstruction(メッシュの再構築)モジュールの入力として使うことができます。
ReconstructMesh scene_dense.mvs
mesh reconstructionモジュールを実行して得られるメッシュ:
メッシュのリファイン(オプション)
疎、密な点群から得られたメッシュには、まだディティールや大きな欠落部分をリファインできる余地があります。
以下のコマンドで、疎な点群から得たラフなメッシュのリファインを行ってみます:
RefineMesh scene_mesh.mvs
リファイン前と後:
メッシュにテクスチャを貼る
ここまでのステップで得られたメッシュをmesh texturing(メッシュにテクスチャを貼る)モジュールの入力として使います。
TextureMesh scene_dense_mesh.mvs
メッシュにテクスチャを貼った状態:
![]()
“openMVG_main_openMVG2openMVS
“を”InterfaceOpenMVG
“と読み替えるだけでちゃんと動いたぞ。さらにOopenMVS_sampleにはopenMVGだけでなく、VisualSFMのファイルを変換するInterfaceVisualSFMも入っているので、VisualSFMで疎な点群の復元まで終えたデータからOpenMVSで密な点群の復元ができるわけだな。
まあ、もちろんPMVSやCMVSとかCMPMVSでも良いんですが。
関連記事
OpenCVの顔検出過程を可視化した動画
WordPressプラグインによるサイトマップの自動生成
Python.NET:Pythonと.NETを連携させるパッ...
Unreal Engineの薄い本
Web経由でRaspberry PiのGPIOを操作したい
オープンソースのロボットアプリケーションフレームワーク『RO...
Iridescence:プロトタイピング向け軽量3D可視化ラ...
なんかすごいサイト
WinSCP
Mitsuba 2:オープンソースの物理ベースレンダラ
ポリゴン用各種イテレータと関数セット
Unityの薄い本
フォトンの放射から格納までを可視化した動画
Pix2Pix:CGANによる画像変換
機械学習に役立つPythonライブラリ一覧
ArUco:OpenCVベースのコンパクトなARライブラリ
MythTV:Linuxでテレビの視聴・録画ができるオープン...
3D復元技術の情報リンク集
OpenCVでiPhone6sのカメラをキャリブレーションす...
SSD (Single Shot Multibox Dete...
MVStudio:オープンソースのPhotogrammetr...
Pythonのソースコードに特化した検索エンジン『Nulle...
iOSデバイスと接続して連携するガジェットの開発方法
UnityのAR FoundationでARKit 3
OpenMayaのPhongShaderクラス
AR (Augmented Reality)とDR (Dim...
Faster R-CNN:ディープラーニングによる一般物体検...
OpenMVS:Multi-View Stereoによる3次...
iPhone x ロボットハッカソン~RomoのiPhone...
OpenVDB:3Dボリュームデータ処理ライブラリ
Windows10でPyTorchをインストールしてVSCo...
iPhoneアプリ開発 Xcode 5のお作法
Iterator
コンピュータビジョンの技術マップ
Unityで学ぶC#
SONYの自律型エンタテインメントロボット『aibo』
Seleniumを使ったFXや株の自動取引
Kinect for Windows V2のプレオーダー開始
AnacondaとTensorFlowをインストールしてVi...
TeleSculptor:空撮動画からPhotogramme...
GAN (Generative Adversarial Ne...
書籍『3次元コンピュータビジョン計算ハンドブック』を購入
コメント