RealityCaptureやMetashapeからCOLMAP形式にデータ変換

RealityCaptureやMetashapeのアライメント結果を3D Gaussian SplattingやNeRFで使うためにCOLMAP形式にデータ変換する手段をまとめてみた。

COLMAPでは難しい複雑であったり規模の大きなシーンのアライメントをRealityCaptureやMetashapeで行い、そのデータを活用するといったものです。

この記事は手段の紹介なので手順の紹介ではないです。
(私の知識不足でやり方がわからんのもある
(手順も追々追記するか別記事で書くかも

COLMAPデータへの変換は1年前くらいから探り始めてたのだけど、ここ最近になって使いやすいツールがいくつか出てきて。ありがたや。

以下A~Fまで手法を上げていますが、現状では
「E」のRealityCapture-to-Postshot
が安定で便利な印象。

A) RealityCaptureのアップデートを待つ

RealityCapture → COLMAP

公式のフォーラムで機能リクエストされている。
https://forums.unrealengine.com/t/support-colmap-export/1277698

投票せよ!そして気長に待つべし。

B) Kaptureで変換する

(RealityCapture/Metashape→) Bundler → COLMAP

COLMAPのこのIssue によるとKaptureというものを使うとBundlerのoutファイル経由で変換できるらしい。
” In the meantime, one can probably use Naver/Kapture with an intermediate bundle.out file to produce colmap alignement files from RC. “

https://github.com/naver/kapture
https://europe.naverlabs.com/research/3d-vision/kapture/

後述の「RealityCapture-to-Postshot」はこのKaptureが使われている。

Jonathan Chemla氏にコマンド例教えていただいた。
https://x.com/jo_chemla/status/1786488108747309472

C) COLMAPの images.txt を自作する

(RealityCapture/Metashape→) csv → COLMAP

RealityCaptureから書き出したcsvからColmapのimages.txtとcamera.txtを作成する

COLMAP – images.txt
nakano_muramotoさんの解説記事 – RealityCaptureのregistrationデータを流用する検討

D) blender-photogrammetryを使う

(RealityCapture/Metashape →) Bundler → Blender → COLMAP

https://github.com/stuarta0/blender-photogrammetry
NegativeMindさんの解説記事 – BlenderでPhotogrammetryできるアドオン

RealityCaptureから書きだしたBundlerを読み込む事ができ、そしてCOLMAPに書き出すことも出来る。
(Metashapeから書き出したBundlerでもいけるかは未確認だが、使えるはず?)

E) RealityCapture-to-Postshotを使う

(RealityCapture/Metashape →) Bundler → COLMAP

https://github.com/Maxiviper117/RealityCapture-to-Postshot

RealityCaptureから書きだしたBundlerをCOLMAPに変換出来る。
(Metashapeから書き出したBundlerでもいけるかは未確認)

F) export_for_gaussian_splatting を使う

Metashape → COLMAP

https://github.com/agisoft-llc/metashape-scripts/blob/master/src/export_for_gaussian_splatting.py

Metashapeから直接COLMAP形式に変換出来る。
スクリプトで実行するのでPro版が必要。

番外編 (COLMAP非経由)

COLMAPを経由せずに直接3D Gaussian SplattingやNeRF用のデータに変換できるものもあります。用途によってはこちらの方が簡単で良さそう。

A) Postshotを使う

RealityCapture → 3D Gaussian Splatting (Postshot)

COLMAPを経由せずにRealityCaptureから直接3D Gaussian Splattingへ持っていきたい場合は「Postshot」が対応しているので便利。
https://www.jawset.com

具体的な使い方は こちら の記事にまとめました。

B) agi2nerfを使う

Metashape → NeRF (instant-ngp)

Metashapeから直接NeRF(instang-ngp)のtransform.jsonに変換したい場合は「agi2nerf」が有用。
https://github.com/EnricoAhlers/agi2nerf

C) rc2nerfを使う

RealityCapture → NeRF (instant-ngp)

RealityCaptureから直接NeRF(instang-ngp)のtransform.jsonに変換したい場合は「rc2nerf」が便利。

https://github.com/joreeves/rc2nerf

作例

このワークフローを利用して京都の清水寺参道、600mの道程を約2万枚の画像から生成しました。

  1. RealityCaptureで全域アライメント
  2. Bundler形式で書き出しRealityCapture-to-PostshotでCOLMAP形式に変換
  3. 公式3D Gaussian Splattingでトレーニング
  4. UnityGaussianSplattingで編集&描画