@@ -655,4 +655,77 @@ TEST(CV_ArucoTutorial, can_find_gboriginal)
655
655
}
656
656
}
657
657
658
+ TEST (CV_ArucoDetectMarkers, regression_3192)
659
+ {
660
+ Ptr <aruco::Dictionary> dictionary = aruco::getPredefinedDictionary (aruco::DICT_4X4_50);
661
+ Ptr <aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create ();
662
+ vector< int > markerIds;
663
+ vector<vector<Point2f> > markerCorners;
664
+ string imgPath = cvtest::findDataFile (" aruco/regression_3192.png" );
665
+ Mat image = imread (imgPath);
666
+ const size_t N = 2ull ;
667
+ const int goldCorners[N][8 ] = { {345 ,120 , 520 ,120 , 520 ,295 , 345 ,295 }, {101 ,114 , 270 ,112 , 276 ,287 , 101 ,287 } };
668
+ const int goldCornersIds[N] = { 6 , 4 };
669
+ map<int , const int *> mapGoldCorners;
670
+ for (size_t i = 0 ; i < N; i++)
671
+ mapGoldCorners[goldCornersIds[i]] = goldCorners[i];
672
+
673
+ aruco::detectMarkers (image, dictionary, markerCorners, markerIds, detectorParams);
674
+
675
+ ASSERT_EQ (N, markerIds.size ());
676
+ for (size_t i = 0 ; i < N; i++)
677
+ {
678
+ int arucoId = markerIds[i];
679
+ ASSERT_EQ (4ull , markerCorners[i].size ());
680
+ ASSERT_TRUE (mapGoldCorners.find (arucoId) != mapGoldCorners.end ());
681
+ for (int j = 0 ; j < 4 ; j++)
682
+ {
683
+ EXPECT_NEAR (static_cast <float >(mapGoldCorners[arucoId][j * 2 ]), markerCorners[i][j].x , 1 .f );
684
+ EXPECT_NEAR (static_cast <float >(mapGoldCorners[arucoId][j * 2 + 1 ]), markerCorners[i][j].y , 1 .f );
685
+ }
686
+ }
687
+ }
688
+
689
+ TEST (CV_ArucoDetectMarkers, regression_2492)
690
+ {
691
+ Ptr <aruco::Dictionary> dictionary = aruco::getPredefinedDictionary (aruco::DICT_5X5_50);
692
+ Ptr <aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create ();
693
+ detectorParams->minMarkerDistanceRate = 0.026 ;
694
+ vector< int > markerIds;
695
+ vector<vector<Point2f> > markerCorners;
696
+ string imgPath = cvtest::findDataFile (" aruco/regression_2492.png" );
697
+ Mat image = imread (imgPath);
698
+ const size_t N = 8ull ;
699
+ const int goldCorners[N][8 ] = { {179 ,139 , 179 ,95 , 223 ,95 , 223 ,139 }, {99 ,139 , 99 ,95 , 143 ,95 , 143 ,139 },
700
+ {19 ,139 , 19 ,95 , 63 ,95 , 63 ,139 }, {256 ,140 , 256 ,93 , 303 ,93 , 303 ,140 },
701
+ {256 ,62 , 259 ,21 , 300 ,23 , 297 ,64 }, {99 ,21 , 143 ,17 , 147 ,60 , 103 ,64 },
702
+ {69 ,61 , 28 ,61 , 14 ,21 , 58 ,17 }, {174 ,62 , 182 ,13 , 230 ,19 , 223 ,68 } };
703
+ const int goldCornersIds[N] = {13 , 13 , 13 , 13 , 1 , 15 , 14 , 4 };
704
+ map<int , vector<const int *> > mapGoldCorners;
705
+ for (size_t i = 0 ; i < N; i++)
706
+ mapGoldCorners[goldCornersIds[i]].push_back (goldCorners[i]);
707
+
708
+ aruco::detectMarkers (image, dictionary, markerCorners, markerIds, detectorParams);
709
+
710
+ ASSERT_EQ (N, markerIds.size ());
711
+ for (size_t i = 0 ; i < N; i++)
712
+ {
713
+ int arucoId = markerIds[i];
714
+ ASSERT_EQ (4ull , markerCorners[i].size ());
715
+ ASSERT_TRUE (mapGoldCorners.find (arucoId) != mapGoldCorners.end ());
716
+ float totalDist = 8 .f ;
717
+ for (size_t k = 0ull ; k < mapGoldCorners[arucoId].size (); k++)
718
+ {
719
+ float dist = 0 .f ;
720
+ for (int j = 0 ; j < 4 ; j++) // total distance up to 4 points
721
+ {
722
+ dist += abs (mapGoldCorners[arucoId][k][j * 2 ] - markerCorners[i][j].x );
723
+ dist += abs (mapGoldCorners[arucoId][k][j * 2 + 1 ] - markerCorners[i][j].y );
724
+ }
725
+ totalDist = min (totalDist, dist);
726
+ }
727
+ EXPECT_LT (totalDist, 8 .f );
728
+ }
729
+ }
730
+
658
731
}} // namespace
0 commit comments