@@ -15,48 +15,80 @@ namespace aruco {
15
15
16
16
using namespace std ;
17
17
18
- template <typename T>
19
- static inline bool readParameter (const FileNode& node, T& parameter)
20
- {
21
- if (!node.empty ()) {
22
- node >> parameter;
23
- return true ;
24
- }
25
- return false ;
18
+ bool DetectorParameters::readWrite (const Ptr <FileNode>& readNode, const Ptr <FileStorage>& writeStorage) {
19
+ CV_Assert (!readNode.empty () || !writeStorage.empty ());
20
+ bool check = false ;
21
+
22
+ check |= readWriteParameter (" adaptiveThreshWinSizeMin" , this ->adaptiveThreshWinSizeMin , readNode, writeStorage);
23
+ check |= readWriteParameter (" adaptiveThreshWinSizeMax" , this ->adaptiveThreshWinSizeMax , readNode, writeStorage);
24
+ check |= readWriteParameter (" adaptiveThreshWinSizeStep" , this ->adaptiveThreshWinSizeStep , readNode, writeStorage);
25
+ check |= readWriteParameter (" adaptiveThreshConstant" , this ->adaptiveThreshConstant , readNode, writeStorage);
26
+ check |= readWriteParameter (" minMarkerPerimeterRate" , this ->minMarkerPerimeterRate , readNode, writeStorage);
27
+ check |= readWriteParameter (" maxMarkerPerimeterRate" , this ->maxMarkerPerimeterRate , readNode, writeStorage);
28
+ check |= readWriteParameter (" polygonalApproxAccuracyRate" , this ->polygonalApproxAccuracyRate ,
29
+ readNode, writeStorage);
30
+ check |= readWriteParameter (" minCornerDistanceRate" , this ->minCornerDistanceRate , readNode, writeStorage);
31
+ check |= readWriteParameter (" minDistanceToBorder" , this ->minDistanceToBorder , readNode, writeStorage);
32
+ check |= readWriteParameter (" minMarkerDistanceRate" , this ->minMarkerDistanceRate , readNode, writeStorage);
33
+ check |= readWriteParameter (" cornerRefinementMethod" , this ->cornerRefinementMethod , readNode, writeStorage);
34
+ check |= readWriteParameter (" cornerRefinementWinSize" , this ->cornerRefinementWinSize , readNode, writeStorage);
35
+ check |= readWriteParameter (" cornerRefinementMaxIterations" , this ->cornerRefinementMaxIterations ,
36
+ readNode, writeStorage);
37
+ check |= readWriteParameter (" cornerRefinementMinAccuracy" , this ->cornerRefinementMinAccuracy ,
38
+ readNode, writeStorage);
39
+ check |= readWriteParameter (" markerBorderBits" , this ->markerBorderBits , readNode, writeStorage);
40
+ check |= readWriteParameter (" perspectiveRemovePixelPerCell" , this ->perspectiveRemovePixelPerCell ,
41
+ readNode, writeStorage);
42
+ check |= readWriteParameter (" perspectiveRemoveIgnoredMarginPerCell" , this ->perspectiveRemoveIgnoredMarginPerCell ,
43
+ readNode, writeStorage);
44
+ check |= readWriteParameter (" maxErroneousBitsInBorderRate" , this ->maxErroneousBitsInBorderRate ,
45
+ readNode, writeStorage);
46
+ check |= readWriteParameter (" minOtsuStdDev" , this ->minOtsuStdDev , readNode, writeStorage);
47
+ check |= readWriteParameter (" errorCorrectionRate" , this ->errorCorrectionRate , readNode, writeStorage);
48
+ // new aruco 3 functionality
49
+ check |= readWriteParameter (" useAruco3Detection" , this ->useAruco3Detection , readNode, writeStorage);
50
+ check |= readWriteParameter (" minSideLengthCanonicalImg" , this ->minSideLengthCanonicalImg , readNode, writeStorage);
51
+ check |= readWriteParameter (" minMarkerLengthRatioOriginalImg" , this ->minMarkerLengthRatioOriginalImg ,
52
+ readNode, writeStorage);
53
+ return check;
54
+ }
55
+
56
+ bool DetectorParameters::readDetectorParameters (const FileNode& fn) {
57
+ if (fn.empty ())
58
+ return false ;
59
+ Ptr <FileNode> pfn = makePtr<FileNode>(fn);
60
+ return readWrite (pfn);
26
61
}
27
62
28
- bool DetectorParameters::readDetectorParameters (const FileNode& fn )
63
+ bool DetectorParameters::writeDetectorParameters (const Ptr <FileStorage>& fs )
29
64
{
65
+ if (fs.empty () && !fs->isOpened ())
66
+ return false ;
67
+ return readWrite (nullptr , fs);
68
+ }
69
+
70
+ bool RefineParameters::readWrite (const Ptr <FileNode>& readNode, const Ptr <FileStorage>& writeStorage) {
71
+ CV_Assert (!readNode.empty () || !writeStorage.empty ());
72
+ bool check = false ;
73
+
74
+ check |= readWriteParameter (" minRepDistance" , this ->minRepDistance , readNode, writeStorage);
75
+ check |= readWriteParameter (" errorCorrectionRate" , this ->errorCorrectionRate , readNode, writeStorage);
76
+ check |= readWriteParameter (" checkAllOrders" , this ->checkAllOrders , readNode, writeStorage);
77
+ return check;
78
+ }
79
+
80
+ bool RefineParameters::readRefineParameters (const FileNode &fn) {
30
81
if (fn.empty ())
31
- return true ;
32
- bool checkRead = false ;
33
- checkRead |= readParameter (fn[" adaptiveThreshWinSizeMin" ], this ->adaptiveThreshWinSizeMin );
34
- checkRead |= readParameter (fn[" adaptiveThreshWinSizeMax" ], this ->adaptiveThreshWinSizeMax );
35
- checkRead |= readParameter (fn[" adaptiveThreshWinSizeStep" ], this ->adaptiveThreshWinSizeStep );
36
- checkRead |= readParameter (fn[" adaptiveThreshConstant" ], this ->adaptiveThreshConstant );
37
- checkRead |= readParameter (fn[" minMarkerPerimeterRate" ], this ->minMarkerPerimeterRate );
38
- checkRead |= readParameter (fn[" maxMarkerPerimeterRate" ], this ->maxMarkerPerimeterRate );
39
- checkRead |= readParameter (fn[" polygonalApproxAccuracyRate" ], this ->polygonalApproxAccuracyRate );
40
- checkRead |= readParameter (fn[" minCornerDistanceRate" ], this ->minCornerDistanceRate );
41
- checkRead |= readParameter (fn[" minDistanceToBorder" ], this ->minDistanceToBorder );
42
- checkRead |= readParameter (fn[" minMarkerDistanceRate" ], this ->minMarkerDistanceRate );
43
- checkRead |= readParameter (fn[" cornerRefinementMethod" ], this ->cornerRefinementMethod );
44
- checkRead |= readParameter (fn[" cornerRefinementWinSize" ], this ->cornerRefinementWinSize );
45
- checkRead |= readParameter (fn[" cornerRefinementMaxIterations" ], this ->cornerRefinementMaxIterations );
46
- checkRead |= readParameter (fn[" cornerRefinementMinAccuracy" ], this ->cornerRefinementMinAccuracy );
47
- checkRead |= readParameter (fn[" markerBorderBits" ], this ->markerBorderBits );
48
- checkRead |= readParameter (fn[" perspectiveRemovePixelPerCell" ], this ->perspectiveRemovePixelPerCell );
49
- checkRead |= readParameter (fn[" perspectiveRemoveIgnoredMarginPerCell" ], this ->perspectiveRemoveIgnoredMarginPerCell );
50
- checkRead |= readParameter (fn[" maxErroneousBitsInBorderRate" ], this ->maxErroneousBitsInBorderRate );
51
- checkRead |= readParameter (fn[" minOtsuStdDev" ], this ->minOtsuStdDev );
52
- checkRead |= readParameter (fn[" errorCorrectionRate" ], this ->errorCorrectionRate );
53
- // new aruco 3 functionality
54
- checkRead |= readParameter (fn[" useAruco3Detection" ], this ->useAruco3Detection );
55
- checkRead |= readParameter (fn[" minSideLengthCanonicalImg" ], this ->minSideLengthCanonicalImg );
56
- checkRead |= readParameter (fn[" minMarkerLengthRatioOriginalImg" ], this ->minMarkerLengthRatioOriginalImg );
57
- return checkRead;
82
+ return false ;
83
+ Ptr <FileNode> pfn = makePtr<FileNode>(fn);
84
+ return readWrite (pfn);
58
85
}
59
86
87
+ bool RefineParameters::writeRefineParameters (const Ptr <FileStorage> &fs) {
88
+ if (fs.empty ())
89
+ return false ;
90
+ return readWrite (nullptr , fs);
91
+ }
60
92
61
93
/* *
62
94
* @brief Threshold input image using adaptive thresholding
@@ -163,7 +195,7 @@ static void _reorderCandidatesCorners(vector< vector< Point2f > > &candidates) {
163
195
/* *
164
196
* @brief to make sure that the corner's order of both candidates (default/white) is the same
165
197
*/
166
- static vector< Point2f > alignContourOrder ( Point2f corner, vector< Point2f > candidate){
198
+ static vector<Point2f> alignContourOrder (Point2f corner, vector< Point2f > candidate) {
167
199
uint8_t r=0 ;
168
200
double min = cv::norm ( Vec2f ( corner - candidate[0 ] ), NORM_L2SQR);
169
201
for (uint8_t pos=1 ; pos < 4 ; pos++) {
@@ -478,8 +510,7 @@ static int _getBorderErrors(const Mat &bits, int markerSize, int borderSize) {
478
510
static uint8_t _identifyOneCandidate (const Ptr <Dictionary>& dictionary, InputArray _image,
479
511
const vector<Point2f>& _corners, int & idx,
480
512
const Ptr <DetectorParameters>& params, int & rotation,
481
- const float scale = 1 .f)
482
- {
513
+ const float scale = 1 .f) {
483
514
CV_DbgAssert (_corners.size () == 4 );
484
515
CV_DbgAssert (_image.getMat ().total () != 0 );
485
516
CV_DbgAssert (params->markerBorderBits > 0 );
@@ -1017,7 +1048,6 @@ void ArucoDetector::refineDetectedMarkers(InputArray _image, const Ptr<Board> &_
1017
1048
InputOutputArrayOfArrays _detectedCorners, InputOutputArray _detectedIds,
1018
1049
InputOutputArrayOfArrays _rejectedCorners, InputArray _cameraMatrix,
1019
1050
InputArray _distCoeffs, OutputArray _recoveredIdxs) {
1020
-
1021
1051
CV_Assert (refineParams->minRepDistance > 0 );
1022
1052
1023
1053
if (_detectedIds.total () == 0 || _rejectedCorners.total () == 0 ) return ;
@@ -1177,12 +1207,9 @@ void ArucoDetector::refineDetectedMarkers(InputArray _image, const Ptr<Board> &_
1177
1207
}
1178
1208
}
1179
1209
1180
- /* *
1181
- */
1210
+
1182
1211
void drawDetectedMarkers (InputOutputArray _image, InputArrayOfArrays _corners,
1183
1212
InputArray _ids, Scalar borderColor) {
1184
-
1185
-
1186
1213
CV_Assert (_image.getMat ().total () != 0 &&
1187
1214
(_image.getMat ().channels () == 1 || _image.getMat ().channels () == 3 ));
1188
1215
CV_Assert ((_corners.total () == _ids.total ()) || _ids.total () == 0 );
0 commit comments