@@ -302,18 +302,15 @@ class CV_solveP3P_Test : public CV_solvePnPRansac_Test
302
302
if (num_of_solutions != (int ) rvecs.size () || num_of_solutions != (int ) tvecs.size () || num_of_solutions == 0 )
303
303
return false ;
304
304
305
- double min_rvecDiff = DBL_MAX, min_tvecDiff = DBL_MAX;
306
- for (unsigned int i = 0 ; i < rvecs.size (); ++i) {
305
+ bool isTestSuccess = false ;
306
+ double error = DBL_MAX;
307
+ for (unsigned int i = 0 ; i < rvecs.size () && !isTestSuccess; ++i) {
307
308
double rvecDiff = norm (rvecs[i]-trueRvec);
308
- min_rvecDiff = std::min (rvecDiff, min_rvecDiff);
309
- }
310
- for (unsigned int i = 0 ; i < tvecs.size (); ++i) {
311
309
double tvecDiff = norm (tvecs[i]-trueTvec);
312
- min_tvecDiff = std::min (tvecDiff, min_tvecDiff);
310
+ isTestSuccess = rvecDiff < epsilon[method] && tvecDiff < epsilon[method];
311
+ error = std::min (error, std::max (rvecDiff, tvecDiff));
313
312
}
314
- bool isTestSuccess = min_rvecDiff < epsilon[method] && min_tvecDiff < epsilon[method];
315
313
316
- double error = std::max (min_rvecDiff, min_tvecDiff);
317
314
if (error > maxError)
318
315
maxError = error;
319
316
@@ -324,7 +321,7 @@ class CV_solveP3P_Test : public CV_solvePnPRansac_Test
324
321
{
325
322
ts->set_failed_test_info (cvtest::TS::OK);
326
323
327
- vector<Point3f> points, points_dls ;
324
+ vector<Point3f> points;
328
325
points.resize (pointsCount);
329
326
generate3DPointCloud (points);
330
327
@@ -529,3 +526,68 @@ TEST(Calib3d_SolvePnP, translation)
529
526
EXPECT_TRUE (checkRange (rvec));
530
527
EXPECT_TRUE (checkRange (tvec));
531
528
}
529
+
530
+ TEST (Calib3d_SolvePnP, iterativeInitialGuess3pts)
531
+ {
532
+ {
533
+ Matx33d intrinsics (605.4 , 0.0 , 317.35 ,
534
+ 0.0 , 601.2 , 242.63 ,
535
+ 0.0 , 0.0 , 1.0 );
536
+
537
+ double L = 0.1 ;
538
+ vector<Point3d> p3d;
539
+ p3d.push_back (Point3d (-L, -L, 0.0 ));
540
+ p3d.push_back (Point3d (L, -L, 0.0 ));
541
+ p3d.push_back (Point3d (L, L, 0.0 ));
542
+
543
+ Mat rvec_ground_truth = (Mat_<double >(3 ,1 ) << 0.3 , -0.2 , 0.75 );
544
+ Mat tvec_ground_truth = (Mat_<double >(3 ,1 ) << 0.15 , -0.2 , 1.5 );
545
+
546
+ vector<Point2d> p2d;
547
+ projectPoints (p3d, rvec_ground_truth, tvec_ground_truth, intrinsics, noArray (), p2d);
548
+
549
+ Mat rvec_est = (Mat_<double >(3 ,1 ) << 0.2 , -0.1 , 0.6 );
550
+ Mat tvec_est = (Mat_<double >(3 ,1 ) << 0.05 , -0.05 , 1.0 );
551
+
552
+ solvePnP (p3d, p2d, intrinsics, noArray (), rvec_est, tvec_est, true , SOLVEPNP_ITERATIVE);
553
+
554
+ std::cout << " rvec_ground_truth: " << rvec_ground_truth.t () << std::endl;
555
+ std::cout << " rvec_est: " << rvec_est.t () << std::endl;
556
+ std::cout << " tvec_ground_truth: " << tvec_ground_truth.t () << std::endl;
557
+ std::cout << " tvec_est: " << tvec_est.t () << std::endl;
558
+
559
+ EXPECT_LE (norm (rvec_ground_truth, rvec_est, NORM_INF), 1e-6 );
560
+ EXPECT_LE (norm (tvec_ground_truth, tvec_est, NORM_INF), 1e-6 );
561
+ }
562
+
563
+ {
564
+ Matx33f intrinsics (605 .4f , 0 .0f , 317 .35f ,
565
+ 0 .0f , 601 .2f , 242 .63f ,
566
+ 0 .0f , 0 .0f , 1 .0f );
567
+
568
+ float L = 0 .1f ;
569
+ vector<Point3f> p3d;
570
+ p3d.push_back (Point3f (-L, -L, 0 .0f ));
571
+ p3d.push_back (Point3f (L, -L, 0 .0f ));
572
+ p3d.push_back (Point3f (L, L, 0 .0f ));
573
+
574
+ Mat rvec_ground_truth = (Mat_<float >(3 ,1 ) << -0 .75f , 0 .4f , 0 .34f );
575
+ Mat tvec_ground_truth = (Mat_<float >(3 ,1 ) << -0 .15f , 0 .35f , 1 .58f );
576
+
577
+ vector<Point2f> p2d;
578
+ projectPoints (p3d, rvec_ground_truth, tvec_ground_truth, intrinsics, noArray (), p2d);
579
+
580
+ Mat rvec_est = (Mat_<float >(3 ,1 ) << -0 .5f , 0 .2f , 0 .2f );
581
+ Mat tvec_est = (Mat_<float >(3 ,1 ) << 0 .0f , 0 .2f , 1 .0f );
582
+
583
+ solvePnP (p3d, p2d, intrinsics, noArray (), rvec_est, tvec_est, true , SOLVEPNP_ITERATIVE);
584
+
585
+ std::cout << " rvec_ground_truth: " << rvec_ground_truth.t () << std::endl;
586
+ std::cout << " rvec_est: " << rvec_est.t () << std::endl;
587
+ std::cout << " tvec_ground_truth: " << tvec_ground_truth.t () << std::endl;
588
+ std::cout << " tvec_est: " << tvec_est.t () << std::endl;
589
+
590
+ EXPECT_LE (norm (rvec_ground_truth, rvec_est, NORM_INF), 1e-6 );
591
+ EXPECT_LE (norm (tvec_ground_truth, tvec_est, NORM_INF), 1e-6 );
592
+ }
593
+ }
0 commit comments