-
Preparation:
-
If there are multiple cameras, fix all cameras that need calibration, and ensure they are rigidly connected.
- After calibration, the cameras should not be disassembled or repositioned. Even disassembling and restoring them to the original state requires recalibration (as extrinsic parameters may change).
-
The focal length of the camera should remain fixed.
-
During calibration, focal length should not be adjusted (i.e., no focusing or zooming).
-
It is best to use a fixed-focus camera (no zoom, no focus adjustment, focal length stays constant).
-
If a zoom camera must be calibrated, calibration should be performed separately for different focal lengths (zoom levels) and focus settings. (In theory, cameras without focus breathing can allow focusing, since its effect on focal length can be corrected.)
- Example: For zoom levels 1, 2, 3, 4 and focus settings 100, 200, 300, 400, calibration should be performed separately. That’s 4 × 4 = 16 calibrations. Assuming 15 photo sets per calibration, 240 sets of photos are required.
-
-
Place the calibration board in front of the cameras, ensuring all cameras can see the full board.
-
Capture images simultaneously with all cameras and save them. One set = one simultaneous capture.
-
File structure:
-
Each camera’s images should be saved in a separate folder.
-
[Optional] Images from the same set but different cameras should have identical filenames to maintain order.
-
Example:
├── cameras │ ├── camera1 │ │ ├── image1.jpg │ │ └── image2.jpg │ └── camera2 │ ├── image1.jpg │ └── image2.jpg
-
-
-
Move the calibration board to new positions and repeat until 10–20 sets of photos are obtained.
-
-
Run
Camera Calibrate.exeorpython main.py -
Click
Open Folderto select the folder containing images. The folder structure determines whether single-camera or multi-camera calibration is performed. Supported formats:jpg,png,bmp.-
Multi-camera calibration requires the following folder structure, with identical numbers of images per camera:
├── cameras │ ├── camera1 │ │ ├── image1.jpg │ │ └── image2.jpg │ └── camera2 │ ├── photo1.jpg │ └── photo2.jpg -
Single-camera calibration requires:
├── camera │ ├── image1.jpg │ └── image2.jpg
-
-
After import, a table appears on the right. For each camera, all images must share the same resolution. The first image defines the standard size; mismatched images are flagged.
-
Click
Displayto browse images.Cameradropdown shows camera name,Batchrefers to image index (matching the table). -
Go to the
Calibratetab. ModifyPattern Configto match the calibration board in the images. Control points update in real time in the right-side plot.-
Chess board: control points = corners of black/white squares. Enabling
Auxiliaryadds cross markers. -
Circle grid: control points = circle centers. Enabling
Auxiliaryadds circle markers. -
Options:
-
Type: board typeChess boardCircle grid
-
Stagger: only for circle gridsN/AVerticalHorizontal
-
Reverse: flips the pattern (x,y) -
shape: rows × columns of control points -
size: spacing between control points (chessboard square size, circle grid spacing)
-
-
-
Adjust parameters under
Calibrate Config(see Calibration Parameters). -
Click
Calibrateto start calibration. -
[Optional] Use
ThresholdunderReprojection Errorto filter out images with high errors.Results update in the table and scatter plot (outliers shown as “x”).
-
3D Plottab shows spatial relations between cameras and calibration boards. Left-drag to rotate, right-drag to zoom.Equal Aspect: lock axis proportions.Change Axis: reorder axes for easier viewing.
-
Save results via
File→Save. Supported formats:xml,yaml,json(OpenCV format).
| Name | Board Type | Mono/Stereo | Meaning |
|---|---|---|---|
| Threshold (Reprojection Error) | N/A | Mono | Threshold |
| Flag | Chessboard | Mono | flags |
| Blob Detector | Circle grid | Mono | SimpleBlobDetector::Params |
| Flag | Circle grid | Mono | flags |
| Strict Condition (Mono) | N/A | Mono | Strict Condition |
| Term Criteria | N/A | N/A | TermCriteria |
| Strict Condition (Stereo) | N/A | Stereo | Strict Condition |
| Ignore Order | N/A | Stereo | Ignore Order |
| Focus first camera | N/A | Stereo | Focus first camera |
Reprojection Error Threshold is only available after at least one calibration. Images exceeding the threshold are skipped in subsequent calibrations.
A set = images captured simultaneously by all cameras. The set is only valid if all images are usable.
Example: Camera A has a1, a2, a3; Camera B has b1, b2, b3. If a2 is invalid:
- Checked: A → {a1, a3}, B → {b1, b3}
- Unchecked: A → {a1, a3}, B → {b1, b2, b3}
Same as above, extended to stereo/multi-camera groups.
Use combinations rather than permutations for pairwise calibration.
Only compute relations between the first camera and all others.
Modify customConfig.yaml to change log level, console output, theme colors, and default calibration parameters. Flags are annotated from low bit to high bit.
Coordinate mapping between two cameras follows:
where
docker run --rm -v $(pwd):/data pandoc/extra:3.2.0-ubuntu \
bash -c "apt-get update -qq && apt-get install -y -qq fonts-wqy-zenhei && pandoc --pdf-engine=xelatex -V 'CJKmainfont:WenQuanYi Zen Hei' --template eisvogel --standalone readme.md -o readme.pdf"
-
PDF generated via
Helphas broken links. -
On Linux, additional dependencies may be required:
- libxcb-xinerama0
- mesa-utils
- libgl1-mesa-glx
- UI optimization (progress bar, etc.)
- Circle grid parameter refinement (large variation in dot size limits)
- Real-time blob tuning for multi-camera calibration (display inertia/convexity/circularity histograms)











