Check out our latest camcalib release here.
Upgrade to a Personal, or Pro version of camcalib.
This guide will help you construct your very own calibration pattern.
14 days of free camcalib Pro with our demo: on windows, simply install the latest release and lanuch camcalib. You will be given the option to start a trial. On linux simply open the AppImage and choose the option to create a demo key.
Find our latest articles and news at camcalib.io.
Try our our live calibration feature with your IDS cameras by first installing the UEye SDK & Drivers.
If you encounter any problems or have a feature request, hit up our issues page.
Ubuntu 18.04, 20.04 and 22.04 or Windows 10.
Depending on the size of your calibration data, an adequate amount of RAM (minimum 8GB) is necessary.
Make sure to read the documentation below, but keep in mind that we are constantly updating and expanding articles and guides on our blog. There are a bunch of guides and articles there to get you started with your application fast.
Coming soon: camcalib tutorials and hands-on guides on youtube. Stay tuned!
If calibration data is loaded from disk, there are currently two ways. Either the data must be provided as indexed ROS bag or structured in folders as images or videos. Currently, PNG and JPG/JPEG images or MOV, AVI and MP4 are supported.
For the folder method, if you provide images, it is necessary that the images are structured in subfolders. If you have videos, just place them inside the folder. The names of the subfolders or videos are taken as unique camera ids.
For the extrinsic calibration it is necessary that the images are recognised as synchronised. Therefore, images, that are taken at the exact same time, must have the same filename. If timestamps are used for the image filename, use "_" as decimal seperator. Video files have internal timestamps, depending on their FPS, starting from 0.0s. For example:
dataset
├── cam0.mov
├── cam1
│ ├── 0_03.png
│ ├── 0_25.png
│ ├── ...
│ └── 9_76.png
├── cam2
│ ├── 0_03.png
│ ├── 0_25.png
│ ├── ...
│ └── 9_76.png
│ ...
Currently, AprilTag
and ChArUco boards are supported. This will change
in the future.
If you have troubles to get one of these, don't hesitate to contact us.
Please ensure that:
Supported camera models are
- Pinhole (fx, fy, cx, cy):
- fx, fy: focal length, cx, cy: image center
- for cameras without distortion
- PinholeRadTan (fx, fy, cx, cy, k1, k2, p1,
p2): (details)
- fx, fy: focal length; cx, cy: image center; k1, k2: radial distortion; p1, p2: tangential distortion
- common model compatible with openCV, matlab, etc.
- KannalaBrandt (fx, fy, cx, cy, k1, k2, k3,
k4): (details)
- fx, fy: focal length; cx, cy: image center; k1, k2, k3, k4: equidistant distortion
- common model for wide FOV cameras compatible with openCV, matlab, etc.
- DoubleSphere (fx, fy, cx, cy, xi, alpha): (details)
- fx, fy: focal length; cx, cy: image center; xi: sphere shift; alpha: image plane shift
- works with all kind of lens distortion even with fisheye
- few distortion parameters (xi, alpha) makes optimization more robust
Calibration results can be exported as YAML file. The parameters can then be found in the "sensors" section. Depending on the type of calibration, each camera identifier has intrinsic and possibly extrinsic parameters.
The intrinsics section has the keys "type" that specifies the chosen camera model and "parameters" that holds the calibrated parameters corresponding to the camera model.
The extrinsics of a sensor is an SE(3)
Pose
represented as axis-angle and translation.
transforms from
frame
to
frame
where
is the reference frame and
is the frame of
sensor
.
Thus the transformation from Sensor
to
is given by
Most of the time, the reference frame coincides with the frame of a
sensor e.g.
(called primary). Then the extrinsics of this sensor
is the identity and the transformation of any other sensor frame
to
is simply the extrinsics given
for
.
An example results file could look like the following:
sensors:
'cam0':
extrinsics:
axis_angle:
- 0.0
- 0.0
- 0.0
translation:
- 0.0
- 0.0
- 0.0
intrinsics:
parameters:
alpha: 0.30000000000000004
cx: 640.0
cy: 510.0
fx: 2300.0
fy: 2300.0
image_size:
- 1280
- 1024
xi: -0.001
type: DoubleSphereInit
'cam1':
extrinsics:
axis_angle:
- 0.3000000000000015
- 0.20000000000000084
- 0.01999999999999994
translation:
- -0.2
- 0.30000000000000004
- 0.30000000000000004
intrinsics:
parameters:
alpha: 0.30000000000000004
cx: 640.0
cy: 510.0
fx: 2300.0
fy: 2300.0
image_size:
- 1280
- 1024
xi: -0.002
type: DoubleSphereInit