Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitfd4af21

Browse files
author
Alex
committed
add dynamic window in aruco cornerRefinement
1 parent4e60392 commitfd4af21

File tree

2 files changed

+47
-9
lines changed

2 files changed

+47
-9
lines changed

‎modules/objdetect/include/opencv2/objdetect/aruco_detector.hpp‎

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ struct CV_EXPORTS_W_SIMPLE DetectorParameters {
3636
minMarkerDistanceRate =0.05;
3737
cornerRefinementMethod = (int)CORNER_REFINE_NONE;
3838
cornerRefinementWinSize =5;
39+
relativeCornerRefinmentWinSize =0.3f;
3940
cornerRefinementMaxIterations =30;
4041
cornerRefinementMinAccuracy =0.1;
4142
markerBorderBits =1;
@@ -108,9 +109,27 @@ struct CV_EXPORTS_W_SIMPLE DetectorParameters {
108109
/** @brief default value CORNER_REFINE_NONE*/
109110
CV_PROP_RWint cornerRefinementMethod;
110111

111-
/// window size for the corner refinement process (in pixels) (default 5).
112+
/** @brief maximum window size for the corner refinement process (in pixels) (default 5).
113+
*
114+
* The window size may decrease if the ArUco marker is too small, check relativeCornerRefinmentWinSize.
115+
* The final window size is calculated as:
116+
* min(cornerRefinementWinSize, averageArucoModuleSize*relativeCornerRefinmentWinSize),
117+
* where averageArucoModuleSize is average module size of ArUco marker in pixels.
118+
* (ArUco marker is composed of black and white modules)
119+
*/
112120
CV_PROP_RWint cornerRefinementWinSize;
113121

122+
/** @brief Dynamic window size for corner refinement relative to Aruco module size (default 0.3).
123+
*
124+
* The final window size is calculated as:
125+
* min(cornerRefinementWinSize, averageArucoModuleSize*relativeCornerRefinmentWinSize),
126+
* where averageArucoModuleSize is average module size of ArUco marker in pixels.
127+
* (ArUco marker is composed of black and white modules)
128+
* In the case of markers located far from each other, it may be useful to increase the value of the parameter to 0.4-0.5.
129+
* In the case of markers located close to each other, it may be useful to decrease the parameter value to 0.1-0.2.
130+
*/
131+
CV_PROP_RWfloat relativeCornerRefinmentWinSize;
132+
114133
/// maximum number of iterations for stop criteria of the corner refinement process (default 30).
115134
CV_PROP_RWint cornerRefinementMaxIterations;
116135

‎modules/objdetect/src/aruco/aruco_detector.cpp‎

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ static inline bool readWrite(DetectorParameters &params, const FileNode* readNod
3535
check |=readWriteParameter("minMarkerDistanceRate", params.minMarkerDistanceRate, readNode, writeStorage);
3636
check |=readWriteParameter("cornerRefinementMethod", params.cornerRefinementMethod, readNode, writeStorage);
3737
check |=readWriteParameter("cornerRefinementWinSize", params.cornerRefinementWinSize, readNode, writeStorage);
38+
check |=readWriteParameter("relativeCornerRefinmentWinSize", params.relativeCornerRefinmentWinSize, readNode,
39+
writeStorage);
3840
check |=readWriteParameter("cornerRefinementMaxIterations", params.cornerRefinementMaxIterations,
3941
readNode, writeStorage);
4042
check |=readWriteParameter("cornerRefinementMinAccuracy", params.cornerRefinementMinAccuracy,
@@ -847,6 +849,16 @@ struct ArucoDetector::ArucoDetectorImpl {
847849
const RefineParameters& _refineParams): dictionary(_dictionary),
848850
detectorParams(_detectorParams), refineParams(_refineParams) {}
849851

852+
floatgetAverageArucoPinSize(vector<Point2f> markerCorners) {
853+
float averageArucoModuleSize =0.f;
854+
int numPins = dictionary.markerSize + detectorParams.markerBorderBits *2;
855+
for (size_t i =0ull; i < markerCorners.size(); i++) {
856+
averageArucoModuleSize +=sqrt(normL2Sqr<float>(Point2f(markerCorners[i] - markerCorners[(i+1ull)%markerCorners.size()])));
857+
}
858+
averageArucoModuleSize /= ((float)markerCorners.size()*numPins);
859+
return averageArucoModuleSize;
860+
}
861+
850862
};
851863

852864
ArucoDetector::ArucoDetector(const Dictionary &_dictionary,
@@ -951,13 +963,15 @@ void ArucoDetector::detectMarkers(InputArray _image, OutputArrayOfArrays _corner
951963
constfloat scale_init = (float) grey_pyramid[closest_pyr_image_idx].cols / grey.cols;
952964
findCornerInPyrImage(scale_init, closest_pyr_image_idx, grey_pyramid,Mat(candidates[i]), detectorParams);
953965
}
954-
else
955-
cornerSubPix(grey,Mat(candidates[i]),
956-
Size(detectorParams.cornerRefinementWinSize, detectorParams.cornerRefinementWinSize),
957-
Size(-1, -1),
958-
TermCriteria(TermCriteria::MAX_ITER | TermCriteria::EPS,
959-
detectorParams.cornerRefinementMaxIterations,
960-
detectorParams.cornerRefinementMinAccuracy));
966+
else {
967+
int cornerRefinementWinSize =std::max(1,cvRound(detectorParams.relativeCornerRefinmentWinSize*
968+
arucoDetectorImpl->getAverageArucoPinSize(candidates[i])));
969+
cornerRefinementWinSize =min(cornerRefinementWinSize, detectorParams.cornerRefinementWinSize);
970+
cornerSubPix(grey,Mat(candidates[i]),Size(cornerRefinementWinSize, cornerRefinementWinSize),Size(-1, -1),
971+
TermCriteria(TermCriteria::MAX_ITER | TermCriteria::EPS,
972+
detectorParams.cornerRefinementMaxIterations,
973+
detectorParams.cornerRefinementMinAccuracy));
974+
}
961975
}
962976
});
963977
}
@@ -1223,8 +1237,13 @@ void ArucoDetector::refineDetectedMarkers(InputArray _image, const Board& _board
12231237
CV_Assert(detectorParams.cornerRefinementWinSize >0 &&
12241238
detectorParams.cornerRefinementMaxIterations >0 &&
12251239
detectorParams.cornerRefinementMinAccuracy >0);
1240+
1241+
std::vector<Point2f>marker(closestRotatedMarker.begin<Point2f>(), closestRotatedMarker.end<Point2f>());
1242+
int cornerRefinementWinSize =std::max(1,cvRound(detectorParams.relativeCornerRefinmentWinSize*
1243+
arucoDetectorImpl->getAverageArucoPinSize(marker)));
1244+
cornerRefinementWinSize =min(cornerRefinementWinSize, detectorParams.cornerRefinementWinSize);
12261245
cornerSubPix(grey, closestRotatedMarker,
1227-
Size(detectorParams.cornerRefinementWinSize,detectorParams.cornerRefinementWinSize),
1246+
Size(cornerRefinementWinSize, cornerRefinementWinSize),
12281247
Size(-1, -1),TermCriteria(TermCriteria::MAX_ITER | TermCriteria::EPS,
12291248
detectorParams.cornerRefinementMaxIterations,
12301249
detectorParams.cornerRefinementMinAccuracy));

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp