mrcal 2.3 release notes

New in mrcal 2.3

This is once again a mostly-maintenance release. Many medium-important but significant improvements and fixes are present here. The big update in this release is extended documentation, especially practical notes in the how-to-calibrate page and the recipes. Exciting new features are coming.

Improved discrete point support

Calibrations are still implemented primarily off chessboard observations, but support for discrete points is being added bit by bit:

Full CAHVORE support

CAHVORE models now have gradients implemented, so all the normal functionality now works with these models. We can solve for a CAHVORE model.

This model is noncentral, so unprojection only works if \(E = 0\): when this model behaves centrally


  • mrcal_image_..._crop() is now static inline. This fixes linker errors on some compilers
  • mrcal_cameramodel_t now has double intrinsics[0] instead of double intrinsics[]. This allows #include <mrcal.h> to work inside C++ code
  • mrcal_cameramodel_t has a size unknown at compile time, so it cannot be allocated on the stack. To resolve this we now have mrcal_cameramodel_LENSMODEL_XXXX_t structures for models that have known-at-compile-time size. These can be allocated on the stack, so they are easier to use
  • Dense stereo processing in C is now possible. stereo.h contains:
    • mrcal_rectified_resolution()
    • mrcal_rectified_system()
    • mrcal_rectification_maps()


  • mrcal-stereo writes out a binary disparity image as a 16-bpp .png file. This allows lossless post-processing of the stereo result
  • mrcal-stereo --viz stereo displays both the rectified and input coordinates under the mouse cursor
  • mrcal-stereo can process multiple images in parallel
  • bug fix: mrcal-stereo respects --axis-scale
  • bug fix: mrcal-stereo can once again process multiple files with a single invocation

Generic visualization updates

Image I/O

  • mrcal.save_image() can write 16-bit-per-pixel grayscale images properly. This requires a more recent libfreeimage than is available on some OSs. The tests make sure it works.

Calibration seed bug fix

mrcal.estimate_monocular_calobject_poses_Rt_tocam() ignores invalid input points. This makes calibrating with incomplete chessboard observations work properly

Generic API updates

Migration notes 2.2 -> 2.3

The mrcal_measurement_index_regularization() C function has an extended prototype. To migrate, pass the extra requested arguments.