From e5ff41ec9bdbf1d81d095f82e3b87ce913dd69a7 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 7 Sep 2023 14:09:01 +0300 Subject: [PATCH] fixes extendDictionary, add test --- modules/objdetect/src/aruco/aruco_dictionary.cpp | 3 ++- modules/objdetect/test/test_boarddetection.cpp | 8 ++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/modules/objdetect/src/aruco/aruco_dictionary.cpp b/modules/objdetect/src/aruco/aruco_dictionary.cpp index f73cea3357..3d5f9b1bfd 100644 --- a/modules/objdetect/src/aruco/aruco_dictionary.cpp +++ b/modules/objdetect/src/aruco/aruco_dictionary.cpp @@ -355,6 +355,7 @@ static int _getSelfDistance(const Mat &marker) { Dictionary extendDictionary(int nMarkers, int markerSize, const Dictionary &baseDictionary, int randomSeed) { + CV_Assert(nMarkers > 0); RNG rng((uint64)(randomSeed)); Dictionary out = Dictionary(Mat(), markerSize); @@ -370,7 +371,7 @@ Dictionary extendDictionary(int nMarkers, int markerSize, const Dictionary &base // if baseDictionary is provided, calculate its intermarker distance if(baseDictionary.bytesList.rows > 0) { CV_Assert(baseDictionary.markerSize == markerSize); - out.bytesList = baseDictionary.bytesList.clone(); + out.bytesList = baseDictionary.bytesList.rowRange(0, min(nMarkers, baseDictionary.bytesList.rows)).clone(); int minDistance = markerSize * markerSize + 1; for(int i = 0; i < out.bytesList.rows; i++) { diff --git a/modules/objdetect/test/test_boarddetection.cpp b/modules/objdetect/test/test_boarddetection.cpp index e47e6c3cb6..0c99e6de61 100644 --- a/modules/objdetect/test/test_boarddetection.cpp +++ b/modules/objdetect/test/test_boarddetection.cpp @@ -318,4 +318,12 @@ TEST(CV_ArucoGenerateBoard, regression_1226) { }); } +TEST(CV_ArucoDictionary, extendDictionary) { + aruco::Dictionary base_dictionary = aruco::getPredefinedDictionary(aruco::DICT_4X4_250); + aruco::Dictionary custom_dictionary = aruco::extendDictionary(150, 4, base_dictionary); + + ASSERT_EQ(custom_dictionary.bytesList.rows, 150); + ASSERT_EQ(cv::norm(custom_dictionary.bytesList, base_dictionary.bytesList.rowRange(0, 150)), 0.); +} + }} // namespace