diff --git a/modules/aruco/src/aruco.cpp b/modules/aruco/src/aruco.cpp index 0de4b73f8..e365f0056 100644 --- a/modules/aruco/src/aruco.cpp +++ b/modules/aruco/src/aruco.cpp @@ -1486,7 +1486,7 @@ void refineDetectedMarkers(InputArray _image, const Ptr &_board, _convertToGrey(_image, grey); // vector of final detected marker corners and ids - vector< Mat > finalAcceptedCorners; + vector > finalAcceptedCorners; vector< int > finalAcceptedIds; // fill with the current markers finalAcceptedCorners.resize(_detectedCorners.total()); @@ -1597,38 +1597,18 @@ void refineDetectedMarkers(InputArray _image, const Ptr &_board, // parse output if(finalAcceptedIds.size() != _detectedIds.total()) { - _detectedCorners.clear(); - _detectedIds.clear(); - // parse output Mat(finalAcceptedIds).copyTo(_detectedIds); - - _detectedCorners.create((int)finalAcceptedCorners.size(), 1, CV_32FC2); - for(unsigned int i = 0; i < finalAcceptedCorners.size(); i++) { - _detectedCorners.create(4, 1, CV_32FC2, i, true); - for(int j = 0; j < 4; j++) { - _detectedCorners.getMat(i).ptr< Point2f >()[j] = - finalAcceptedCorners[i].ptr< Point2f >()[j]; - } - } + _copyVector2Output(finalAcceptedCorners, _detectedCorners); // recalculate _rejectedCorners based on alreadyIdentified - vector< Mat > finalRejected; + vector > finalRejected; for(unsigned int i = 0; i < alreadyIdentified.size(); i++) { if(!alreadyIdentified[i]) { finalRejected.push_back(_rejectedCorners.getMat(i).clone()); } } - - _rejectedCorners.clear(); - _rejectedCorners.create((int)finalRejected.size(), 1, CV_32FC2); - for(unsigned int i = 0; i < finalRejected.size(); i++) { - _rejectedCorners.create(4, 1, CV_32FC2, i, true); - for(int j = 0; j < 4; j++) { - _rejectedCorners.getMat(i).ptr< Point2f >()[j] = - finalRejected[i].ptr< Point2f >()[j]; - } - } + _copyVector2Output(finalRejected, _rejectedCorners); if(_recoveredIdxs.needed()) { Mat(recoveredIdxs).copyTo(_recoveredIdxs); diff --git a/modules/aruco/test/test_charucodetection.cpp b/modules/aruco/test/test_charucodetection.cpp index e9cc4a323..a36623c94 100644 --- a/modules/aruco/test/test_charucodetection.cpp +++ b/modules/aruco/test/test_charucodetection.cpp @@ -793,4 +793,35 @@ TEST(CV_ArucoTutorial, can_find_diamondmarkers) EXPECT_EQ(counterGoldCornersIds, counterRes); // check the number of ArUco markers } +TEST(Charuco, issue_14014) +{ + string imgPath = cvtest::findDataFile("aruco/recover.png"); + Mat img = imread(imgPath); + + Ptr dict = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(cv::aruco::DICT_7X7_250)); + Ptr board = aruco::CharucoBoard::create(8, 5, 0.03455f, 0.02164f, dict); + Ptr detectorParams = aruco::DetectorParameters::create(); + detectorParams->cornerRefinementMethod = aruco::CORNER_REFINE_SUBPIX; + detectorParams->cornerRefinementMinAccuracy = 0.01; + + vector corners, rejectedPoints; + vector ids; + + aruco::detectMarkers(img, dict, corners, ids, detectorParams, rejectedPoints); + + ASSERT_EQ(corners.size(), 19ull); + EXPECT_EQ(Size(4, 1), corners[0].size()); // check dimension of detected corners + + ASSERT_EQ(rejectedPoints.size(), 21ull); + EXPECT_EQ(Size(4, 1), rejectedPoints[0].size()); // check dimension of detected corners + + aruco::refineDetectedMarkers(img, board, corners, ids, rejectedPoints); + + ASSERT_EQ(corners.size(), 20ull); + EXPECT_EQ(Size(4, 1), corners[0].size()); // check dimension of rejected corners after successfully refine + + ASSERT_EQ(rejectedPoints.size(), 20ull); + EXPECT_EQ(Size(4, 1), rejectedPoints[0].size()); // check dimension of rejected corners after successfully refine +} + }} // namespace