mirror of
https://github.com/opencv/opencv_contrib.git
synced 2025-10-16 13:57:05 +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);
|
_convertToGrey(_image, grey);
|
||||||
|
|
||||||
// vector of final detected marker corners and ids
|
// vector of final detected marker corners and ids
|
||||||
vector< Mat > finalAcceptedCorners;
|
vector<vector<Point2f> > finalAcceptedCorners;
|
||||||
vector< int > finalAcceptedIds;
|
vector< int > finalAcceptedIds;
|
||||||
// fill with the current markers
|
// fill with the current markers
|
||||||
finalAcceptedCorners.resize(_detectedCorners.total());
|
finalAcceptedCorners.resize(_detectedCorners.total());
|
||||||
@@ -1597,38 +1597,18 @@ void refineDetectedMarkers(InputArray _image, const Ptr<Board> &_board,
|
|||||||
|
|
||||||
// parse output
|
// parse output
|
||||||
if(finalAcceptedIds.size() != _detectedIds.total()) {
|
if(finalAcceptedIds.size() != _detectedIds.total()) {
|
||||||
_detectedCorners.clear();
|
|
||||||
_detectedIds.clear();
|
|
||||||
|
|
||||||
// parse output
|
// parse output
|
||||||
Mat(finalAcceptedIds).copyTo(_detectedIds);
|
Mat(finalAcceptedIds).copyTo(_detectedIds);
|
||||||
|
_copyVector2Output(finalAcceptedCorners, _detectedCorners);
|
||||||
_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];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// recalculate _rejectedCorners based on alreadyIdentified
|
// recalculate _rejectedCorners based on alreadyIdentified
|
||||||
vector< Mat > finalRejected;
|
vector<vector<Point2f> > finalRejected;
|
||||||
for(unsigned int i = 0; i < alreadyIdentified.size(); i++) {
|
for(unsigned int i = 0; i < alreadyIdentified.size(); i++) {
|
||||||
if(!alreadyIdentified[i]) {
|
if(!alreadyIdentified[i]) {
|
||||||
finalRejected.push_back(_rejectedCorners.getMat(i).clone());
|
finalRejected.push_back(_rejectedCorners.getMat(i).clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_copyVector2Output(finalRejected, _rejectedCorners);
|
||||||
_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];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(_recoveredIdxs.needed()) {
|
if(_recoveredIdxs.needed()) {
|
||||||
Mat(recoveredIdxs).copyTo(_recoveredIdxs);
|
Mat(recoveredIdxs).copyTo(_recoveredIdxs);
|
||||||
|
@@ -793,4 +793,35 @@ TEST(CV_ArucoTutorial, can_find_diamondmarkers)
|
|||||||
EXPECT_EQ(counterGoldCornersIds, counterRes); // check the number of ArUco markers
|
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
|
}} // namespace
|
||||||
|
Reference in New Issue
Block a user