@@ -458,8 +458,9 @@ cv::Mat cv::findEssentialMat( InputArray _points1, InputArray _points2, double f
458
458
return cv::findEssentialMat (_points1, _points2, cameraMatrix, method, prob, threshold, _mask);
459
459
}
460
460
461
- int cv::recoverPose ( InputArray E, InputArray _points1, InputArray _points2, InputArray _cameraMatrix,
462
- OutputArray _R, OutputArray _t, InputOutputArray _mask)
461
+ int cv::recoverPose ( InputArray E, InputArray _points1, InputArray _points2,
462
+ InputArray _cameraMatrix, OutputArray _R, OutputArray _t, double distanceThresh,
463
+ InputOutputArray _mask, OutputArray triangulatedPoints)
463
464
{
464
465
CV_INSTRUMENT_REGION ()
465
466
@@ -506,51 +507,60 @@ int cv::recoverPose( InputArray E, InputArray _points1, InputArray _points2, Inp
506
507
// Notice here a threshold dist is used to filter
507
508
// out far away points (i.e. infinite points) since
508
509
// there depth may vary between postive and negtive.
509
- double dist = 50.0 ;
510
+ std::vector<Mat> allTriangulations ( 4 ) ;
510
511
Mat Q;
512
+
511
513
triangulatePoints (P0, P1, points1, points2, Q);
514
+ if (triangulatedPoints.needed ())
515
+ Q.copyTo (allTriangulations[0 ]);
512
516
Mat mask1 = Q.row (2 ).mul (Q.row (3 )) > 0 ;
513
517
Q.row (0 ) /= Q.row (3 );
514
518
Q.row (1 ) /= Q.row (3 );
515
519
Q.row (2 ) /= Q.row (3 );
516
520
Q.row (3 ) /= Q.row (3 );
517
- mask1 = (Q.row (2 ) < dist ) & mask1;
521
+ mask1 = (Q.row (2 ) < distanceThresh ) & mask1;
518
522
Q = P1 * Q;
519
523
mask1 = (Q.row (2 ) > 0 ) & mask1;
520
- mask1 = (Q.row (2 ) < dist ) & mask1;
524
+ mask1 = (Q.row (2 ) < distanceThresh ) & mask1;
521
525
522
526
triangulatePoints (P0, P2, points1, points2, Q);
527
+ if (triangulatedPoints.needed ())
528
+ Q.copyTo (allTriangulations[1 ]);
523
529
Mat mask2 = Q.row (2 ).mul (Q.row (3 )) > 0 ;
524
530
Q.row (0 ) /= Q.row (3 );
525
531
Q.row (1 ) /= Q.row (3 );
526
532
Q.row (2 ) /= Q.row (3 );
527
533
Q.row (3 ) /= Q.row (3 );
528
- mask2 = (Q.row (2 ) < dist ) & mask2;
534
+ mask2 = (Q.row (2 ) < distanceThresh ) & mask2;
529
535
Q = P2 * Q;
530
536
mask2 = (Q.row (2 ) > 0 ) & mask2;
531
- mask2 = (Q.row (2 ) < dist ) & mask2;
537
+ mask2 = (Q.row (2 ) < distanceThresh ) & mask2;
532
538
533
539
triangulatePoints (P0, P3, points1, points2, Q);
540
+ if (triangulatedPoints.needed ())
541
+ Q.copyTo (allTriangulations[2 ]);
534
542
Mat mask3 = Q.row (2 ).mul (Q.row (3 )) > 0 ;
535
543
Q.row (0 ) /= Q.row (3 );
536
544
Q.row (1 ) /= Q.row (3 );
537
545
Q.row (2 ) /= Q.row (3 );
538
546
Q.row (3 ) /= Q.row (3 );
539
- mask3 = (Q.row (2 ) < dist ) & mask3;
547
+ mask3 = (Q.row (2 ) < distanceThresh ) & mask3;
540
548
Q = P3 * Q;
541
549
mask3 = (Q.row (2 ) > 0 ) & mask3;
542
- mask3 = (Q.row (2 ) < dist ) & mask3;
550
+ mask3 = (Q.row (2 ) < distanceThresh ) & mask3;
543
551
544
552
triangulatePoints (P0, P4, points1, points2, Q);
553
+ if (triangulatedPoints.needed ())
554
+ Q.copyTo (allTriangulations[3 ]);
545
555
Mat mask4 = Q.row (2 ).mul (Q.row (3 )) > 0 ;
546
556
Q.row (0 ) /= Q.row (3 );
547
557
Q.row (1 ) /= Q.row (3 );
548
558
Q.row (2 ) /= Q.row (3 );
549
559
Q.row (3 ) /= Q.row (3 );
550
- mask4 = (Q.row (2 ) < dist ) & mask4;
560
+ mask4 = (Q.row (2 ) < distanceThresh ) & mask4;
551
561
Q = P4 * Q;
552
562
mask4 = (Q.row (2 ) > 0 ) & mask4;
553
- mask4 = (Q.row (2 ) < dist ) & mask4;
563
+ mask4 = (Q.row (2 ) < distanceThresh ) & mask4;
554
564
555
565
mask1 = mask1.t ();
556
566
mask2 = mask2.t ();
@@ -583,20 +593,23 @@ int cv::recoverPose( InputArray E, InputArray _points1, InputArray _points2, Inp
583
593
584
594
if (good1 >= good2 && good1 >= good3 && good1 >= good4)
585
595
{
596
+ if (triangulatedPoints.needed ()) allTriangulations[0 ].copyTo (triangulatedPoints);
586
597
R1.copyTo (_R);
587
598
t.copyTo (_t);
588
599
if (_mask.needed ()) mask1.copyTo (_mask);
589
600
return good1;
590
601
}
591
602
else if (good2 >= good1 && good2 >= good3 && good2 >= good4)
592
603
{
604
+ if (triangulatedPoints.needed ()) allTriangulations[1 ].copyTo (triangulatedPoints);
593
605
R2.copyTo (_R);
594
606
t.copyTo (_t);
595
607
if (_mask.needed ()) mask2.copyTo (_mask);
596
608
return good2;
597
609
}
598
610
else if (good3 >= good1 && good3 >= good2 && good3 >= good4)
599
611
{
612
+ if (triangulatedPoints.needed ()) allTriangulations[2 ].copyTo (triangulatedPoints);
600
613
t = -t;
601
614
R1.copyTo (_R);
602
615
t.copyTo (_t);
@@ -605,6 +618,7 @@ int cv::recoverPose( InputArray E, InputArray _points1, InputArray _points2, Inp
605
618
}
606
619
else
607
620
{
621
+ if (triangulatedPoints.needed ()) allTriangulations[3 ].copyTo (triangulatedPoints);
608
622
t = -t;
609
623
R2.copyTo (_R);
610
624
t.copyTo (_t);
@@ -613,6 +627,12 @@ int cv::recoverPose( InputArray E, InputArray _points1, InputArray _points2, Inp
613
627
}
614
628
}
615
629
630
+ int cv::recoverPose ( InputArray E, InputArray _points1, InputArray _points2, InputArray _cameraMatrix,
631
+ OutputArray _R, OutputArray _t, InputOutputArray _mask)
632
+ {
633
+ return cv::recoverPose (E, _points1, _points2, _cameraMatrix, _R, _t, 50 , _mask);
634
+ }
635
+
616
636
int cv::recoverPose ( InputArray E, InputArray _points1, InputArray _points2, OutputArray _R,
617
637
OutputArray _t, double focal, Point2d pp, InputOutputArray _mask)
618
638
{
0 commit comments