Technical Field Note #04 · October 2026

Checking a Stereo Calibration on Ordinary Footage

A target-free validation for wide-angle stereo rigs — and two metric traps that make a good calibration look bad

You have stereo footage and a calibration file, but no calibration target in the scene. Does the file belong to this device and this capture mode? We tested two calibrations against the same 120-second head-mounted recording from Field Note #03. The check verifies intrinsics, distortion and stereo rotation. It does not verify baseline length, metric depth or camera–IMU calibration.

0.41 pxMedian angular epipolar error, mode-matched calibration, no adjustment
1.83 pxSame matches, calibration from a different (16:9) capture mode
0.1°Stereo-rotation error that roughly doubles the median
~74°Field angle where OpenCV's default fisheye un-projection breaks for this lens

Problem

Why Check a Calibration Without a Target

A calibration file can be precise and still wrong for your data. It may come from another unit, another resolution, crop or binning mode, or a rig that was knocked during shipping. A low reprojection RMS reported by the calibration tool says nothing about any of these. What you usually do have is footage. Simultaneous left/right frames of an ordinary scene contain thousands of point correspondences, and every one of them must satisfy the epipolar constraint the calibration predicts.

Recording
120 s head-mounted stereo capture, 2 × 1600×1200 at 30 fps, wide-angle lenses, indoor workbench
Calibration A
Kalibr, pinhole + equidistant (fisheye) model, AprilGrid session recorded in the same 1600×1200 mode and solved at an exact 0.5× downscale
Calibration B
Pinhole + rational (8-coefficient) model produced in a 16:9 1920×1080 mode of the same camera family
Scaling A to full resolution
f′ = 2f, c′ = 2c + 0.5 (OpenCV pixel-centre convention); distortion and extrinsics unchanged

Method

Angular Epipolar Error on Unfiltered Matches

01 / SAMPLE29 frame pairs

Simultaneous left/right frames every 4 s across the recording.

02 / MATCH19,386 matches

SIFT with ratio test only. No RANSAC, so the calibration cannot be flattered by outlier rejection.

03 / RAYSExact un-projection

Pixels to unit rays by Newton inversion of the distortion model, valid to the edge of the image.

04 / ERRORAngle to epipolar plane

Converted to pixels at the image centre (1° = 8.42 px here), so every field angle is weighted equally.

Metric
E = [t]× R # from the calibration, x_right = R·x_left + t n = normalize(E · ray_left) # normal of the epipolar plane, in the right camera err_deg = asin(|n · ray_right|) # angle between the right ray and that plane err_px = err_deg · f · π/180 # f = focal length at the image centre

The metric tests intrinsics, distortion, stereo rotation and baseline direction together. Baseline length does not enter the epipolar constraint, so it cannot be verified this way.

Results

A Mode-Matched Calibration Fits; a Mismatched One Does Not

Scatter map of angular epipolar error for every stereo match across the 1600 by 1200 image
Figure 1. Calibration A on the recording, no adjustment. Errors stay low across the whole frame, including the periphery of the wide-angle lens.
Bar chart comparing median and 90th percentile angular epipolar error for the two calibrations
Figure 2. The same 19,386 matches evaluated with each calibration. Unfiltered matches include some mismatches, which set the p90.
Field angleMatchesMedianp90
0–20°1,3730.48 px1.89 px
20–40°5,7770.41 px1.59 px
40–55°4,3300.31 px1.56 px
55–65°2,8730.42 px2.03 px
65–75°3,7840.45 px1.68 px
75–90°1,2490.46 px1.80 px
All, calibration A19,3860.41 px1.69 px
All, calibration B19,3861.83 px4.17 px
Reading the Numbers

A median around 0.4 px is close to the localization noise of SIFT matches, and it holds from the centre to beyond 75° off-axis. Calibration B was precise in its own session (stereo RMS 0.36 px) but its principal points sit near the centre of a 16:9 image; on this 4:3 recording it is four times worse and its error has a systematic spatial pattern.

Sensitivity

How Small an Error the Check Can See

We fitted a 3-DOF correction to the stereo rotation on alternate frame pairs and evaluated it on the others. The recording asks for only −0.011°, −0.008° and −0.006° about x, y and z; the held-out median moves from 0.399 to 0.374 px. Adding a deliberate error shows how quickly the metric reacts.

