mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-16 05:17:39 +08:00
Merge pull request #3105 from AleksandrPanov:fix_refineDetectedMarkers_shape
This commit is contained in:
@@ -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
|
||||
|
Reference in New Issue
Block a user