0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

COLMAP入門:3D Gaussian Splattingの前処理を担うSfM/MVSツール

0
Last updated at Posted at 2026-09-24

3DGS作成ガイド
https://qiita.com/kazuyattu/items/a050491ee450670b34ef
pythonのコードはこちら
https://github.com/kazuyattu-stack/3DGS
pythonコード説明
https://qiita.com/kazuyattu/items/6efc5d2ace09d6bc06ac
colmap説明
https://qiita.com/kazuyattu/items/c6226f3dcc6f7abb5016

はじめに

スマホで撮った動画から3D Gaussian Splatting(3DGS)を作ろうとすると、ほぼ必ず登場するのが COLMAP です。
ただ、「とりあえず automatic_reconstructor を叩けば動く」ので、中で何が起きているのかは意外と知られていません。

この記事では、COLMAPが何を解いているツールなのか、どのコマンドが何をしているのか、そして3DGSのパイプラインでなぜ必須なのかを整理します。

COLMAPとは

COLMAPは、複数枚の写真(または動画から切り出したフレーム)を入力として、次の2つを同時に復元するオープンソースのソフトウェアです。

  • カメラがどこから・どの向きで撮影したか(カメラ姿勢)
  • 被写体の3D形状(点群)

フォトグラメトリやNeRF・3DGS系のワークフローで、事実上の標準ツールとして使われています。

開発元とライセンス

ETH Zurich(スイス連邦工科大学チューリッヒ校)のJohannes Schönberger氏を中心に開発された、研究発のソフトウェアです。
BSDライセンスなので、商用・非商用を問わず無料で使えます。

COLMAPが解く2つの問題

① Structure-from-Motion(SfM):カメラ姿勢と疎な点群

画像だけを手がかりに、「各カメラが3D空間のどこにあり、どちらを向いていたか」と「特徴点が3D空間のどこにあったか」を同時に推定します。

  1. 特徴点抽出:各画像からSIFT特徴点を検出する
  2. 特徴点マッチング:画像同士で対応する特徴点を探す
  3. Incremental SfM:2枚の画像から復元を始め、1枚ずつ画像を追加しながら、カメラの位置・向き・内部パラメータ(焦点距離など)と3D点をバンドル調整で最適化していく

出力される点群は数万点程度とスカスカで、細かい形状までは分かりません。
それでも 正確なカメラパラメータが得られること がSfMの最大の価値です。

COLMAPのスパース点群とカメラ位置

② Multi-View Stereo(MVS):密な3D形状

SfMで得たカメラパラメータを使って画素単位で奥行きを推定し、数十万〜数百万点規模の密な点群を作ります。GPU(CUDA)が必要です。

  1. image_undistorter:レンズ歪みを補正した画像を作る
  2. patch_match_stereo:近傍視点との対応から、画像ごとに画素単位の深度マップを推定する
  3. stereo_fusion:複数視点の深度マップを統合し、1つの密な点群にまとめる

SfMは「どこから撮ったか」、MVSは「どんな形か」を詳しく求める工程、と覚えておくと整理しやすいです。

主なコマンド

コマンド 役割
automatic_reconstructor 特徴点抽出からSfM、必要ならMVSまでを一括実行する"おまかせ"コマンド
feature_extractor 画像からSIFT特徴点を抽出する
sequential_matcher / exhaustive_matcher 特徴点マッチング。動画の連番フレームなら、近傍フレームだけを照合する sequential が高速
mapper Incremental SfM本体。カメラ姿勢とスパース点群を推定する
image_undistorter 歪み補正済みの画像とカメラパラメータを出力する
patch_match_stereo CUDAで密な深度マップを推定する
stereo_fusion 深度マップを統合して密点群(fused.ply)を作る
model_converter 出力をBIN / TXT / PLY の間で変換する
gui 結果を可視化・編集するGUIビューア

一番手軽なのは automatic_reconstructor です。例えば動画から切り出したフレームなら、次のように実行します。

colmap automatic_reconstructor \
  --workspace_path ./workspace \
  --image_path ./workspace/images \
  --data_type video \
  --quality high \
  --single_camera 1 \
  --sparse 1 --dense 1
オプション 意味
--data_type video 連番フレーム向けに sequential matcher を使う
--quality low / medium / high / extreme
--single_camera 1 全画像が同じカメラなので内部パラメータを共有する
--sparse / --dense SfM(疎)/ MVS(密)をそれぞれ実行するかどうか

入力と出力

区分 内容
入力 画像ファイル群(JPEG / PNG など)。動画は直接読めないので、事前にフレーム抽出が必要
出力(SfM) カメラの内部・外部パラメータとスパース点群(cameras.bin, images.bin, points3D.bin)
出力(MVS、任意) 歪み補正済み画像と密点群(fused.ply)

COLMAPに動画を直接渡せない点は、初見でつまずきやすいポイントです。OpenCVやffmpegで数フレームおきに静止画へ切り出してから渡しましょう。

なぜ3DGSにCOLMAPが必要なのか

COLMAP自体は、3Dスキャン、測量、文化財のデジタルアーカイブ、VR/ARコンテンツ制作など幅広く使われています。近年特に重要になっているのが、NeRFや3DGSの前処理 としての役割です。

NeRFや3DGSは写真から3Dシーンを学習しますが、学習には「各写真がどのカメラ位置・向きで撮られたか」という情報が欠かせません。
COLMAPのSfMはこの情報を得るためのデファクトスタンダードで、3DGSの公式実装もCOLMAP形式のデータセットをそのまま読み込めるように作られています。

つまりCOLMAPは、動画という「見た目の情報」を、3DGSが学習できる「カメラ位置つきの構造化データ」に変換する 工程を担っています。

実際のパイプラインでの使い方

筆者のワークフローでは、動画から切り出したフレームに対してCOLMAPを2段階で使っています。

段階 目的 3DGSに必要か
SfM カメラ姿勢とスパース点群を推定 必須
MVS 密な点群を生成 点群自体は不要。ただし途中で作られる歪み補正済みデータセットを学習に使う

パイプライン全体(フレーム抽出〜3DGS学習〜.splat変換)は、別記事「スマホ動画から3D Gaussian Splattingを作る:Windows + WSL2でCOLMAP→3DGS→.splatまで自動化する」で紹介しています。

まとめ

  • COLMAPは、写真群からカメラ姿勢と3D形状を復元するオープンソースのSfM/MVSツール
  • SfMでカメラ姿勢とスパース点群を、MVSで密な点群を求める
  • 迷ったら automatic_reconstructor で一括実行できる
  • 3DGS/NeRFの学習に必要なカメラ情報を作る前処理として、事実上の標準になっている

参考リンク

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?