3次元復元 — 写真の集合から世界を再建する

バラバラに撮った2D写真の集合から、撮影時のカメラ位置と3D構造を同時に推定する。三角測量と再投影誤差の最小化という2つの原理を軸に、SfM から NeRF・3D Gaussian Splatting まで、3次元復元の全体像を動かしながら掴みます。

1. 視線の交点が3D点になる — 三角測量

ステレオ視で見たとおり、同じ点を2つの視点から観測できれば、各カメラ中心から観測方向へ伸ばした視線(レイ)の交点として3D位置が決まります。これが三角測量です。ただし現実の観測にはノイズが乗るため、視線は厳密には交わりません。そこで「すべての視線に最も近い点」を最小二乗で求めます。

重要なのはカメラの台数と配置です。2台で視線のなす角が浅いと、交点は奥行き方向に大きくブレます。台数を増やして多方向から観測すると、交差が「締まり」、誤差が急激に減ります。下のデモでカメラ台数を変えてみてください。

三角測量で家の点群を復元する — カメラ台数と誤差
灰色=真の家の形、水色=三角測量で復元された点群。オレンジの線は各カメラから注目点(黄色)への視線で、点線の円はその点の不確かさです。2台では点群が大きく崩れ、6台ではほぼ真の形に一致します。視点はゆっくり回転しています。
POINT — 誤差は「視線の交差角」で決まる 奥行き誤差はおおよそ 基線長に反比例し、距離の2乗に比例する。カメラを増やす・基線を広げる・多方向から撮る、はすべて「視線の交差角を大きくして交点を締める」操作。SfM で同じ場所をぐるっと一周しながら撮影するのはこのため。

2. すべてを支配する量 — 再投影誤差

3次元復元のあらゆる工程は、たった1つの量を小さくするゲームとして統一的に理解できます。それが再投影誤差(reprojection error)です。推定した3D点 Xj を、推定したカメラ姿勢 Ci で画像に投影し直したとき、実際に観測された特徴点 xij とのズレ(画素単位)がそれです。

minC, X  Σi Σj ‖ xij − π(Ci, Xj) ‖² π は透視投影(カメラと幾何参照)。カメラ姿勢 C と3D点 X を同時に動かして、全観測の再投影誤差の総和を最小化する

この最小化を、全カメラ・全点について一気に行う非線形最適化がバンドル調整(bundle adjustment)です。名前は「カメラから伸びる光線の束(bundle)をまとめて調整する」ことに由来します。変数は数百万に達しますが、ヤコビ行列が疎(各点は一部のカメラにしか写らない)であることを利用して Levenberg–Marquardt 法で効率的に解けます。

3. SfMパイプライン — 4つの段階

順序のない写真集合からカメラ姿勢と疎な点群を推定する枠組みが SfM(Structure from Motion) です。COLMAP に代表される標準パイプラインは次の4段階からなります。下のデモをステップ実行して、各段階で何が確定していくかを追ってください。

SfMパイプライン — ステップ実行と再投影誤差の推移
(1) 特徴マッチングで画像間の対応を張り(赤は RANSAC で弾かれる誤対応)、(2) 対応からエピポーラ幾何を介してカメラの相対姿勢 R, t を推定、(3) 三角測量で疎な点群を作り、(4) バンドル調整で全体を同時最適化。右のバーに注目 — バンドル調整で再投影誤差がぐっと下がります。
注意 — 誤対応は必ず混ざる 特徴マッチングの生の対応には必ず誤対応(outlier)が混ざる。これを最小二乗にそのまま入れると推定が壊れるため、RANSAC でエピポーラ拘束を満たす対応だけを選別してから姿勢推定に進むのが鉄則。バンドル調整でも Huber 損失などのロバスト損失で外れ値の影響を抑える。

4. SfM・MVS・SLAM — 似て非なる三兄弟

「画像から3D」を扱う技術は目的と制約条件で3つに分かれます。混同しやすいので整理しておきましょう。

SfMMVSSLAM
入力順序のない写真集合SfM の出力(姿勢既知の画像)連続した動画・センサ列
出力カメラ姿勢+疎な点群密な点群・メッシュカメラ軌跡+地図(逐次更新)
処理オフライン(全画像を一括処理)オフライン(姿勢を固定して密対応)リアルタイム(逐次処理)
核となる技術特徴マッチング+バンドル調整フォトコンシステンシー・平面スイープフィルタ/局所BA+ループ閉じ込み
代表例COLMAPPatchMatch MVSORB-SLAM、VIO(AR・ロボット)

典型的なフォトグラメトリの流れは SfM(疎)→ MVS(密)→ メッシュ化 → テクスチャ貼り という直列パイプラインです。一方 SLAM は自動運転やARのように「動きながら今すぐ自己位置が要る」場面で使われ、精度よりリアルタイム性を優先して局所的なバンドル調整を回し続けます(自動運転の SLAM 参照)。

5. 点群から連続な表現へ — NeRF と 3D Gaussian Splatting

古典パイプラインの出力は点群やメッシュという離散的な表現でした。2020年の NeRF(Neural Radiance Fields) はここを根本から変えます。シーンを「空間座標+視線方向 → 色と密度」を返す連続な関数(ニューラルネット)として表し、ボリュームレンダリングで任意視点の画像を微分可能に合成、撮影画像との再構成誤差だけでこの場を学習します。最適化の目的関数が再投影誤差から「画像そのものの再現誤差」に置き換わった、と見ることもできます。

表現の進化 — 疎な点群 → 密な点群 → メッシュ → 放射場
視点スライダーを動かしながら4つの表現を見比べてください。点群は視点を変えると隙間が見え、メッシュは面で埋まるが硬い。④の放射場(NeRF 的な連続ボリューム表現の雰囲気)は半透明の「場」が空間を満たし、どの視点からでも滑らかにレンダリングできます。
一歩先へ — 2026年時点の概況:NeRF から 3DGS へ NeRF は品質で衝撃を与えたが、1画素ごとにネットワークをレイに沿って何百回も評価するため描画が遅かった。2023年の 3D Gaussian Splatting(3DGS) は、シーンを数百万個の異方性3Dガウシアン(位置・共分散・色・不透明度)の集合で表し、それらを画面にスプラット(投影・合成)するだけで描画する。ネットワーク評価が不要なためリアルタイム描画が可能で、しかも微分可能なので勾配降下で直接最適化できる — 「点群の柔らかさ」と「連続な場の完全さ」のいいとこ取りだ。初期化には今も SfM(COLMAP)の疎な点群が使われることが多く、古典幾何と学習ベースの手法は対立ではなく直列に共存している。現在は 3DGS 系がビュー合成の主流となり、動的シーン(4DGS)、大規模都市、SLAM への組み込み、さらには生成モデルとの融合(テキストから3D)へと展開が続いている。

6. まとめ