diff --git a/modules/calib3d/src/epnp.cpp b/modules/calib3d/src/epnp.cpp index 7edbf45b01..678ccfafdd 100644 --- a/modules/calib3d/src/epnp.cpp +++ b/modules/calib3d/src/epnp.cpp @@ -29,10 +29,18 @@ epnp::epnp(const cv::Mat& cameraMatrix, const cv::Mat& opoints, const cv::Mat& i alphas.resize(4 * number_of_correspondences); pcs.resize(3 * number_of_correspondences); + + max_nr = 0; + A1 = NULL; + A2 = NULL; } epnp::~epnp() { + if (A1) + delete[] A1; + if (A2) + delete[] A2; } void epnp::choose_control_points(void) @@ -513,9 +521,6 @@ void epnp::gauss_newton(const CvMat * L_6x10, const CvMat * Rho, void epnp::qr_solve(CvMat * A, CvMat * b, CvMat * X) { - static int max_nr = 0; - static double * A1, * A2; - const int nr = A->rows; const int nc = A->cols; diff --git a/modules/calib3d/src/epnp.h b/modules/calib3d/src/epnp.h index 71f3aa9366..99378f91ec 100644 --- a/modules/calib3d/src/epnp.h +++ b/modules/calib3d/src/epnp.h @@ -14,24 +14,24 @@ class epnp { void compute_pose(cv::Mat& R, cv::Mat& t); private: template - void init_camera_parameters(const cv::Mat& cameraMatrix) - { - uc = cameraMatrix.at (0, 2); - vc = cameraMatrix.at (1, 2); - fu = cameraMatrix.at (0, 0); - fv = cameraMatrix.at (1, 1); + void init_camera_parameters(const cv::Mat& cameraMatrix) + { + uc = cameraMatrix.at (0, 2); + vc = cameraMatrix.at (1, 2); + fu = cameraMatrix.at (0, 0); + fv = cameraMatrix.at (1, 1); } template void init_points(const cv::Mat& opoints, const cv::Mat& ipoints) { - for(int i = 0; i < number_of_correspondences; i++) - { + for(int i = 0; i < number_of_correspondences; i++) + { pws[3 * i ] = opoints.at(0,i).x; pws[3 * i + 1] = opoints.at(0,i).y; pws[3 * i + 2] = opoints.at(0,i).z; us[2 * i ] = ipoints.at(0,i).x*fu + uc; - us[2 * i + 1] = ipoints.at(0,i).y*fv + vc; + us[2 * i + 1] = ipoints.at(0,i).y*fv + vc; } } double reprojection_error(const double R[3][3], const double t[3]); @@ -74,6 +74,8 @@ class epnp { double cws[4][3], ccs[4][3]; double cws_determinant; + int max_nr; + double * A1, * A2; }; #endif