From a5b3a205d9e54f451dbc888cd068ab147e256987 Mon Sep 17 00:00:00 2001 From: edgarriba Date: Thu, 2 Oct 2014 16:45:04 +0200 Subject: [PATCH] Add UPNP case + Modify model_points --- modules/calib3d/src/solvepnp.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/modules/calib3d/src/solvepnp.cpp b/modules/calib3d/src/solvepnp.cpp index 9ed7779..2fb8a8d 100644 --- a/modules/calib3d/src/solvepnp.cpp +++ b/modules/calib3d/src/solvepnp.cpp @@ -41,6 +41,7 @@ //M*/ #include "precomp.hpp" +#include "upnp.h" #include "dls.h" #include "epnp.h" #include "p3p.h" @@ -107,6 +108,15 @@ bool cv::solvePnP( InputArray _opoints, InputArray _ipoints, cv::Rodrigues(R, rvec); return result; } + else if (flags == SOLVEPNP_UPNP) + { + upnp PnP(cameraMatrix, opoints, ipoints); + + cv::Mat R, rvec = _rvec.getMat(), tvec = _tvec.getMat(); + PnP.compute_pose(R, tvec); + cv::Rodrigues(R, rvec); + return true; + } else CV_Error(CV_StsBadArg, "The flags argument must be one of SOLVEPNP_ITERATIVE, SOLVEPNP_P3P, SOLVEPNP_EPNP or SOLVEPNP_DLS"); return false; @@ -205,6 +215,7 @@ bool cv::solvePnPRansac(InputArray _opoints, InputArray _ipoints, int model_points = 4; // minimum of number of model points if( flags == cv::SOLVEPNP_ITERATIVE ) model_points = 6; + else if( flags == cv::SOLVEPNP_UPNP ) model_points = 6; else if( flags == cv::SOLVEPNP_EPNP ) model_points = 5; double param1 = reprojectionError; // reprojection error -- 2.7.4