Skip to content

Commit a5b2490

Browse files
committed
Merge remote-tracking branch 'upstream/3.4' into merge-3.4
2 parents 7882aea + ed0094c commit a5b2490

File tree

2 files changed

+35
-24
lines changed

2 files changed

+35
-24
lines changed

modules/aruco/src/aruco.cpp

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,7 +1443,7 @@ void refineDetectedMarkers(InputArray _image, const Ptr<Board> &_board,
14431443
_convertToGrey(_image, grey);
14441444

14451445
// vector of final detected marker corners and ids
1446-
vector< Mat > finalAcceptedCorners;
1446+
vector<vector<Point2f> > finalAcceptedCorners;
14471447
vector< int > finalAcceptedIds;
14481448
// fill with the current markers
14491449
finalAcceptedCorners.resize(_detectedCorners.total());
@@ -1554,38 +1554,18 @@ void refineDetectedMarkers(InputArray _image, const Ptr<Board> &_board,
15541554

15551555
// parse output
15561556
if(finalAcceptedIds.size() != _detectedIds.total()) {
1557-
_detectedCorners.clear();
1558-
_detectedIds.clear();
1559-
15601557
// parse output
15611558
Mat(finalAcceptedIds).copyTo(_detectedIds);
1562-
1563-
_detectedCorners.create((int)finalAcceptedCorners.size(), 1, CV_32FC2);
1564-
for(unsigned int i = 0; i < finalAcceptedCorners.size(); i++) {
1565-
_detectedCorners.create(4, 1, CV_32FC2, i, true);
1566-
for(int j = 0; j < 4; j++) {
1567-
_detectedCorners.getMat(i).ptr< Point2f >()[j] =
1568-
finalAcceptedCorners[i].ptr< Point2f >()[j];
1569-
}
1570-
}
1559+
_copyVector2Output(finalAcceptedCorners, _detectedCorners);
15711560

15721561
// recalculate _rejectedCorners based on alreadyIdentified
1573-
vector< Mat > finalRejected;
1562+
vector<vector<Point2f> > finalRejected;
15741563
for(unsigned int i = 0; i < alreadyIdentified.size(); i++) {
15751564
if(!alreadyIdentified[i]) {
15761565
finalRejected.push_back(_rejectedCorners.getMat(i).clone());
15771566
}
15781567
}
1579-
1580-
_rejectedCorners.clear();
1581-
_rejectedCorners.create((int)finalRejected.size(), 1, CV_32FC2);
1582-
for(unsigned int i = 0; i < finalRejected.size(); i++) {
1583-
_rejectedCorners.create(4, 1, CV_32FC2, i, true);
1584-
for(int j = 0; j < 4; j++) {
1585-
_rejectedCorners.getMat(i).ptr< Point2f >()[j] =
1586-
finalRejected[i].ptr< Point2f >()[j];
1587-
}
1588-
}
1568+
_copyVector2Output(finalRejected, _rejectedCorners);
15891569

15901570
if(_recoveredIdxs.needed()) {
15911571
Mat(recoveredIdxs).copyTo(_recoveredIdxs);

modules/aruco/test/test_charucodetection.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -849,4 +849,35 @@ TEST(CV_ArucoTutorial, can_find_diamondmarkers)
849849
EXPECT_EQ(counterGoldCornersIds, counterRes); // check the number of ArUco markers
850850
}
851851

852+
TEST(Charuco, issue_14014)
853+
{
854+
string imgPath = cvtest::findDataFile("aruco/recover.png");
855+
Mat img = imread(imgPath);
856+
857+
Ptr<aruco::Dictionary> dict = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(cv::aruco::DICT_7X7_250));
858+
Ptr<aruco::CharucoBoard> board = aruco::CharucoBoard::create(8, 5, 0.03455f, 0.02164f, dict);
859+
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
860+
detectorParams->cornerRefinementMethod = aruco::CORNER_REFINE_SUBPIX;
861+
detectorParams->cornerRefinementMinAccuracy = 0.01;
862+
863+
vector<Mat> corners, rejectedPoints;
864+
vector<int> ids;
865+
866+
aruco::detectMarkers(img, dict, corners, ids, detectorParams, rejectedPoints);
867+
868+
ASSERT_EQ(corners.size(), 19ull);
869+
EXPECT_EQ(Size(4, 1), corners[0].size()); // check dimension of detected corners
870+
871+
ASSERT_EQ(rejectedPoints.size(), 21ull);
872+
EXPECT_EQ(Size(4, 1), rejectedPoints[0].size()); // check dimension of detected corners
873+
874+
aruco::refineDetectedMarkers(img, board, corners, ids, rejectedPoints);
875+
876+
ASSERT_EQ(corners.size(), 20ull);
877+
EXPECT_EQ(Size(4, 1), corners[0].size()); // check dimension of rejected corners after successfully refine
878+
879+
ASSERT_EQ(rejectedPoints.size(), 20ull);
880+
EXPECT_EQ(Size(4, 1), rejectedPoints[0].size()); // check dimension of rejected corners after successfully refine
881+
}
882+
852883
}} // namespace

0 commit comments

Comments
 (0)