Linear Triangulation

Triangulation reconstructs a 3D point from its projections in two or more calibrated views. It is the inverse of the projection operation: given pixel observations and camera poses, recover the world point.

Problem Statement

Given: camera projection matrices (each ) and corresponding pixel observations .

Find: 3D point such that .

Assumptions:

  • Camera poses and intrinsics are known
  • Correspondences are correct
  • The point is visible from all views (not occluded)

Derivation (DLT)

For each view , the projection constraint gives (by cross-multiplication):

where is the -th row of and .

Stacking all views gives a system:

Solve via SVD: is the right singular vector corresponding to the smallest singular value. Dehomogenize: .

Limitations

  • No uncertainty modeling: The DLT minimizes algebraic error, not geometric (reprojection) error
  • Baseline sensitivity: For small baselines (nearly parallel views), the triangulation is poorly conditioned — small pixel errors lead to large depth errors
  • Outlier sensitivity: A single incorrect correspondence corrupts the result; no robustness mechanism

For high-accuracy 3D reconstruction, triangulation should be followed by bundle adjustment that jointly optimizes points and cameras to minimize reprojection error.

API

#![allow(unused)]
fn main() {
let X = triangulate_point_linear(&projection_matrices, &pixel_points)?;
}

Where each projection matrix is precomputed from the camera intrinsics and pose.