Skip to content

Commit a10b397

Browse files
author
AleksandrPanov
committed
add writeDictionary(), add dict distance, fix readDictionary(), fix readDetectorParameters()
1 parent 56d492c commit a10b397

15 files changed

+97
-78
lines changed

modules/aruco/include/opencv2/aruco.hpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ struct CV_EXPORTS_W DetectorParameters {
151151

152152
DetectorParameters();
153153
CV_WRAP static Ptr<DetectorParameters> create();
154-
CV_WRAP static bool readDetectorParameters(const FileNode& fn, Ptr<DetectorParameters>& params);
154+
CV_WRAP bool readDetectorParameters(const FileNode& fn);
155155

156156
CV_PROP_RW int adaptiveThreshWinSizeMin;
157157
CV_PROP_RW int adaptiveThreshWinSizeMax;

modules/aruco/include/opencv2/aruco/dictionary.hpp

+20-18
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@ class CV_EXPORTS_W Dictionary {
101101
* ...
102102
* marker_34: "011111010000111011111110110101100101"
103103
*/
104-
CV_WRAP static bool readDictionary(const cv::FileNode& fn, cv::Ptr<cv::aruco::Dictionary> &dictionary);
104+
CV_WRAP bool readDictionary(const cv::FileNode& fn);
105+
106+
CV_WRAP void writeDictionary(const String& outputDictFile);
105107

106108
/**
107109
* @see getPredefinedDictionary
@@ -149,23 +151,23 @@ class CV_EXPORTS_W Dictionary {
149151
distance
150152
*/
151153
enum PREDEFINED_DICTIONARY_NAME {
152-
DICT_4X4_50 = 0,
153-
DICT_4X4_100,
154-
DICT_4X4_250,
155-
DICT_4X4_1000,
156-
DICT_5X5_50,
157-
DICT_5X5_100,
158-
DICT_5X5_250,
159-
DICT_5X5_1000,
160-
DICT_6X6_50,
161-
DICT_6X6_100,
162-
DICT_6X6_250,
163-
DICT_6X6_1000,
164-
DICT_7X7_50,
165-
DICT_7X7_100,
166-
DICT_7X7_250,
167-
DICT_7X7_1000,
168-
DICT_ARUCO_ORIGINAL,
154+
DICT_4X4_50 = 0, ///< 4x4 bits, minimum hamming distance between any two codes = 4, 50 codes
155+
DICT_4X4_100, ///< 4x4 bits, minimum hamming distance between any two codes = 3, 100 codes
156+
DICT_4X4_250, ///< 4x4 bits, minimum hamming distance between any two codes = 3, 250 codes
157+
DICT_4X4_1000, ///< 4x4 bits, minimum hamming distance between any two codes = 2, 1000 codes
158+
DICT_5X5_50, ///< 5x5 bits, minimum hamming distance between any two codes = 8, 50 codes
159+
DICT_5X5_100, ///< 5x5 bits, minimum hamming distance between any two codes = 7, 100 codes
160+
DICT_5X5_250, ///< 5x5 bits, minimum hamming distance between any two codes = 6, 250 codes
161+
DICT_5X5_1000, ///< 5x5 bits, minimum hamming distance between any two codes = 5, 1000 codes
162+
DICT_6X6_50, ///< 6x6 bits, minimum hamming distance between any two codes = 13, 50 codes
163+
DICT_6X6_100, ///< 6x6 bits, minimum hamming distance between any two codes = 12, 100 codes
164+
DICT_6X6_250, ///< 6x6 bits, minimum hamming distance between any two codes = 11, 250 codes
165+
DICT_6X6_1000, ///< 6x6 bits, minimum hamming distance between any two codes = 9, 1000 codes
166+
DICT_7X7_50, ///< 7x7 bits, minimum hamming distance between any two codes = 19, 50 codes
167+
DICT_7X7_100, ///< 7x7 bits, minimum hamming distance between any two codes = 18, 100 codes
168+
DICT_7X7_250, ///< 7x7 bits, minimum hamming distance between any two codes = 17, 250 codes
169+
DICT_7X7_1000, ///< 7x7 bits, minimum hamming distance between any two codes = 14, 1000 codes
170+
DICT_ARUCO_ORIGINAL, ///< 6x6 bits, minimum hamming distance between any two codes = 3, 1024 codes
169171
DICT_APRILTAG_16h5, ///< 4x4 bits, minimum hamming distance between any two codes = 5, 30 codes
170172
DICT_APRILTAG_25h9, ///< 5x5 bits, minimum hamming distance between any two codes = 9, 35 codes
171173
DICT_APRILTAG_36h10, ///< 6x6 bits, minimum hamming distance between any two codes = 10, 2320 codes

modules/aruco/samples/calibrate_camera.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ int main(int argc, char *argv[]) {
104104
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
105105
if(parser.has("dp")) {
106106
FileStorage fs(parser.get<string>("dp"), FileStorage::READ);
107-
bool readOk = aruco::DetectorParameters::readDetectorParameters(fs.root(), detectorParams);
107+
bool readOk = detectorParams->readDetectorParameters(fs.root());
108108
if(!readOk) {
109109
cerr << "Invalid detector parameters file" << endl;
110110
return 0;
@@ -134,14 +134,14 @@ int main(int argc, char *argv[]) {
134134
waitTime = 10;
135135
}
136136

137-
Ptr<aruco::Dictionary> dictionary;
137+
Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(0);
138138
if (parser.has("d")) {
139139
int dictionaryId = parser.get<int>("d");
140140
dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
141141
}
142142
else if (parser.has("cd")) {
143143
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
144-
bool readOk = aruco::Dictionary::readDictionary(fs.root(), dictionary);
144+
bool readOk = dictionary->aruco::Dictionary::readDictionary(fs.root());
145145
if(!readOk) {
146146
cerr << "Invalid dictionary file" << endl;
147147
return 0;

modules/aruco/samples/calibrate_camera_charuco.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ int main(int argc, char *argv[]) {
105105
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
106106
if(parser.has("dp")) {
107107
FileStorage fs(parser.get<string>("dp"), FileStorage::READ);
108-
bool readOk = aruco::DetectorParameters::readDetectorParameters(fs.root(), detectorParams);
108+
bool readOk = detectorParams->readDetectorParameters(fs.root());
109109
if(!readOk) {
110110
cerr << "Invalid detector parameters file" << endl;
111111
return 0;
@@ -135,14 +135,14 @@ int main(int argc, char *argv[]) {
135135
waitTime = 10;
136136
}
137137

138-
Ptr<aruco::Dictionary> dictionary;
138+
Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(0);
139139
if (parser.has("d")) {
140140
int dictionaryId = parser.get<int>("d");
141141
dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
142142
}
143143
else if (parser.has("cd")) {
144144
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
145-
bool readOk = aruco::Dictionary::readDictionary(fs.root(), dictionary);
145+
bool readOk = dictionary->aruco::Dictionary::readDictionary(fs.root());
146146
if(!readOk) {
147147
cerr << "Invalid dictionary file" << endl;
148148
return 0;

modules/aruco/samples/create_board.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -96,14 +96,14 @@ int main(int argc, char *argv[]) {
9696
imageSize.height =
9797
markersY * (markerLength + markerSeparation) - markerSeparation + 2 * margins;
9898

99-
Ptr<aruco::Dictionary> dictionary;
99+
Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(0);
100100
if (parser.has("d")) {
101101
int dictionaryId = parser.get<int>("d");
102102
dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
103103
}
104104
else if (parser.has("cd")) {
105105
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
106-
bool readOk = aruco::Dictionary::readDictionary(fs.root(), dictionary);
106+
bool readOk = dictionary->aruco::Dictionary::readDictionary(fs.root());
107107
if(!readOk)
108108
{
109109
std::cerr << "Invalid dictionary file" << std::endl;

modules/aruco/samples/create_board_charuco.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -93,14 +93,14 @@ int main(int argc, char *argv[]) {
9393
return 0;
9494
}
9595

96-
Ptr<aruco::Dictionary> dictionary;
96+
Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(0);;;
9797
if (parser.has("d")) {
9898
int dictionaryId = parser.get<int>("d");
9999
dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
100100
}
101101
else if (parser.has("cd")) {
102102
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
103-
bool readOk = aruco::Dictionary::readDictionary(fs.root(), dictionary);
103+
bool readOk = dictionary->aruco::Dictionary::readDictionary(fs.root());
104104
if(!readOk) {
105105
std::cerr << "Invalid dictionary file" << std::endl;
106106
return 0;

modules/aruco/samples/create_marker.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,14 @@ int main(int argc, char *argv[]) {
8484
return 0;
8585
}
8686

87-
Ptr<aruco::Dictionary> dictionary;
87+
Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(0);
8888
if (parser.has("d")) {
8989
int dictionaryId = parser.get<int>("d");
9090
dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
9191
}
9292
else if (parser.has("cd")) {
9393
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
94-
bool readOk = aruco::Dictionary::readDictionary(fs.root(), dictionary);
94+
bool readOk = dictionary->aruco::Dictionary::readDictionary(fs.root());
9595
if(!readOk) {
9696
std::cerr << "Invalid dictionary file" << std::endl;
9797
return 0;

modules/aruco/samples/detect_board.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ int main(int argc, char *argv[]) {
100100
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
101101
if(parser.has("dp")) {
102102
FileStorage fs(parser.get<string>("dp"), FileStorage::READ);
103-
bool readOk = aruco::DetectorParameters::readDetectorParameters(fs.root(), detectorParams);
103+
bool readOk = detectorParams->readDetectorParameters(fs.root());
104104
if(!readOk) {
105105
cerr << "Invalid detector parameters file" << endl;
106106
return 0;
@@ -118,14 +118,14 @@ int main(int argc, char *argv[]) {
118118
return 0;
119119
}
120120

121-
Ptr<aruco::Dictionary> dictionary;
121+
Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(0);
122122
if (parser.has("d")) {
123123
int dictionaryId = parser.get<int>("d");
124124
dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
125125
}
126126
else if (parser.has("cd")) {
127127
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
128-
bool readOk = aruco::Dictionary::readDictionary(fs.root(), dictionary);
128+
bool readOk = dictionary->aruco::Dictionary::readDictionary(fs.root());
129129
if(!readOk) {
130130
cerr << "Invalid dictionary file" << endl;
131131
return 0;

modules/aruco/samples/detect_board_charuco.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ int main(int argc, char *argv[]) {
102102
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
103103
if(parser.has("dp")) {
104104
FileStorage fs(parser.get<string>("dp"), FileStorage::READ);
105-
bool readOk = aruco::DetectorParameters::readDetectorParameters(fs.root(), detectorParams);
105+
bool readOk = detectorParams->readDetectorParameters(fs.root());
106106
if(!readOk) {
107107
cerr << "Invalid detector parameters file" << endl;
108108
return 0;
@@ -114,14 +114,14 @@ int main(int argc, char *argv[]) {
114114
return 0;
115115
}
116116

117-
Ptr<aruco::Dictionary> dictionary;
117+
Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(0);
118118
if (parser.has("d")) {
119119
int dictionaryId = parser.get<int>("d");
120120
dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
121121
}
122122
else if (parser.has("cd")) {
123123
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
124-
bool readOk = aruco::Dictionary::readDictionary(fs.root(), dictionary);
124+
bool readOk = dictionary->aruco::Dictionary::readDictionary(fs.root());
125125
if(!readOk) {
126126
cerr << "Invalid dictionary file" << endl;
127127
return 0;

modules/aruco/samples/detect_diamonds.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ int main(int argc, char *argv[]) {
9090
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
9191
if(parser.has("dp")) {
9292
FileStorage fs(parser.get<string>("dp"), FileStorage::READ);
93-
bool readOk = aruco::DetectorParameters::readDetectorParameters(fs.root(), detectorParams);
93+
bool readOk = detectorParams->readDetectorParameters(fs.root());
9494
if(!readOk) {
9595
cerr << "Invalid detector parameters file" << endl;
9696
return 0;
@@ -114,14 +114,14 @@ int main(int argc, char *argv[]) {
114114
return 0;
115115
}
116116

117-
Ptr<aruco::Dictionary> dictionary;
117+
Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(0);
118118
if (parser.has("d")) {
119119
int dictionaryId = parser.get<int>("d");
120120
dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
121121
}
122122
else if (parser.has("cd")) {
123123
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
124-
bool readOk = aruco::Dictionary::readDictionary(fs.root(), dictionary);
124+
bool readOk = dictionary->aruco::Dictionary::readDictionary(fs.root());
125125
if(!readOk) {
126126
cerr << "Invalid dictionary file" << endl;
127127
return 0;

modules/aruco/samples/detect_markers.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ int main(int argc, char *argv[]) {
8383
Ptr<aruco::DetectorParameters> detectorParams = aruco::DetectorParameters::create();
8484
if(parser.has("dp")) {
8585
FileStorage fs(parser.get<string>("dp"), FileStorage::READ);
86-
bool readOk = aruco::DetectorParameters::readDetectorParameters(fs.root(), detectorParams);
86+
bool readOk = detectorParams->readDetectorParameters(fs.root());
8787
if(!readOk) {
8888
cerr << "Invalid detector parameters file" << endl;
8989
return 0;
@@ -108,14 +108,14 @@ int main(int argc, char *argv[]) {
108108
return 0;
109109
}
110110

111-
Ptr<aruco::Dictionary> dictionary;
111+
Ptr<aruco::Dictionary> dictionary = aruco::getPredefinedDictionary(0);
112112
if (parser.has("d")) {
113113
int dictionaryId = parser.get<int>("d");
114114
dictionary = aruco::getPredefinedDictionary(aruco::PREDEFINED_DICTIONARY_NAME(dictionaryId));
115115
}
116116
else if (parser.has("cd")) {
117117
FileStorage fs(parser.get<std::string>("cd"), FileStorage::READ);
118-
bool readOk = aruco::Dictionary::readDictionary(fs.root(), dictionary);
118+
bool readOk = dictionary->aruco::Dictionary::readDictionary(fs.root());
119119
if(!readOk) {
120120
std::cerr << "Invalid dictionary file" << std::endl;
121121
return 0;

modules/aruco/src/aruco.cpp

+21-23
Original file line numberDiff line numberDiff line change
@@ -111,32 +111,31 @@ static inline bool readParameter(const FileNode& node, T& parameter)
111111
/**
112112
* @brief Read a new set of DetectorParameters from FileStorage.
113113
*/
114-
bool DetectorParameters::readDetectorParameters(const FileNode& fn, Ptr<DetectorParameters>& params)
114+
bool DetectorParameters::readDetectorParameters(const FileNode& fn)
115115
{
116116
if(fn.empty())
117117
return true;
118-
params = DetectorParameters::create();
119118
bool checkRead = false;
120-
checkRead |= readParameter(fn["adaptiveThreshWinSizeMin"], params->adaptiveThreshWinSizeMin);
121-
checkRead |= readParameter(fn["adaptiveThreshWinSizeMax"], params->adaptiveThreshWinSizeMax);
122-
checkRead |= readParameter(fn["adaptiveThreshWinSizeStep"], params->adaptiveThreshWinSizeStep);
123-
checkRead |= readParameter(fn["adaptiveThreshConstant"], params->adaptiveThreshConstant);
124-
checkRead |= readParameter(fn["minMarkerPerimeterRate"], params->minMarkerPerimeterRate);
125-
checkRead |= readParameter(fn["maxMarkerPerimeterRate"], params->maxMarkerPerimeterRate);
126-
checkRead |= readParameter(fn["polygonalApproxAccuracyRate"], params->polygonalApproxAccuracyRate);
127-
checkRead |= readParameter(fn["minCornerDistanceRate"], params->minCornerDistanceRate);
128-
checkRead |= readParameter(fn["minDistanceToBorder"], params->minDistanceToBorder);
129-
checkRead |= readParameter(fn["minMarkerDistanceRate"], params->minMarkerDistanceRate);
130-
checkRead |= readParameter(fn["cornerRefinementMethod"], params->cornerRefinementMethod);
131-
checkRead |= readParameter(fn["cornerRefinementWinSize"], params->cornerRefinementWinSize);
132-
checkRead |= readParameter(fn["cornerRefinementMaxIterations"], params->cornerRefinementMaxIterations);
133-
checkRead |= readParameter(fn["cornerRefinementMinAccuracy"], params->cornerRefinementMinAccuracy);
134-
checkRead |= readParameter(fn["markerBorderBits"], params->markerBorderBits);
135-
checkRead |= readParameter(fn["perspectiveRemovePixelPerCell"], params->perspectiveRemovePixelPerCell);
136-
checkRead |= readParameter(fn["perspectiveRemoveIgnoredMarginPerCell"], params->perspectiveRemoveIgnoredMarginPerCell);
137-
checkRead |= readParameter(fn["maxErroneousBitsInBorderRate"], params->maxErroneousBitsInBorderRate);
138-
checkRead |= readParameter(fn["minOtsuStdDev"], params->minOtsuStdDev);
139-
checkRead |= readParameter(fn["errorCorrectionRate"], params->errorCorrectionRate);
119+
checkRead |= readParameter(fn["adaptiveThreshWinSizeMin"], this->adaptiveThreshWinSizeMin);
120+
checkRead |= readParameter(fn["adaptiveThreshWinSizeMax"], this->adaptiveThreshWinSizeMax);
121+
checkRead |= readParameter(fn["adaptiveThreshWinSizeStep"], this->adaptiveThreshWinSizeStep);
122+
checkRead |= readParameter(fn["adaptiveThreshConstant"], this->adaptiveThreshConstant);
123+
checkRead |= readParameter(fn["minMarkerPerimeterRate"], this->minMarkerPerimeterRate);
124+
checkRead |= readParameter(fn["maxMarkerPerimeterRate"], this->maxMarkerPerimeterRate);
125+
checkRead |= readParameter(fn["polygonalApproxAccuracyRate"], this->polygonalApproxAccuracyRate);
126+
checkRead |= readParameter(fn["minCornerDistanceRate"], this->minCornerDistanceRate);
127+
checkRead |= readParameter(fn["minDistanceToBorder"], this->minDistanceToBorder);
128+
checkRead |= readParameter(fn["minMarkerDistanceRate"], this->minMarkerDistanceRate);
129+
checkRead |= readParameter(fn["cornerRefinementMethod"], this->cornerRefinementMethod);
130+
checkRead |= readParameter(fn["cornerRefinementWinSize"], this->cornerRefinementWinSize);
131+
checkRead |= readParameter(fn["cornerRefinementMaxIterations"], this->cornerRefinementMaxIterations);
132+
checkRead |= readParameter(fn["cornerRefinementMinAccuracy"], this->cornerRefinementMinAccuracy);
133+
checkRead |= readParameter(fn["markerBorderBits"], this->markerBorderBits);
134+
checkRead |= readParameter(fn["perspectiveRemovePixelPerCell"], this->perspectiveRemovePixelPerCell);
135+
checkRead |= readParameter(fn["perspectiveRemoveIgnoredMarginPerCell"], this->perspectiveRemoveIgnoredMarginPerCell);
136+
checkRead |= readParameter(fn["maxErroneousBitsInBorderRate"], this->maxErroneousBitsInBorderRate);
137+
checkRead |= readParameter(fn["minOtsuStdDev"], this->minOtsuStdDev);
138+
checkRead |= readParameter(fn["errorCorrectionRate"], this->errorCorrectionRate);
140139
return checkRead;
141140
}
142141

@@ -305,7 +304,6 @@ static void _filterTooCloseCandidates(const vector< vector< Point2f > > &candida
305304
// if mean square distance is too low, remove the smaller one of the two markers
306305
double minMarkerDistancePixels = double(minimumPerimeter) * minMarkerDistanceRate;
307306
if(distSq < minMarkerDistancePixels * minMarkerDistancePixels) {
308-
309307
// i and j are not related to a group
310308
if(candGroup[i]<0 && candGroup[j]<0){
311309
// mark candidates with their corresponding group number

0 commit comments

Comments
 (0)