From 620387fbe11426229dab4d1f5f13399407d5ee26 Mon Sep 17 00:00:00 2001 From: edgarriba Date: Mon, 18 Aug 2014 21:46:16 +0200 Subject: [PATCH] Update perf_pnp && ransac model points --- modules/calib3d/perf/perf_pnp.cpp | 20 +++++++++++++------- modules/calib3d/src/solvepnp.cpp | 5 ++++- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/modules/calib3d/perf/perf_pnp.cpp b/modules/calib3d/perf/perf_pnp.cpp index c957932..3eb30cc 100644 --- a/modules/calib3d/perf/perf_pnp.cpp +++ b/modules/calib3d/perf/perf_pnp.cpp @@ -10,7 +10,7 @@ using namespace perf; using std::tr1::make_tuple; using std::tr1::get; -CV_ENUM(pnpAlgo, SOLVEPNP_ITERATIVE, SOLVEPNP_EPNP, SOLVEPNP_DLS /*, P3P*/) +CV_ENUM(pnpAlgo, SOLVEPNP_ITERATIVE, SOLVEPNP_EPNP, SOLVEPNP_P3P, SOLVEPNP_DLS) typedef std::tr1::tuple PointsNum_Algo_t; typedef perf::TestBaseWithParam PointsNum_Algo; @@ -20,7 +20,7 @@ typedef perf::TestBaseWithParam PointsNum; PERF_TEST_P(PointsNum_Algo, solvePnP, testing::Combine( testing::Values(4, 3*9, 7*13), //TODO: find why results on 4 points are too unstable - testing::Values((int)SOLVEPNP_ITERATIVE, (int)SOLVEPNP_EPNP, (int)SOLVEPNP_DLS) + testing::Values((int)SOLVEPNP_ITERATIVE, (int)SOLVEPNP_EPNP) ) ) { @@ -62,9 +62,15 @@ PERF_TEST_P(PointsNum_Algo, solvePnP, SANITY_CHECK(tvec, 1e-6); } -PERF_TEST(PointsNum_Algo, solveP3P) +PERF_TEST_P(PointsNum_Algo, solvePnPSmallPoints, + testing::Combine( + testing::Values(4), //TODO: find why results on 4 points are too unstable + testing::Values((int)SOLVEPNP_P3P, (int)SOLVEPNP_DLS) + ) + ) { - int pointsNum = 4; + int pointsNum = get<0>(GetParam()); + pnpAlgo algo = get<1>(GetParam()); vector points2d(pointsNum); vector points3d(pointsNum); @@ -94,11 +100,11 @@ PERF_TEST(PointsNum_Algo, solveP3P) TEST_CYCLE_N(1000) { - solvePnP(points3d, points2d, intrinsics, distortion, rvec, tvec, false, SOLVEPNP_P3P); + solvePnP(points3d, points2d, intrinsics, distortion, rvec, tvec, false, algo); } - SANITY_CHECK(rvec, 1e-6); - SANITY_CHECK(tvec, 1e-6); + SANITY_CHECK(rvec, 1e-4); + SANITY_CHECK(tvec, 1e-4); } PERF_TEST_P(PointsNum, DISABLED_SolvePnPRansac, testing::Values(4, 3*9, 7*13)) diff --git a/modules/calib3d/src/solvepnp.cpp b/modules/calib3d/src/solvepnp.cpp index f319284..9ed7779 100644 --- a/modules/calib3d/src/solvepnp.cpp +++ b/modules/calib3d/src/solvepnp.cpp @@ -203,7 +203,10 @@ bool cv::solvePnPRansac(InputArray _opoints, InputArray _ipoints, Ptr cb; // pointer to callback cb = makePtr( cameraMatrix, distCoeffs, flags, useExtrinsicGuess, rvec, tvec); - int model_points = flags == SOLVEPNP_P3P ? 4 : 6; // minimum of number of model points + int model_points = 4; // minimum of number of model points + if( flags == cv::SOLVEPNP_ITERATIVE ) model_points = 6; + else if( flags == cv::SOLVEPNP_EPNP ) model_points = 5; + double param1 = reprojectionError; // reprojection error double param2 = confidence; // confidence int param3 = iterationsCount; // number maximum iterations -- 2.7.4