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