Simultaneous left/right frames every 4 s across the recording.
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.
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
SIFT with ratio test only. No RANSAC, so the calibration cannot be flattered by outlier rejection.
Pixels to unit rays by Newton inversion of the distortion model, valid to the edge of the image.
Converted to pixels at the image centre (1° = 8.42 px here), so every field angle is weighted equally.
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


| Field angle | Matches | Median | p90 |
|---|---|---|---|
| 0–20° | 1,373 | 0.48 px | 1.89 px |
| 20–40° | 5,777 | 0.41 px | 1.59 px |
| 40–55° | 4,330 | 0.31 px | 1.56 px |
| 55–65° | 2,873 | 0.42 px | 2.03 px |
| 65–75° | 3,784 | 0.45 px | 1.68 px |
| 75–90° | 1,249 | 0.46 px | 1.80 px |
| All, calibration A | 19,386 | 0.41 px | 1.69 px |
| All, calibration B | 19,386 | 1.83 px | 4.17 px |
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.

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.

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.

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
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.
Metric Depth Accuracy
Needs targets at measured distances. Not measured in this note.
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
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
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.