Warp Calibration¶
When depth map / 3D pointcloud information is not available, the remapping of streams onto a reference is not useable. It is however still possible to align images in different streams, by using bounding boxes defined in the reference stream and applying a linear transform (warp).
This linear calibration is dependent of the distance camera-target: it simply is the shift of a point from on camera’s image to another camera, at a certain distance. Therefore the transform should only be used for images where the subject is at the same distance from the cameras than during the calibration.
To create such a transform, it is necessary to collect four fixed points, static in all streams. First, capture an hdf5 file with a chessboard target kept static during the whole capture, in front of the camears and at a defined distance.
The calibration can then be performed with the warp_calibration.py
script.
Configuration¶
Here is an example of JSON configuration to create for a warp calibration.
{
"stream_config" : "/path/to/streams_config.json",
"pattern_rows": 9,
"pattern_columns": 6,
"frame" : 0,
"streams": {
"camera1_rgb": null,
"camera2_thermal":
{
"threshold" : 155,
"closing" : 4,
"invert" : true
},
"camera3_nir":
{
"threshold" : 105,
"closing" : 2,
"invert" : false
}
},
"duplicate_calibration": {
"camera3_nir": "camera3_depth"
}
}
stream_config
: Path to the JSON data config.pattern_rows/columns
: Number of square rows/columns in the chessboard target. See the image below that
corresponds to 9x6.frame
: Frame number to select in each dataset in the hdf5
files.streams
: Streams to calibrate. The names must correspond to the stream names in the stream_config
.threshold
: Pixel value (0-255) used to binary threshold grayscale image.closing
: Closing size in pixel.invert
: Invert the pixel intensity (used for thermal images, when black square render white pixel under
halogen illumination).duplicate_calibration
: To copy the calibration of one streams to another. Used by example for depth stream that
is aligned with a NIR streams.calibration¶
$ warp_calibration.py -i /path/to/capture.h5 -c warp_config.json -vvv -o /path/to/calibration.json
If the chessboard pattern is not automatically found, the image is displayed. The user must click on the internal 4 side-corners of the chessboard in this order:
down-left (in blue)
up-left (still in blue)
down-right (in yellow)
up-right (in yellow)
If the user does not want to output markers, the window can be closed, the stream will not appear in the JSON output.