Skip to content

Commit d72a91f

Browse files
author
AleksandrPanov
committed
fixed bad shape of markers (1x4) in several cases and added tests
1 parent b535c99 commit d72a91f

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
@@ -1486,7 +1486,7 @@ void refineDetectedMarkers(InputArray _image, const Ptr<Board> &_board,
14861486
_convertToGrey(_image, grey);
14871487

14881488
// vector of final detected marker corners and ids
1489-
vector< Mat > finalAcceptedCorners;
1489+
vector<vector<Point2f> > finalAcceptedCorners;
14901490
vector< int > finalAcceptedIds;
14911491
// fill with the current markers
14921492
finalAcceptedCorners.resize(_detectedCorners.total());
@@ -1597,38 +1597,18 @@ void refineDetectedMarkers(InputArray _image, const Ptr<Board> &_board,
15971597

15981598
// parse output
15991599
if(finalAcceptedIds.size() != _detectedIds.total()) {
1600-
_detectedCorners.clear();
1601-
_detectedIds.clear();
1602-
16031600
// parse output
16041601
Mat(finalAcceptedIds).copyTo(_detectedIds);
1605-
1606-
_detectedCorners.create((int)finalAcceptedCorners.size(), 1, CV_32FC2);
1607-
for(unsigned int i = 0; i < finalAcceptedCorners.size(); i++) {
1608-
_detectedCorners.create(4, 1, CV_32FC2, i, true);
1609-
for(int j = 0; j < 4; j++) {
1610-
_detectedCorners.getMat(i).ptr< Point2f >()[j] =
1611-
finalAcceptedCorners[i].ptr< Point2f >()[j];
1612-
}
1613-
}
1602+
_copyVector2Output(finalAcceptedCorners, _detectedCorners);
16141603

16151604
// recalculate _rejectedCorners based on alreadyIdentified
1616-
vector< Mat > finalRejected;
1605+
vector<vector<Point2f> > finalRejected;
16171606
for(unsigned int i = 0; i < alreadyIdentified.size(); i++) {
16181607
if(!alreadyIdentified[i]) {
16191608
finalRejected.push_back(_rejectedCorners.getMat(i).clone());
16201609
}
16211610
}
1622-
1623-
_rejectedCorners.clear();
1624-
_rejectedCorners.create((int)finalRejected.size(), 1, CV_32FC2);
1625-
for(unsigned int i = 0; i < finalRejected.size(); i++) {
1626-
_rejectedCorners.create(4, 1, CV_32FC2, i, true);
1627-
for(int j = 0; j < 4; j++) {
1628-
_rejectedCorners.getMat(i).ptr< Point2f >()[j] =
1629-
finalRejected[i].ptr< Point2f >()[j];
1630-
}
1631-
}
1611+
_copyVector2Output(finalRejected, _rejectedCorners);
16321612

16331613
if(_recoveredIdxs.needed()) {
16341614
Mat(recoveredIdxs).copyTo(_recoveredIdxs);

modules/aruco/test/test_charucodetection.cpp

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

796+
TEST(Charuco, issue_14014)
797+
{
798+
string imgPath = cvtest::findDataFile("aruco/recover.png");
799+
Mat img = imread(imgPath);
800+
801+
Ptr<aruco::Dictionary> dict = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(cv::aruco::DICT_7X7_250));
802+
Ptr<aruco::CharucoBoard> board = aruco::CharucoBoard::create(8, 5, 0.03455f, 0.02164f, dict);
803+
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
804+
detectorParams->cornerRefinementMethod = aruco::CORNER_REFINE_SUBPIX;
805+
detectorParams->cornerRefinementMinAccuracy = 0.01;
806+
807+
vector<Mat> corners, rejectedPoints;
808+
vector<int> ids;
809+
810+
aruco::detectMarkers(img, dict, corners, ids, detectorParams, rejectedPoints);
811+
812+
ASSERT_EQ(corners.size(), 19ull);
813+
EXPECT_EQ(Size(4, 1), corners[0].size()); // check dimension of detected corners
814+
815+
ASSERT_EQ(rejectedPoints.size(), 21ull);
816+
EXPECT_EQ(Size(4, 1), rejectedPoints[0].size()); // check dimension of detected corners
817+
818+
aruco::refineDetectedMarkers(img, board, corners, ids, rejectedPoints);
819+
820+
ASSERT_EQ(corners.size(), 20ull);
821+
EXPECT_EQ(Size(4, 1), corners[0].size()); // check dimension of rejected corners after successfully refine
822+
823+
ASSERT_EQ(rejectedPoints.size(), 20ull);
824+
EXPECT_EQ(Size(4, 1), rejectedPoints[0].size()); // check dimension of rejected corners after successfully refine
825+
}
826+
796827
}} // namespace

0 commit comments

Comments
 (0)