OpenMVS(Multi-View Stereo)はMulti-Viewステレオという手法で三次元を再構築することを目的としたコンピュータビジョンライブラリです。OpenMVGのようなSfM(Structure-from-Motion)パイプラインのオープンソースプロジェクトは写真を解析してカメラ姿勢を推定し、荒い3D点群(Sparse 3D Point Cloud)を生成するまでのフォトグラメトリの一連の処理の前段フェーズをサポートしているのに対して、OpenMVSは後段をサポートします。具体的には、SfMで生成されたカメラ姿勢と荒い3D点群データを入力して、3Dモデルの表面を完全に再現、つまり、テクスチャ付きメッシュを生成するアルゴリズムを提供します。主な処理項目としては、下記の4つがあります。
- Dense Point-Cloud Reconstruction : 高密度な点群を生成します。
- Mesh Reconstruction : 入力となる点群データを忠実に再現するメッシュの面を生成します。
- Mesh Refinement : 微細なディテールを再現するためのメッシュを精密化します。
- Mesh Texturing : メッシュに色を付けるためにシャープで正確なテクスチャを計算します。
前回は、このOpenMVSをVisual Studio 2022でビルドする方法を説明したので、今回は実際に使う方法について調べてみましたので、その手順をご紹介します。
いろいろなホームページを見て動かしてみたのですが、いずれも情報が古いのか、うまくテクスチャ付きのメッシュを生成することが出来ませんでした。このため、今回の解説でご説明する手順は、ソースコードを解析した結果をベースに独自に試して成功した結果です。また、一般的にはopenMVSを実行する手前のポイントクラウドを生成するまでの処理はopenMVGやCOLMAPに関する記事がほぼ全てだったので、今回はあえて市販のMetashapeを使ってポイントクラウドを生成した結果をopenMVSで処理する手順で説明させていただきます。
まず、大前提としてopenMVSを C:\git\openMVS\make フォルダ以下に生成・ビルドした前提です。
また、事前に、Metashapeにてポイントクラウド、Metashapeで言うところの写真のアライメントの結果として生成されたタイポイントまでは出来上がっている前提です。また、今回の解説では、Metashapeの開発元であるAgisoft社が提供しているBuildingというサンプル画像を使わせていただきました。サンプル画像はこちらからダウンロードが可能です。今回の説明するフォルダ環境は下記のようになっています。それぞれの環境に応じて置き換えてください。
- BuildingのMetashapeプロジェクトのフォルダ: C:¥SfM¥Building
- Buildingの画像ファイル格納フォルダ: C:¥SfM¥Building¥Images
- 今回の説明で実行する際のカレントフォルダ: C:¥SfM¥Building¥Metashape2MVS
まず、初めにMetashapeからカメラ情報とポイントクラウドをエクスポートします。
カメラ情報のエクスポートは、[File]-[Export]-[Export Cameras]メニューを実行します。出力するファイル種別としてはBlocks Exchange(*.xml)を選択し、出力先フォルダは C:¥SfM¥Building¥Metashape2MVS で、ファイル名は BuildingExchange.xml とします。出力する座標系を確認された場合は、Local Coordinateを選択してください。
出力されたXMLファイルでまるまるタグを確認して、下記のように C:¥SfM¥Building¥Metashape2MVS から相対ファイルパスで正しく画像フォルダ(C:¥SfM¥Building¥Images)をさしているか確認してください。
../Images/IMG_4288.JPG>
次に、ポイントクラウドをエクスポートします。[File]-[Export]-[Export PointCloud]メニューを実行します。出力先フォルダは C:¥SfM¥Building¥Metashape2MVS で、ファイル名は Building.plyとします。出力するファイル種別は [StandardPLY (*.ply)」形式 としてください。ここでも、出力する座標系を確認された場合は、Local Coordinateを選択してください。
Building.plyを確認してみます。MeshLabで表示しました。確かに荒い点群ですね。
では、まずMetashapeからopenMVS形式に変換するために下記の通りInterfaceMetashapeコマンドを実行します。
C:\git\openMVS\make\bin\vc17\x64\Release\InterfaceMetashape "C:\SfM\Building\Metashape2MVS\BuildingBlocksExchange.xml" --points-file "C:\SfM\Building\Metashape2MVS\Building.ply" --output-file Building.mvs --working-folder "C:\SfM\Building\Metashape2MVS\work"
実行した結果、C:\SfM\Building\Metashape2MVS\work に Building.mvs というファイルが出力され、また、C:\SfM\Building\Metashape2MVS\undistorted_images というフォルダ以下に、歪みを補正された画像ファイルが出力されています。
openMVSの1番目の処理項目であるDense Pointを下記のコマンドで実行します。
C:\git\openMVS\make\bin\vc17\x64\Release\DensifyPointCloud "C:\SfM\Building\Metashape2MVS\work\Building.mvs" --working-folder "C:\SfM\Building\Metashape2MVS\work"
実行した結果、C:\SfM\Building\Metashape2MVS\work に Building_dense.mvs というファイルと Building_dense.ply というファイルが出力されています。
生成されたBuilding_dense.ply の確認をします。Metashapeの写真アライメントの結果で出力されたポイントクラウドに比べると、かなり細かく点群が生成されていることが分かります。
openMVSの2番目の処理項目であるMesh Reconstructionを下記のコマンドで実行します。
C:\git\openMVS\make\bin\vc17\x64\Release\ReconstructMesh "C:\SfM\Building\Metashape2MVS\work\Building_dense.mvs" --pointcloud-file Building_dense.ply --working-folder "C:\SfM\Building\Metashape2MVS\work"
実行した結果、C:\SfM\Building\Metashape2MVS\work に Building_dense_mesh.ply というファイルと Building_dense_mesh.ply というファイルが出力されています。
生成されたBuilding_dense_mesh.ply の確認をします。三角形で構成されたメッシュなので色情報はまだ付加されていないです。
MVSの3番目の処理項目であるMesh Refinementopenを下記のコマンドで実行します。
C:\git\openMVS\make\bin\vc17\x64\Release\RefineMesh "C:\SfM\Building\Metashape2MVS\work\Building_dense.mvs" --mesh-file Building_dense_mesh.ply --output-file Building_dense_mesh_refine.mvs --working-folder "C:\SfM\Building\Metashape2MVS\work"
実行した結果、C:\SfM\Building\Metashape2MVS\work に Building_dense_mesh_refine.ply というファイルが出力されています。
生成されたBuilding_dense_mesh_refine.ply の確認をします。
細かく比較チェックすると、どのようにリファインされているか分かります。左がリファイン前で、右がリファイン後です。リファイン処理によって、かなりディテールが再現出来ていることが分かります。
MVSの最後の処理項目であるMesh Texturingを下記のコマンドで実行します。
C:\git\openMVS\make\bin\vc17\x64\Release\TextureMesh "C:\SfM\Building\Metashape2MVS\work\Building_dense.mvs" --mesh-file Building_dense_mesh_refine.ply --output-file Building_dense_mesh_refine_texture.mvs --working-folder "C:\SfM\Building\Metashape2MVS\work"
実行した結果、C:\SfM\Building\Metashape2MVS\work に Building_dense_mesh_refine_texture.mvs というファイルと Building_dense_mesh_refine_texture.ply というファイルが出力されています。
生成されたBuilding_dense_mesh_refine_texture.plyの確認をします。
ズームしてみます。テクスチャが張り付けられているので、写真のようなディテールが再現された3Dモデルを生成することが出来ました。
以上で、Visual Studio 2022でビルドしたopenMVSの使い方に関する解説を終わりとさせていただきます。