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.