Essential Matrix for Calibrated Cameras
The essential matrix is the calibrated cousin of the fundamental matrix: with intrinsics known, five point pairs recover the rotation and the direction of travel between two views, up to scale.
Why Does This Exist?
The fundamental matrix works without calibration but needs seven or eight matches and never yields motion directly. Once intrinsic parameters are known, pixels become true rays and the geometry tightens: five matches determine the relative pose, and decomposing hands over the rotation plus the travel direction. This is how structure from motion bootstraps its first camera pair and how visual SLAM initializes motion before the map exists.
Think of It Like This
A steel ruler with no units marked
The fundamental matrix is a knotted string: it orders positions along a line but measures nothing. Calibration upgrades it to a steel ruler, straight and true, so angles and directions read exactly. But the ruler has no numbers printed: it says "that way" without saying "how far."
That missing scale is permanent to pure vision. Two journeys with identical headings but different lengths produce the identical . The analogy stops at sensor fusion: an IMU, GPS, or known object writes the numbers on the ruler from outside.
How It Actually Works
With calibrated ray coordinates and (pixels premultiplied by ), the constraint keeps its shape: , where . Here is the skew-symmetric cross-product matrix of the translation direction , and is the relative rotation. Freedom counting gives (rotation) (direction, since scale is free) degrees of freedom, hence five-point solvers. The two matrices connect through .
Decomposing yields four combinations, of which exactly one places the triangulated points in front of both cameras. That visibility test is the cheirality check, and it is the only disambiguation needed.
Worked numbers
Take as identity and , so has rows , , . With :
and with the residual is . Decomposing this returns the identity rotation and the travel direction among its four candidates, and cheirality keeps that physical one.
Code
def essential_residual(xp: tuple[float, float], x: tuple[float, float]) -> float: e = ((0.0, 0.0, 0.0), (0.0, 0.0, -1.0), (0.0, 1.0, 0.0)) # skew t with R as identity ex = (e[0][0] * x[0] + e[0][2], e[1][2], e[2][1] * x[1]) # E x in closed form return xp[0] * ex[0] + xp[1] * ex[1] + ex[2]
print(essential_residual((1.5, 0.2), (0.5, 0.2))) # -> 0.0Watch Out For
Reading absolute scale out of E
By convention , so the translation is a direction with an arbitrary unit length. Treating it as meters yields trajectories with perfect shape and wrong size. This is the same scale ambiguity structure from motion documents: fuse an IMU, GPS, or a known-size object to pin the gauge.
Feeding it a pure rotation
With no translation, makes the zero matrix and the constraint accepts everything. Decomposition output is then garbage with a confident face. Detect the rotation-only case (negligible translation, high rotational consistency) and switch to a homography, which owns pure rotations via .
The Quick Version
- The essential matrix acts on calibrated rays and satisfies with .
- Five matches suffice, versus seven or eight for the fundamental matrix.
- Decomposition gives four candidates; the cheirality check keeps the physical one.
- Translation comes out as a direction only; absolute scale is unobservable.
- Pure rotation zeroes out, so rotation-only pairs belong to a homography.
- It relates to through .