fixed bad shape of markers (1x4) in several cases and added tests

pull/3105/head
AleksandrPanov 3 years ago
parent b535c9904e
commit d72a91f006
  1. 28
      modules/aruco/src/aruco.cpp
  2. 31
      modules/aruco/test/test_charucodetection.cpp

@ -1486,7 +1486,7 @@ void refineDetectedMarkers(InputArray _image, const Ptr<Board> &_board,
_convertToGrey(_image, grey);
// vector of final detected marker corners and ids
vector< Mat > finalAcceptedCorners;
vector<vector<Point2f> > finalAcceptedCorners;
vector< int > finalAcceptedIds;
// fill with the current markers
finalAcceptedCorners.resize(_detectedCorners.total());
@ -1597,38 +1597,18 @@ void refineDetectedMarkers(InputArray _image, const Ptr<Board> &_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<vector<Point2f> > 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);

@ -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<aruco::Dictionary> dict = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(cv::aruco::DICT_7X7_250));
Ptr<aruco::CharucoBoard> board = aruco::CharucoBoard::create(8, 5, 0.03455f, 0.02164f, dict);
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
detectorParams->cornerRefinementMethod = aruco::CORNER_REFINE_SUBPIX;
detectorParams->cornerRefinementMinAccuracy = 0.01;
vector<Mat> corners, rejectedPoints;
vector<int> 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

Loading…
Cancel
Save