diff --git a/aslam_cv/aslam_cameras/include/aslam/cameras/GridCalibrationTargetCirclegrid.hpp b/aslam_cv/aslam_cameras/include/aslam/cameras/GridCalibrationTargetCirclegrid.hpp index 06eeed6e8..5ec9e3451 100644 --- a/aslam_cv/aslam_cameras/include/aslam/cameras/GridCalibrationTargetCirclegrid.hpp +++ b/aslam_cv/aslam_cameras/include/aslam/cameras/GridCalibrationTargetCirclegrid.hpp @@ -59,6 +59,9 @@ class GridCalibrationTargetCirclegrid : public GridCalibrationTargetBase { bool computeObservation(const cv::Mat &image, Eigen::MatrixXd &outImagePoints, std::vector &outCornerObserved) const; + /// \brief receive the circlegrid options + const CirclegridOptions options() const {return _options;} + private: /// \brief initialize the object void initialize(); diff --git a/aslam_cv/aslam_cameras/include/aslam/cameras/implementation/OmniProjection.hpp b/aslam_cv/aslam_cameras/include/aslam/cameras/implementation/OmniProjection.hpp index 91401a42d..2d9666db9 100644 --- a/aslam_cv/aslam_cameras/include/aslam/cameras/implementation/OmniProjection.hpp +++ b/aslam_cv/aslam_cameras/include/aslam/cameras/implementation/OmniProjection.hpp @@ -1,3 +1,5 @@ +#include + namespace aslam { namespace cameras { @@ -773,7 +775,15 @@ bool OmniProjection::initializeIntrinsics(const std::vector(&target)){ + if (circleGrid->options().useAsymmetricCirclegrid){ + MIN_CORNERS = MIN_CORNERS / 2; + } + } + if (count > MIN_CORNERS) { // Resize P to fit with the count of valid points. diff --git a/aslam_cv/aslam_cameras/src/OmniCameraGeometry.cpp b/aslam_cv/aslam_cameras/src/OmniCameraGeometry.cpp index b6ed0821e..bc313e8ca 100644 --- a/aslam_cv/aslam_cameras/src/OmniCameraGeometry.cpp +++ b/aslam_cv/aslam_cameras/src/OmniCameraGeometry.cpp @@ -523,7 +523,15 @@ bool OmniProjection::initializeIntrinsics( } } - const int MIN_CORNERS = 8; + int MIN_CORNERS = 8; + + // allow asymmetric circle grids with half of the minimum corners as 2 asymmetric columns are treated a 1 + if (const aslam::cameras::GridCalibrationTargetCirclegrid* circleGrid = dynamic_cast(&target)){ + if (circleGrid->options().useAsymmetricCirclegrid){ + MIN_CORNERS = MIN_CORNERS / 2; + } + } + // MIN_CORNERS is an arbitrary threshold for the number of corners if (count > MIN_CORNERS) { // Resize P to fit with the count of valid points.