@@ -677,4 +677,38 @@ TEST(Charuco, testCharucoCornersCollinear_false)
677677 EXPECT_FALSE (result);
678678}
679679
680+ TEST (Charuco, issue_14014)
681+ {
682+ Ptr<aruco::Dictionary> dico = aruco::getPredefinedDictionary (aruco::PREDEFINED_DICTIONARY_NAME (cv::aruco::DICT_7X7_250));
683+ Ptr<aruco::CharucoBoard> board = aruco::CharucoBoard::create (8 , 5 , 0.03455 , 0.02164 , dico);
684+ Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create ();
685+ detectorParams.get ()->cornerRefinementMethod = aruco::CORNER_REFINE_SUBPIX;
686+ detectorParams.get ()->cornerRefinementMinAccuracy = 0.01 ;
687+
688+ std::string testImagePath = cvtest::TS::ptr ()->get_data_path () + " aruco/" ;
689+ Mat img = imread (testImagePath + " nonrecover.png" );
690+ vector<vector<Point2f> > rejectedPoints;
691+ vector<Mat> corners;
692+ vector<int > ids;
693+
694+ aruco::detectMarkers (img, dico, corners, ids, detectorParams, rejectedPoints);
695+ ASSERT_FALSE (corners.empty ());
696+ EXPECT_EQ (Size (4 , 1 ), corners[0 ].size ());
697+ aruco::refineDetectedMarkers (img, board, corners, ids, rejectedPoints);
698+ ASSERT_FALSE (corners.empty ());
699+ EXPECT_EQ (Size (4 , 1 ), corners[0 ].size ());
700+
701+ rejectedPoints.clear ();
702+ corners.clear ();
703+ ids.clear ();
704+
705+ img = imread (testImagePath + " recover.png" );
706+ aruco::detectMarkers (img, dico, corners, ids, detectorParams, rejectedPoints);
707+ ASSERT_FALSE (corners.empty ());
708+ EXPECT_EQ (Size (4 , 1 ), corners[0 ].size ());
709+ aruco::refineDetectedMarkers (img, board, corners, ids, rejectedPoints);
710+ ASSERT_FALSE (corners.empty ());
711+ EXPECT_EQ (Size (4 , 1 ), corners[0 ].size ());
712+ }
713+
680714}} // namespace
0 commit comments