From ee9a42e9cdcf58991fd22e00cc9acfe055ff0c93 Mon Sep 17 00:00:00 2001 From: Vladislav Sovrasov Date: Tue, 12 Jul 2016 13:34:34 +0300 Subject: [PATCH] Fix calibration fail on python with CALIB_THIN_PRISM_MODEL flag --- modules/calib3d/src/calibration.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/modules/calib3d/src/calibration.cpp b/modules/calib3d/src/calibration.cpp index fee02f5b9..6ef26b2ed 100644 --- a/modules/calib3d/src/calibration.cpp +++ b/modules/calib3d/src/calibration.cpp @@ -3189,9 +3189,10 @@ static Mat prepareCameraMatrix(Mat& cameraMatrix0, int rtype) return cameraMatrix; } -static Mat prepareDistCoeffs(Mat& distCoeffs0, int rtype) +static Mat prepareDistCoeffs(Mat& distCoeffs0, int rtype, int outputSize = 14) { - Mat distCoeffs = Mat::zeros(distCoeffs0.cols == 1 ? Size(1, 14) : Size(14, 1), rtype); + CV_Assert((int)distCoeffs0.total() <= outputSize); + Mat distCoeffs = Mat::zeros(distCoeffs0.cols == 1 ? Size(1, outputSize) : Size(outputSize, 1), rtype); if( distCoeffs0.size() == Size(1, 4) || distCoeffs0.size() == Size(1, 5) || distCoeffs0.size() == Size(1, 8) || @@ -3398,7 +3399,8 @@ double cv::calibrateCamera(InputArrayOfArrays _objectPoints, Mat cameraMatrix = _cameraMatrix.getMat(); cameraMatrix = prepareCameraMatrix(cameraMatrix, rtype); Mat distCoeffs = _distCoeffs.getMat(); - distCoeffs = prepareDistCoeffs(distCoeffs, rtype); + distCoeffs = (flags & CALIB_THIN_PRISM_MODEL) && !(flags & CALIB_TILTED_MODEL) ? prepareDistCoeffs(distCoeffs, rtype, 12) : + prepareDistCoeffs(distCoeffs, rtype); if( !(flags & CALIB_RATIONAL_MODEL) && (!(flags & CALIB_THIN_PRISM_MODEL)) && (!(flags & CALIB_TILTED_MODEL)))