Accurate camera intrinsic calibration depends on the quality of the collected images, yet existing target-based methods often require the practitioner to select high-quality images and to specify the radial distortion order manually. This work determines both from the collected data.
Key insight: the two decisions are coupled through the residual. A higher-order model lowers the residual scale that defines the rejection threshold, and the calibration-set residual cannot validate the added coefficient. Image rejection therefore runs under each candidate order, and the order is selected on held-out images with the intrinsics and distortion fixed.
- Intrinsic calibration method. An automatic and operator-free method iteratively selects high-quality images and the distortion order, yielding accurate and reproducible intrinsics.
- Distortion-order selection. A criterion evaluates each candidate on held-out images with the intrinsics and distortion fixed, avoiding the use of calibration-set residuals to assess model adequacy.
- Interactive calibration tool. An open-source tool for chessboard and AprilGrid targets, validated on public datasets and real-world robots.
![]() |
![]() |
|---|
- 2026/11: The paper is published in IEEE Robotics and Automation Practice (RA-P) as early access, DOI: 10.1109/RAP.2026.3751239.
- 2026/11: The paper has been accepted by IEEE Robotics and Automation Practice (RA-P).
- 2026/10/11: The calibration tool, data and experiment scripts are released.
- 2026/09/09: The paper is available on arXiv.
Click the image to play the full video (92 s).
Image selection. Stage 1 admits an image only if the extractor recovers the complete inner-corner grid. Stage 2 iteratively rejects the images whose mean residual exceeds a multiple of the median and re-solves the calibration:
Distortion-order selection. The accepted set is split into an estimation subset and a validation subset
All hyper-parameters are fixed across every dataset:
Interactive tool. The tool displays the filtering status of every image and the distribution of calibration points, and records every decision. Left: a chessboard session (Rig-A, played at 3x). Right: an AprilGrid session (Rig-C).
![]() |
![]() |
|---|
| Dataset | Camera | Target | Data |
|---|---|---|---|
Rig-A |
1920 x 1080, 111° | chessboard 11 x 8, 45 mm | 39 images |
Rig-B |
second camera of the same model | chessboard 11 x 8, 45 mm | 64 images |
Rig-C |
handheld stereo FLIR, 1440 x 1080, 113° | 3 x 3 AprilGrid | sessions D1, D2; sequences S1, S2, S3 |
Rig-D |
wheeled robot, Rig-A camera model | chessboard 11 x 8, 45 mm | one 163 s sequence |
Public |
OpenCalib, ROS, OpenCV | chessboard | five sessions |
Rig-A and Rig-B ship in data/. The Rig-C and Rig-D bags are available from Baidu Netdisk (code vihg), and the public sessions are fetched from their original sources. docs/DATA.md lists the data of every experiment.
Image selection and cross-session consistency. On Rig-A, the two stages reduce the held-out error from 0.419 to 0.316 px (25%). On Rig-C, the method reduces the cross-session error of Kalibr by 36 to 50% on both cameras, and the focal length varies by less than 1.5 px between the days, against about 7 px for Kalibr.
![]() |
![]() |
|---|
Order selection and ablation. On Rig-A,
![]() |
![]() |
|---|
Public sessions and odometry. The pipeline achieves the lowest held-out mean on all five public sessions. With OpenVINS, the intrinsics yield the lowest trajectory error on all three Rig-C sequences and the lowest median error on Rig-D.
![]() |
![]() |
|---|
The implementation uses Python 3.10, OpenCV 4.13 and PySide6, and has been tested on Ubuntu 20.04.
git clone https://github.com/JokerJohn/IntrinsicCalib.git && cd IntrinsicCalib
conda create -n intrinsic_calib python=3.10 && conda activate intrinsic_calib
pip install -r requirements.txt
sudo apt install g++ pkg-config libopencv-dev libeigen3-dev # Kalibr extractors, compiled on first use
python tool/run_intrinsics_gui.py data/rig_a # interactive tool: Detect All, then Calibrate
python experiments/public/experiment/rap_headless.py data/rig_a --out rig_a.json # headlessThe headless run returns 39 detected, 27 after Stage 1, 20 final,
tool/ calibration package intrinsic_calib and the launcher
experiments/ public (Table I), rigc (Table II), vio (Table III)
data/ Rig-A, Rig-B, Rig-C Kalibr files, manifest of the bags
tests/ tests of the Rig-A selection, the AprilGrid extraction and the tool
- Release the calibration tool and the experiment scripts
- Release the Rig-A to Rig-D data
- Add rational and fisheye candidate models
- Add coverage constraints
- Support rolling-shutter and event cameras
@article{hu2026intrinsiccalib,
title = {Automatic Reproducible Camera Intrinsic Calibration},
author = {Hu, Xiangcheng},
journal = {IEEE Robotics and Automation Practice},
doi = {10.1109/RAP.2026.3751239},
eprint = {2609.10082},
archivePrefix = {arXiv},
primaryClass = {cs.RO},
year = {2026}
}Related work: P²Calib and VeriCalib.
The tool uses OpenCV and the ethz_apriltag2 decoder of Kalibr. The evaluation uses the data and baselines of OpenCalib, ROS camera_calibration, mrcal and Kalibr. The odometry experiments and the ground truth use OpenVINS, evo, FAST-LIO2, PALoc and Manual Loop Closure Tools.
Released under the MIT license. tool/intrinsic_calib/kalibr_extractor/third_party/ contains the ethz_apriltag2 sources and the target-extractor code of Kalibr (BSD, KALIBR_LICENSE). The public sessions keep the licences of their sources.











