From 60c06e551adbb66a6455199927228dba769f1318 Mon Sep 17 00:00:00 2001 From: Pavel Rojtberg Date: Wed, 16 Sep 2015 18:36:42 +0200 Subject: [PATCH] calibrateCamera: do not require rvec and tvec to be vector if they are not we also do not need to allocate a local copy of the rvec and tvec --- modules/calib3d/src/calibration.cpp | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/modules/calib3d/src/calibration.cpp b/modules/calib3d/src/calibration.cpp index d520fe349a..91f9b043ab 100644 --- a/modules/calib3d/src/calibration.cpp +++ b/modules/calib3d/src/calibration.cpp @@ -3221,14 +3221,25 @@ double cv::calibrateCamera( InputArrayOfArrays _objectPoints, bool rvecs_needed = _rvecs.needed(), tvecs_needed = _tvecs.needed(); + bool rvecs_mat_vec = _rvecs.isMatVector(); + bool tvecs_mat_vec = _tvecs.isMatVector(); + if( rvecs_needed ) { _rvecs.create(nimages, 1, CV_64FC3); - rvecM.create(nimages, 3, CV_64F); + + if(rvecs_mat_vec) + rvecM.create(nimages, 3, CV_64F); + else + rvecM = _rvecs.getMat(); } if( tvecs_needed ) { _tvecs.create(nimages, 1, CV_64FC3); - tvecM.create(nimages, 3, CV_64F); + + if(tvecs_mat_vec) + tvecM.create(nimages, 3, CV_64F); + else + tvecM = _tvecs.getMat(); } collectCalibrationData( _objectPoints, _imagePoints, noArray(), @@ -3242,15 +3253,16 @@ double cv::calibrateCamera( InputArrayOfArrays _objectPoints, rvecs_needed ? &c_rvecM : NULL, tvecs_needed ? &c_tvecM : NULL, flags, criteria ); + // overly complicated and inefficient rvec/ tvec handling to support vector for(int i = 0; i < nimages; i++ ) { - if( rvecs_needed ) + if( rvecs_needed && rvecs_mat_vec) { _rvecs.create(3, 1, CV_64F, i, true); Mat rv = _rvecs.getMat(i); memcpy(rv.ptr(), rvecM.ptr(i), 3*sizeof(double)); } - if( tvecs_needed ) + if( tvecs_needed && tvecs_mat_vec) { _tvecs.create(3, 1, CV_64F, i, true); Mat tv = _tvecs.getMat(i); -- GitLab