Chapter 4: Multi-View Geometry
Move beyond stereo to reconstruct 3D scenes from arbitrary collections of images. Learn the Structure from Motion pipeline that powers Google Maps 3D, feature matching strategies, bundle adjustment for global optimization, and practical tools like COLMAP that bring theory to life.
- Topics
- 6
- Demo
- 1
- Videos
- 3
- Min read
- 34
Chapter Overview
Multi-view geometry extends the principles of two-view (stereo) geometry to an arbitrary number of images. While stereo vision works with a calibrated pair, multi-view methods can reconstruct 3D scenes from dozens, hundreds, or even thousands of uncalibrated photographs. This is the technology behind Google Earth's 3D cities, photogrammetric survey, and visual SLAM systems that build maps while navigating.
What is this chapter about? We develop the theory and practice of 3D reconstruction from multiple images. Starting with the trifocal tensor (the three-view generalization of the fundamental matrix), we build up the complete Structure from Motion (SfM) pipeline: feature detection, matching, incremental reconstruction, and bundle adjustment. We then explore practical SfM tools and compare incremental versus global approaches.
Why does this matter? Most real-world 3D reconstruction tasks have far more than two views. A drone surveying a building captures hundreds of images. A tourist photographing a monument takes shots from many angles. Multi-view geometry enables us to extract the full 3D structure and all camera poses from these unordered image collections---automatically, without calibration targets, and with high precision.
How the topics connect: We begin with N-view geometry to generalize two-view constraints. The SfM pipeline shows how to chain these constraints into a full reconstruction system. Feature matching solves the correspondence problem across many images. Bundle adjustment jointly optimizes everything. COLMAP demonstrates a production-quality implementation. Finally, we compare incremental vs global SfM approaches.
Chapter Roadmap
Click any topic to jump in
N-View Geometry
The trifocal tensor, multi-view triangulation, and projective reconstruction beyond stereo.
Pipeline and correspondence
SfM Pipeline
The incremental reconstruction loop — initial pair, register cameras, triangulate, repeat.
Feature Matching
SIFT, SuperPoint, LoFTR — finding correspondences across many views.
Bundle Adjustment
Joint optimization of all cameras and points — minimizing total reprojection error.
Production systems
COLMAP
The standard open-source SfM tool — from images to dense 3D reconstruction.
Incremental vs Global SfM
Trade-offs between growing reconstructions incrementally and solving everything at once.
Topics
6 topics in this chapter
Chapter 3 squeezed everything it could out of two views: the fundamental and essential matrices, rectification, and depth from a single baseline. Two views have hard limits. Every 3D point rests on just two rays, so pixel noise turns directly into depth error, and points near the baseline or far away are barely constrained. Real reconstructions use tens to thousands of photographs, so this chapter asks what changes when there are more than two. Three views carry a constraint that no set of pairwise fundamental matrices captures, the trifocal tensor, which also lets a match in two images predict where the point must appear in a third. Many views let a point be triangulated by least squares over all its rays, which averages noise and, more importantly, widens the angle between rays. And with no calibration at all, many views still determine the scene up to a projective transformation, which self-calibration can upgrade to true Euclidean shape. This topic covers those three ideas; the rest of the chapter turns them into a structure-from-motion pipeline.
Definition
N-view geometry studies the constraints linking images of one scene taken by cameras. For three views the trifocal tensor, a 3 by 3 by 3 array with 18 degrees of freedom, captures them trilinearly. For many views, points are triangulated by minimizing reprojection error over all observations, and uncalibrated reconstructions are recovered up to a projective transform.
In this topic
- 1The Trifocal Tensor
- 2Multi-View Triangulation
- 3Projective Reconstruction and Self-Calibration
The Trifocal Tensor
The trifocal tensor is a array (27 elements, 18 degrees of freedom) that relates corresponding points and lines across three views. For three corresponding points in three images, the tensor satisfies a set of trilinear constraints. Unlike the fundamental matrix (which is bilinear in two points), the trifocal tensor is linear in each of the three image observations. It can be estimated from at least 7 point correspondences across three views using linear methods, and it encodes three fundamental matrices (between each pair of views) plus additional three-view information.
The trifocal tensor is a array with 27 entries and 18 DOF that captures the projective geometry of three views. For corresponding points , the trilinear constraint must hold. The tensor encodes more information than three pairwise fundamental matrices: it captures the three-view geometric consistency that no pair of matrices can express. It also transfers points and lines: given a point in views 1 and 2, the tensor predicts the point in view 3 without explicit 3D reconstruction.
The trifocal tensor has 27 entries but only 18 DOF. How many correspondences are needed for estimation, and how many equations does each correspondence provide?
Multi-View Triangulation
Triangulation from two views finds a 3D point as the intersection of two rays, but noise means the rays rarely intersect exactly. Multi-view triangulation uses observations from cameras to over-determine the 3D point position, averaging out per-view noise. The optimal triangulation minimizes the reprojection error across all views: , where is the projection function. The midpoint method (finding the closest point to all rays) provides a fast initial estimate, while nonlinear refinement achieves sub-pixel accuracy.
Linear DLT triangulation stacks two equations per view into a system and takes the SVD null vector. Nonlinear refinement then minimizes the reprojection error , with covariance roughly . That covariance is anisotropic: the error along the viewing direction scales like in the triangulation angle , while the lateral error is small. Adding views only shrinks the error as when the new rays add new directions. Cameras packed on a narrow arc mostly repeat the same weak depth constraint, so the angular spread of the views controls the accuracy.
A 3D point is observed in 5 cameras with 0.5-pixel noise each. How much does triangulation accuracy improve compared to 2-view triangulation?
Projective Reconstruction and Self-Calibration
From uncalibrated images, the best possible reconstruction without additional knowledge is a projective reconstruction: the 3D structure and camera poses are determined up to an unknown projective transformation (15 DOF). This means the reconstruction may appear stretched, sheared, or otherwise distorted. Self-calibration (autocalibration) upgrades this to a metric reconstruction by exploiting constraints like constant intrinsic parameters across images, zero skew, or known aspect ratio. The Absolute Dual Quadric (ADQ) method is a standard approach for self-calibration.
From uncalibrated images, reconstruction is possible only up to a projective ambiguity: an unknown projective transformation . The true structure is and the true cameras are . Self-calibration resolves this ambiguity using assumptions about the cameras. The Absolute Dual Quadric (ADQ) satisfies (the dual image of the absolute conic). With images and constant-intrinsics assumption, the 10 unknowns of can be solved from the constraints.
A projective reconstruction of a building looks skewed. What assumptions can self-calibration use to recover the true shape?
Related Problems on PixelBank
The previous topic gave the geometry of many views, but assumed we already knew which pixels correspond and where each camera sits. Structure from motion is the problem of getting both from nothing but a pile of photographs: the structure, a set of 3D points, and the motion, every camera's position and orientation. It is a chicken-and-egg problem, because cameras are located from known 3D points and points are triangulated from known cameras. Incremental SfM breaks the cycle by bootstrapping from a single well-chosen pair, then growing the reconstruction one image at a time and cleaning it up with bundle adjustment as it goes. This topic walks through that pipeline end to end: feature detection and matching, geometric verification with RANSAC, how the initial pair is chosen, and how each new camera is registered by PnP before new points are triangulated. The same pipeline, scaled to millions of photos, rebuilt Rome from tourist photos in Photo Tourism and Building Rome in a Day, and it still produces the camera poses for NeRF and Gaussian splatting in later chapters.
Definition
Structure from motion jointly estimates 3D scene points and the pose, and often the intrinsics, of every camera from 2D feature correspondences across an unordered image set. Incremental SfM initializes from one two-view reconstruction, then alternately registers images by PnP, triangulates new points, and refines everything by bundle adjustment.
In this topic
- 1The Reconstruction Pipeline
- 2Initial Pair Selection
- 3Incremental Camera Registration
The Reconstruction Pipeline
A typical SfM pipeline follows these steps: (1) feature detection (SIFT, SuperPoint) finds distinctive points in each image, (2) feature matching finds correspondences between image pairs, (3) geometric verification uses RANSAC with the fundamental/essential matrix to reject incorrect matches, (4) an initial pair is selected and reconstructed using the essential matrix, (5) new cameras are added one at a time via PnP (perspective-n-point), (6) new 3D points are triangulated from the added camera, (7) bundle adjustment refines all parameters, (8) steps 5-7 repeat until all cameras are registered.
Incremental SfM follows: (1) detect features in all images, (2) match features pairwise, (3) select an initial pair, (4) estimate from matches, (5) decompose to get relative , (6) triangulate initial 3D points, (7) register the next camera by PnP from 2D-3D correspondences, (8) triangulate new points, (9) run bundle adjustment, (10) repeat 7-9 for all remaining cameras. The pipeline processes images in for matching and for registration, with periodic bundle adjustment costing for points.
A dataset has 100 images with an average of 2000 features per image. Feature matching tests all pairs. How many pairwise matches are attempted? If 30% of pairs share enough matches for geometric verification, how many verified pairs remain?
Initial Pair Selection
The first two images bootstrapping the reconstruction must be chosen carefully. The ideal initial pair has: (1) sufficient parallax (wide baseline) for accurate triangulation, (2) many feature matches for a robust essential matrix estimate, (3) no degenerate configuration (not a pure rotation, which makes the essential matrix estimation ambiguous). In practice, pairs are scored by the number of inliers after RANSAC and the triangulation angle distribution. Pairs where the median triangulation angle is less than 2 degrees should be avoided.
The initial pair fixes the coordinate frame, and every later camera is registered against its points, so its errors propagate everywhere. A good pair needs many verified inliers and a wide median triangulation angle , because depth error along each ray grows roughly as and diverges as . COLMAP's defaults make that concrete: init_min_num_inliers is 100, init_max_error 4 pixels, and init_min_tri_angle 16 degrees, halved for video input. A pure rotation or a dominant plane makes the essential matrix degenerate, so a pair explained equally well by a homography is a poor seed.
Three candidate initial pairs have: Pair A: 500 inliers, 3-degree median angle. Pair B: 200 inliers, 15-degree median angle. Pair C: 400 inliers, 10-degree median angle. Which is best?
Incremental Camera Registration
After the initial pair, new cameras are added one at a time. For each candidate camera, the algorithm: (1) finds 2D-3D correspondences between the new image's features and existing 3D points, (2) estimates the camera pose using PnP + RANSAC, (3) triangulates new 3D points from the newly registered camera and its neighbors, (4) runs local or global bundle adjustment. The order of camera addition matters: cameras with more 2D-3D correspondences are registered first (they have more constraints, leading to more accurate poses). After every few cameras, global BA is run to prevent drift.
To add a new camera, find features in the new image that correspond to already-triangulated 3D points (2D-3D matches). Run PnP with RANSAC to estimate the new camera's . Then triangulate new 3D points from the new camera paired with existing cameras. Run local bundle adjustment (optimize only the new camera and its visible points). After every cameras (e.g., ), run global bundle adjustment over all cameras and points. This staged approach keeps computation manageable while maintaining global consistency.
After registering 20 cameras and triangulating 5,000 3D points, a new camera sees 150 of the existing 3D points. Is this sufficient for reliable PnP registration?
Every step of the pipeline in the previous topic, from the initial pair to PnP registration to bundle adjustment, consumes correspondences: pixels in different photos that show the same physical point. Getting them is the correspondence problem, and it is where most SfM failures begin. The same corner looks different from a new angle, at a new scale, under different light or with motion blur, while windows, tiles and leaves create many look-alike candidates. A matcher must therefore describe each local patch in a way that survives those changes, and then decide which nearest neighbour is a true match. This topic follows three generations of answers. SIFT, from 2004, detects blobs across scale and describes each with gradient histograms, and Lowe's ratio test rejects ambiguous matches cheaply. SuperPoint and SuperGlue learn the detector, the descriptor and the matcher itself, using geometric context between keypoints. LoFTR drops the detector entirely and matches dense features with transformer attention, which helps on low-texture surfaces. Whichever is used, RANSAC with a fundamental or essential matrix, from Chapter 3, verifies the result.
Definition
Feature matching finds correspondences between images by detecting repeatable keypoints, describing the patch around each with a descriptor vector, and pairing descriptors by nearest-neighbour search, filtered by a ratio test or a learned matcher. Detector-free methods match dense features directly. Matches are then geometrically verified with RANSAC on an epipolar model.
In this topic
- 1SIFT and Classical Descriptors
- 2SuperPoint and Learned Features
- 3LoFTR: Detector-Free Matching
SIFT and Classical Descriptors
SIFT (Scale-Invariant Feature Transform) finds keypoints at extrema of a difference-of-Gaussians scale space, assigns each a dominant gradient orientation, and describes the surrounding patch with a 128-dimensional histogram of gradient orientations over a 4 by 4 grid of cells. That makes it invariant to scale and rotation and tolerant to moderate viewpoint and lighting change, and it has been the default for SfM since 2004. Matching takes each descriptor's nearest neighbour, then applies Lowe's ratio test: keep the match only if the nearest distance is below 0.8 times the second-nearest. Repeated textures still defeat it.
Lowe's ratio test compares the distance to the nearest descriptor with to the second-nearest and accepts the match if . A correct match is usually much closer than any other descriptor, while a false one has competitors at similar distance. In Lowe's experiments, a threshold of 0.8 eliminated 90 percent of false matches while discarding less than 5 percent of correct ones. On a synthetic homography pair, plain nearest neighbours were 72 percent correct, and the 0.8 test raised precision to 99.9 percent while keeping 97.5 percent of true matches. COLMAP uses max_ratio 0.8 with cross-checking by default.
A SIFT descriptor is 128-dimensional with float32 values. An image has 3000 keypoints. How much memory for descriptors, and how many distance computations for brute-force matching against another image with 2500 keypoints?
SuperPoint and Learned Features
SuperPoint (2018) is a self-supervised network that detects keypoints and computes 256-dimensional descriptors in one forward pass. It is first trained on synthetic shapes with known corners, then adapted to real images by homographic adaptation, which warps each image many times and aggregates the detections. On HPatches its detector was the most repeatable under illumination changes and competitive under viewpoint changes, and the full network runs at about 70 FPS on 480 by 640 images. SuperGlue (2020) replaces nearest-neighbour matching with a graph neural network that attends across both images' keypoints and their positions, then solves an optimal-transport assignment. LightGlue (2023) is a faster successor.
SuperPoint shares one encoder between a detector head, which predicts a keypoint probability for each pixel in 8 by 8 cells, and a descriptor head, which outputs a semi-dense 256-dimensional map that is interpolated at keypoints. Homographic adaptation trains the detector to agree with itself across random warps, which builds in repeatability. The paper reports about 70 FPS at 480 by 640 on a Titan X, and on HPatches the best repeatability under illumination change but only competitive results under viewpoint change. Matching quality then depends heavily on the matcher: SuperGlue or LightGlue on top of SuperPoint is the common pairing.
SuperPoint detects 1200 keypoints with 256-dim descriptors. SuperGlue matches these against 1400 keypoints in a second image. Compare the descriptor memory and matching approach vs SIFT.
LoFTR: Detector-Free Matching
LoFTR (2021) takes a fundamentally different approach: instead of detecting keypoints first, it directly produces dense semi-matches between two images using a transformer architecture. It first extracts coarse features using a CNN backbone, then uses self- and cross-attention to find correspondences at 1/8 resolution, and finally refines matches to sub-pixel accuracy. LoFTR excels in textureless regions and repetitive patterns where keypoint detectors fail, because it uses global image context to disambiguate matches. The trade-off is higher computational cost (100-200ms per pair on GPU).
LoFTR bypasses keypoint detection entirely. It processes both images with a CNN backbone, then uses a transformer with cross-attention to establish dense correspondences at coarse resolution ( scale), followed by refinement to sub-pixel accuracy. The cross-attention mechanism allows matching based on global context rather than local patches: it can match textureless regions by leveraging surrounding structure. LoFTR achieves state-of-the-art pose estimation accuracy, especially on indoor scenes with repetitive textures and low texture, where traditional detectors fail.
A scene has 40% textureless regions (walls, sky). Compare the expected matching coverage of SIFT, SuperPoint+SuperGlue, and LoFTR.
The pipeline and matchers of the previous topics produce an initial reconstruction, but every pose and point in it was estimated from a slightly different subset of noisy data, and errors from early steps flow into later ones. Bundle adjustment is the final, joint refinement. It treats every camera parameter and every 3D point as unknowns and minimises one objective, the total squared reprojection error between where each point is observed and where the current estimate projects it. The name refers to the bundles of light rays from each camera to the points, which are adjusted together until they agree. The problem is large, with hundreds of thousands of unknowns, and nonlinear, so it is solved with Levenberg-Marquardt, which needs a good start; that is why incremental SfM runs it again and again as the model grows. This topic covers the reprojection objective and its very sparse Jacobian, the Schur complement that eliminates points so only a small camera system is solved, and robust losses that stop surviving outlier matches from dragging the solution.
Definition
Bundle adjustment is the nonlinear least-squares refinement of all camera parameters and 3D points in a reconstruction, minimizing the sum of squared reprojection errors over all observations. It is solved with Gauss-Newton or Levenberg-Marquardt, exploiting the sparse Jacobian through the Schur complement, and usually with a robust loss on each residual.
In this topic
- 1The Reprojection Error Objective
- 2Schur Complement and Sparse Solvers
- 3Robust Loss Functions and Outlier Handling
The Reprojection Error Objective
Bundle adjustment minimizes: , where is the observed pixel location of 3D point in camera , and is the projection function. This is a nonlinear least squares problem solved with the Levenberg-Marquardt (LM) algorithm. The number of parameters is (rotation + translation per camera) (xyz per point), which can be millions for large reconstructions. The key insight is that the Jacobian matrix is very sparse: each observation involves only one camera and one point.
Bundle adjustment minimizes where is the set of visible (camera, point) pairs. This is a nonlinear least squares problem with unknowns, where is the number of cameras and is the number of points. For a typical SfM reconstruction with 500 cameras and 100K points, this means unknowns and residuals.
A reconstruction has 50 cameras, 10,000 3D points, and 200,000 observations. How many parameters and what is the Jacobian sparsity?
Schur Complement and Sparse Solvers
The normal equations in BA have a special block structure: the camera-camera block is dense among cameras sharing points, the point-point block is diagonal (each point is independent of other points), and the camera-point blocks are sparse. The Schur complement trick eliminates point parameters, reducing the system from to unknowns. For 50 cameras and 10,000 points, this reduces a 30,300 x 30,300 system to a 300 x 300 system---a 10,000x reduction. Libraries like Ceres Solver (Google) and g2o exploit this structure for efficient optimization.
Order the unknowns as cameras then points , so the normal equations have blocks . Because each residual touches one point, is block-diagonal with 3 by 3 blocks and is inverted cheaply. Eliminating points gives the reduced camera system , of size . For 500 cameras and 100,000 points that shrinks a 303,000-unknown system to 3,000 unknowns, about 100 times fewer, or about a million times less work for a dense factorization. Points are then recovered one at a time by back-substitution. Ceres and g2o implement this.
Without the Schur complement, solving the normal equations for 100 cameras and 50,000 points costs with . With Schur complement, . Compare the computational cost.
Robust Loss Functions and Outlier Handling
Real-world data contains outliers: incorrectly triangulated points or wrong feature matches that survived RANSAC. Standard least squares is sensitive to outliers because the squared error grows quadratically. Robust loss functions (also called robust kernels or M-estimators) down-weight large residuals: Huber loss transitions from quadratic to linear at a threshold, Cauchy loss uses a logarithmic function, and Tukey's biweight completely ignores residuals beyond a threshold. Ceres Solver supports these as loss functions applied to each residual in BA.
A robust loss replaces , and its derivative sets each residual's pull on the solution. Squared loss pulls in proportion to , so a 100 pixel outlier pulls 100 times harder than a 1 pixel inlier and costs 10,000 times more. Huber, quadratic below and linear above, caps the pull at a constant. Cauchy, , makes the pull fall back toward zero for large . With , a 100 pixel outlier costs 35 times a 1 pixel inlier, and its gradient is 20 times smaller. Robust losses need a decent start: they cannot fix gross initial errors.
An outlier has reprojection error of 50 pixels. Compare its contribution to the total cost under squared loss, Huber loss (delta=4), and Cauchy loss (c=4).
Related Problems on PixelBank
The previous topics described each stage of structure from motion separately: matching, incremental registration and bundle adjustment. COLMAP, developed by Johannes Schonberger, packages them, plus dense reconstruction, into one open-source system, and it has become the default tool in research and production. NeRF and Gaussian-splatting datasets are posed with COLMAP, photogrammetry studios use it, and new SfM methods are judged against it. Using it well means knowing what each stage does and which defaults matter. Feature extraction runs SIFT, by default up to 8,192 features per image. Matching can be exhaustive, sequential for video, or driven by a vocabulary tree for large collections, followed by geometric verification. The incremental mapper then grows the model, running local bundle adjustment after each new image and global bundle adjustment whenever the model has grown by about 10 percent. Finally, PatchMatch multi-view stereo turns the sparse model into dense depth maps and a fused point cloud. This topic walks through that architecture, the dense stage, and practical capture and tuning advice.
Definition
COLMAP is an open-source structure-from-motion and multi-view stereo system. Its sparse pipeline extracts SIFT features, matches and geometrically verifies image pairs, and incrementally registers images with repeated bundle adjustment. Its dense pipeline estimates per-image depth and normal maps with PatchMatch stereo and fuses them into a dense point cloud.
In this topic
- 1COLMAP's SfM Architecture
- 2Dense Reconstruction with MVS
- 3Practical COLMAP Usage
COLMAP's SfM Architecture
COLMAP's SfM pipeline has five main stages: (1) Feature extraction using SIFT (GPU-accelerated), producing typically 5000-10000 keypoints per image. (2) Feature matching using exhaustive, sequential, or vocabulary tree strategies, with geometric verification via RANSAC. (3) Incremental reconstruction: selects the best initial pair, then iteratively registers cameras, triangulates points, and runs bundle adjustment. (4) Retriangulation: attempts to triangulate additional points after BA improves poses. (5) Final global BA with all cameras and points. COLMAP automatically handles multiple disconnected components and merges them if possible.
COLMAP's defaults encode the pipeline's design. SIFT extraction keeps up to 8,192 features per image. Matching uses a 0.8 ratio test with cross-checking, then verifies each pair by estimating fundamental, essential and homography models with RANSAC, recording which configuration fits. The incremental mapper picks the next image by the number and spread of its visible 3D points, registers it if PnP finds at least 30 inliers, then triangulates and runs local bundle adjustment. Global bundle adjustment fires when registered images or points have grown by 10 percent since the last one, so a 200-image model runs it about 35 times. That growth rule keeps global cost roughly proportional to the final model size.
A dataset of 200 tourist photos of a cathedral is processed by COLMAP with default settings. Feature extraction takes 2 s per image, and exhaustive matching takes about 0.1 s per image pair. How long do extraction and matching take, how many global bundle adjustments will the incremental mapper run, and when would you switch to vocabulary-tree matching?
Dense Reconstruction with MVS
After sparse SfM, COLMAP's multi-view stereo (MVS) module computes dense depth maps for every image. It uses PatchMatch stereo: for each pixel, it samples random depth/normal hypotheses, evaluates photometric consistency across neighboring views, and propagates good hypotheses to neighbors. The depth maps are then fused into a single dense point cloud by checking multi-view consistency and removing outliers. The final output can contain millions to tens of millions of colored 3D points. For mesh reconstruction, Poisson surface reconstruction or Delaunay triangulation is applied to the dense point cloud.
COLMAP's dense stage, after undistorting images, runs PatchMatch stereo per reference image. It initializes each pixel with random depth and normal hypotheses, propagates good hypotheses to neighbours in alternating sweeps, five iterations by default, and scores them with bilateral NCC over an 11 by 11 window. Source views are weighted per pixel by a probabilistic view-selection model, and a geometric-consistency pass enforces agreement between depth maps. Fusion then merges pixels whose reprojections agree within 2 pixels, depth within 1 percent and normals within 10 degrees. A fused point needs at least 5 consistent pixels by default, which removes most isolated noise.
COLMAP reconstructs a room from 50 images (1920x1080). Sparse SfM produces 80,000 points. Dense MVS produces depth maps at half resolution. Estimate the dense point cloud size.
Practical COLMAP Usage
To use COLMAP effectively: (1) capture images with 60-80% overlap between consecutive views, (2) avoid texture-free surfaces (white walls) and moving objects (people, cars), (3) maintain consistent exposure (or use EXIF data for varying focal lengths), (4) for large datasets, use sequential or vocabulary tree matching instead of exhaustive, (5) inspect the reconstruction in COLMAP's GUI to identify unregistered cameras (add more images of those areas), (6) export results in various formats (PLY, NVM, bundler) for downstream processing. COLMAP runs on both CPU and GPU, with GPU providing 5-10x speedup for feature extraction and matching.
Most COLMAP failures are capture problems, so fix the images before tuning. Useful options include SiftExtraction.max_num_features (default 8,192) for detailed scenes, sequential matching with loop detection for video, and vocabulary-tree matching for large unordered sets. Mapper.init_min_tri_angle (default 16 degrees) can be lowered when the initial pair has little parallax. For images without EXIF focal lengths, set a camera model and, if known, the focal length. Results are written as cameras, images and points3D files in binary or text form, and images.txt stores world-to-camera poses, as covered in Chapter 2.
A drone captures 500 images of a building at 80% overlap. 475 cameras register in COLMAP, but 25 fail. The unregistered images are all from one side of the building. What went wrong and how to fix it?
Related Problems on PixelBank
COLMAP, the previous topic, is an incremental system: it grows one model image by image and re-runs bundle adjustment as it goes. That design is robust, because each new camera is checked against an already consistent model, but it has two structural weaknesses. Its cost grows quickly with collection size because the model is repeatedly re-optimized, and errors made early, from a weak initial pair or a misregistered image, are frozen into everything built on top of them. Global SfM takes the opposite route. It estimates every relative pose from pairwise matches first, then solves for all camera rotations at once by rotation averaging, then for all positions at once by translation averaging, and finally runs a single bundle adjustment. It treats all images symmetrically and is much faster, but one bad relative pose can poison the global solve, so outlier filtering is everything. This topic compares the two paradigms, how drift arises in each, and the hybrid and learned methods, from hierarchical clustering to GLOMAP and DUSt3R-style networks, that are narrowing the gap.
Definition
Incremental SfM registers images one at a time against a growing model, with repeated bundle adjustment. Global SfM estimates all relative poses, solves for every camera's rotation by rotation averaging and position by translation averaging simultaneously, triangulates, then runs one bundle adjustment. Hybrid methods combine the two, for example across image clusters.
In this topic
- 1Incremental SfM: Strengths and Weaknesses
- 2Global SfM: Strengths and Weaknesses
- 3Hybrid Approaches and Modern Trends
Incremental SfM: Strengths and Weaknesses
Incremental SfM (used by COLMAP, VisualSFM, Bundler) adds cameras one at a time and runs bundle adjustment frequently. Strengths: robust to outliers (each camera is verified against the existing reconstruction), handles arbitrary camera configurations, and naturally produces a consistent reconstruction. Weaknesses: (1) sensitive to the initial pair choice, (2) prone to drift (errors accumulate as cameras are added sequentially), (3) computationally expensive due to repeated global BA, (4) order-dependent (different camera orderings can produce different results). For large datasets (10,000+ images), the repeated BA becomes the bottleneck.
Incremental SfM adds one camera at a time, running bundle adjustment at each step. Strengths: robust to outliers (each camera is verified against existing reconstruction), handles very large scenes (+ images), produces intermediate results. Weaknesses: accumulated drift (early cameras never see late cameras' constraints), computational cost is or worse due to repeated bundle adjustment, and the result depends on the image ordering --- different orderings can give different reconstructions. COLMAP mitigates drift with re-triangulation and periodic global BA.
An incremental SfM run on 500 images taken in a loop around a building ends with a 2 m gap between the first and last cameras, which should nearly coincide; the cameras are about 20 m from the building. Each registration is accurate to about 0.01 degrees in rotation. What kind of error explains the gap, and how is it fixed?
Global SfM: Strengths and Weaknesses
Global SfM (used by OpenMVG, Theia) first estimates all relative rotations from pairwise matches, then computes global rotations simultaneously (rotation averaging), then estimates translations (translation averaging), and finally triangulates and runs BA. Strengths: (1) no drift because all cameras are solved simultaneously, (2) faster for large datasets (no repeated BA), (3) order-independent. Weaknesses: (1) more sensitive to outlier relative poses, (2) translation averaging is less robust than rotation averaging, (3) may fail on loosely connected scene graphs. Global methods are theoretically cleaner but practically require very robust outlier rejection.
Global SfM estimates all camera orientations simultaneously by averaging relative rotations, then all positions by solving a linear system from relative translations. Strengths: no drift (all cameras optimized together), faster for large scenes ( vs ), and the result is independent of image ordering. Weaknesses: less robust to outlier relative poses (one bad pairwise estimate corrupts the global solution), struggles with missing or weak connections in the view graph, and requires good initialization for the final bundle adjustment. Theia and OpenMVG implement global SfM.
On a 2,000-image collection, an incremental pipeline takes several times longer than a global one when both start from the same verified matches. Where does the difference come from?
Hybrid Approaches and Modern Trends
Modern systems mix both paradigms. Hierarchical SfM partitions the view graph into clusters, reconstructs each one, often incrementally, then merges clusters by aligning their shared cameras and points. Global pipelines have also become more robust: GLOMAP replaces separate translation averaging with a joint global positioning step over cameras and points, and matches COLMAP's accuracy while running far faster. Learning-based methods such as DUSt3R and MASt3R regress dense 3D point maps directly from image pairs with transformers, which helps with little texture or overlap. They currently need GPUs, memory grows with the number of views, and accuracy on out-of-domain scenes is less proven.
Modern systems combine incremental and global ideas. Hierarchical SfM partitions images into clusters, runs incremental SfM within each cluster, then merges clusters globally. This achieves the robustness of incremental with the scalability of global methods. Recent trends include: (1) learning-based feature matching (SuperGlue, LoFTR) replacing SIFT, (2) differentiable SfM for end-to-end learning, (3) instant reconstruction from posed images (Gaussian Splatting), bypassing the SfM pipeline entirely. The boundary between SfM and SLAM is blurring as real-time reconstruction methods mature.
A dataset has 5000 images of a city block. Incremental SfM would take 12 hours with significant drift. Global SfM fails because the scene graph has weak connections between some blocks. What approach is best?