Line chart of held-out median error versus deliberate stereo rotation error about three axes
Figure 3. Held-out median after adding a known rotation error. 0.1° about x or z is clearly visible; rotation about the vertical axis is the least visible, as expected for a horizontal baseline.
USEA fitted correction of a few hundredths of a degree means the stereo rotation in the file matches the rig that recorded the footage.
USERe-running the check on each new session detects knocks and drift long before they show up in depth maps.

Trap 1

Rectified Vertical Residuals Inflate Toward the Edge

The common check — rectify, then measure the row difference between matched points — projects wide-angle rays onto a flat rectified image. Near the edge of a wide field of view that projection stretches rapidly (roughly with 1/cos² of the angle), so the same angular error turns into ever more pixels. On identical matches and an identical calibration, the rectified median grows from 0.50 px at the centre to 4.05 px at 75–90°, while the angular metric stays at 0.46 px.

Line chart comparing angular epipolar error and rectified vertical residual across field angle bins
Figure 4. Same matches, same calibration, two metrics. Rectified residuals make a correct calibration look wrong at the periphery.
Practical Rule

For fisheye or wide-angle stereo, judge calibration fit with an angular metric, or restrict rectified-residual checks to the central part of the field of view.

Trap 2

OpenCV's Default Fisheye Un-projection Clamps at 90° Distorted Angle

In the equidistant model the distorted angle is θd = θ(1 + k₁θ² + k₂θ⁴ + k₃θ⁶ + k₄θ⁸). With a positive k₁ (0.12 for this lens), θd reaches π/2 at a true ray angle of about 74°. In our tested OpenCV 5.0 environment, with this lens model and its coefficients under default settings, cv2.fisheye.undistortPoints clamps θd at π/2, so points beyond about 74° in this tested configuration come back at the wrong angle: 4.5° wrong at 80°, 8° wrong at 85°. Pixels at those angles exist in this image, about 780 px from the principal point.

Round-trip angle error of OpenCV fisheye undistortPoints versus a Newton inversion, from 40 to 90 degrees
Figure 5. Project a ray with the calibrated model, then un-project it. The default OpenCV call is exact up to ~74° and diverges beyond; a direct Newton inversion of θd(θ) stays exact.
Practical Rule

Before trusting un-projected fisheye points, run this round-trip test with your own coefficients and OpenCV version. If it fails, invert θd(θ) yourself (a few Newton steps) or mask points beyond the valid angle.

Technical Boundaries

What This Check Does Not Verify

SCALE

Baseline Length

Absent from the epipolar constraint. Here the 65.08 mm calibration value agreed with a ruler measurement between lens centres — a coarse check only.

DEPTH

Metric Depth Accuracy

Needs targets at measured distances. Not measured in this note.

IMU

Camera–IMU Calibration

Time shift and extrinsics require a separate test; natural head motion did not resolve them to the millisecond.

Machine-Readable Summary

Key Technical Facts

Evidence Summary

On a 120-second 1600×1200 head-mounted stereo recording, a Kalibr pinhole-equidistant calibration from the same capture mode gave a median angular epipolar error of 0.41 px on 19,386 unfiltered SIFT matches, with no adjustment, uniformly from 0° to beyond 75° off-axis. A calibration of the same camera family from a 16:9 mode gave 1.83 px on the same matches. The recording asked for a stereo-rotation correction below 0.02°; a deliberate 0.1° error roughly doubled the median.

Rectified vertical residuals grew from 0.50 px to 4.05 px toward the image edge on the same matches, an artefact of rectified projection. With this lens, OpenCV 5.0's default cv2.fisheye.undistortPoints returned wrong angles beyond about 74° because the distorted angle is clamped at π/2. The check does not verify baseline length, metric depth or camera–IMU calibration.

How to cite this note

Origin Data Lab (2026). Checking a Stereo Calibration on Ordinary Footage. Technical Field Note #04. https://origindatalab.io/technical-field-notes/stereo-calibration-check.html @misc{origindatalab2026fieldnote04, author = {{Origin Data Lab}}, title = {Checking a Stereo Calibration on Ordinary Footage}, howpublished = {Technical Field Note \#04}, year = {2026}, month = oct, url = {https://origindatalab.io/technical-field-notes/stereo-calibration-check.html} }

Related field notes

Calibrated Stereo Data

Every Device, Every Capture Mode, Validated

In stereo production programs, Origin Data Lab delivers per-device, per-capture-mode calibration together with validation on the delivered footage. Request the calibration validation package for our stereo sample, including the scripts used in this note.