22 #include <opencv2/core/core.hpp> 23 #include <opencv2/imgproc/imgproc.hpp> 24 #include <opencv2/features2d/features2d.hpp> 25 #include <opencv2/calib3d/calib3d.hpp> 49 MarkerDetector::MarkerDetector()
60 MarkerDetector::MarkerDetector(
int dict_type,
float error_correction_rate)
63 setDictionary(dict_type, error_correction_rate);
72 MarkerDetector::MarkerDetector(std::string dict_type,
float error_correction_rate)
75 setDictionary(dict_type, error_correction_rate);
85 MarkerDetector::~MarkerDetector()
90 void MarkerDetector::setParameters(
const Params ¶ms)
92 _impl->setParameters(params);
101 void MarkerDetector::setDetectionMode(
DetectionMode dm,
float minMarkerSize)
103 _impl->_params.setDetectionMode(dm, minMarkerSize);
108 return _impl->_params.detectMode;
120 std::vector<aruco::Marker> MarkerDetector::detect(
const cv::Mat &input)
122 return _impl->detect(input);
125 std::vector<aruco::Marker> MarkerDetector::detect(
const cv::Mat &input,
127 float markerSizeMeters,
128 bool setYPerperdicular,
bool correctFisheye)
130 return _impl->detect(input, camParams, markerSizeMeters, setYPerperdicular);
139 void MarkerDetector::detect(
const cv::Mat &input, std::vector<Marker> &detectedMarkers,
141 bool setYPerpendicular,
bool correctFisheye)
143 _impl->detect(input, detectedMarkers, camParams, markerSizeMeters, setYPerpendicular);
150 return _impl->getParameters();
156 return _impl->getParameters();
161 std::vector<MarkerCandidate> MarkerDetector::getCandidates()
const 163 return _impl->getCandidates();
166 std::vector<cv::Mat> MarkerDetector::getImagePyramid()
168 return _impl->getImagePyramid();
170 cv::Ptr<MarkerLabeler> MarkerDetector::getMarkerLabeler()
172 return _impl->getMarkerLabeler();
174 void MarkerDetector::setMarkerLabeler(cv::Ptr<MarkerLabeler> detector)
176 _impl->setMarkerLabeler(detector);
179 void MarkerDetector::setDictionary(
int dict_type,
float error_correction_rate)
181 _impl->setDictionary(dict_type, error_correction_rate);
185 void MarkerDetector::setDictionary(
string dict_type,
float error_correction_rate)
187 _impl->setDictionary(dict_type, error_correction_rate);
189 cv::Mat MarkerDetector::getThresholdedImage(uint32_t idx)
191 return _impl->getThresholdedImage(idx);
194 void MarkerDetector::Params::save(cv::FileStorage &fs)
const 196 fs <<
"aruco-dictionary" << dictionary;
197 fs <<
"aruco-detectMode" << toString(detectMode);
198 fs <<
"aruco-cornerRefinementM" << toString(cornerRefinementM);
199 fs <<
"aruco-thresMethod" << toString(thresMethod);
200 fs <<
"aruco-maxThreads" << maxThreads;
201 fs <<
"aruco-borderDistThres" << borderDistThres;
202 fs <<
"aruco-lowResMarkerSize" << lowResMarkerSize;
203 fs <<
"aruco-minSize" << minSize;
204 fs <<
"aruco-minSize_pix" << minSize_pix;
205 fs <<
"aruco-enclosedMarker" << enclosedMarker;
206 fs <<
"aruco-NAttemptsAutoThresFix" << NAttemptsAutoThresFix;
207 fs <<
"aruco-AdaptiveThresWindowSize" << AdaptiveThresWindowSize;
208 fs <<
"aruco-ThresHold" << ThresHold;
209 fs <<
"aruco-AdaptiveThresWindowSize_range" << AdaptiveThresWindowSize_range;
210 fs <<
"aruco-markerWarpPixSize" << markerWarpPixSize;
211 fs <<
"aruco-autoSize" << autoSize;
212 fs <<
"aruco-ts" << ts;
213 fs <<
"aruco-pyrfactor" << pyrfactor;
214 fs <<
"aruco-error_correction_rate" << error_correction_rate;
215 fs <<
"aruco-trackingMinDetections" << trackingMinDetections;
216 fs <<
"aruco-closingSize" << closingSize;
219 void MarkerDetector::Params::load(cv::FileStorage &fs)
221 attemtpRead(
"aruco-maxThreads", maxThreads, fs);
222 attemtpRead(
"aruco-borderDistThres", borderDistThres, fs);
223 attemtpRead(
"aruco-lowResMarkerSize", lowResMarkerSize, fs);
224 attemtpRead(
"aruco-minSize", minSize, fs);
225 attemtpRead(
"aruco-minSize_pix", minSize_pix, fs);
226 attemtpRead(
"aruco-enclosedMarker", enclosedMarker, fs);
227 attemtpRead(
"aruco-NAttemptsAutoThresFix", NAttemptsAutoThresFix, fs);
228 attemtpRead(
"aruco-AdaptiveThresWindowSize", AdaptiveThresWindowSize, fs);
229 attemtpRead(
"aruco-ThresHold", ThresHold, fs);
230 attemtpRead(
"aruco-AdaptiveThresWindowSize_range", AdaptiveThresWindowSize_range, fs);
231 attemtpRead(
"aruco-markerWarpPixSize", markerWarpPixSize, fs);
232 attemtpRead(
"aruco-autoSize", autoSize, fs);
233 attemtpRead(
"aruco-ts", ts, fs);
234 attemtpRead(
"aruco-pyrfactor", pyrfactor, fs);
235 attemtpRead(
"aruco-error_correction_rate", error_correction_rate, fs);
236 attemtpRead(
"aruco-dictionary", dictionary, fs);
237 attemtpRead(
"aruco-trackingMinDetections", trackingMinDetections, fs);
238 attemtpRead(
"aruco-closingSize", closingSize, fs);
242 if (fs[
"aruco-detectMode"].type() != cv::FileNode::NONE)
245 fs[
"aruco-detectMode"] >> aux;
246 detectMode = getDetectionModeFromString(aux);
248 if (fs[
"aruco-thresMethod"].type() != cv::FileNode::NONE)
251 fs[
"aruco-thresMethod"] >> aux;
252 thresMethod = getCornerThresMethodFromString(aux);
254 if (fs[
"aruco-cornerRefinementM"].type() != cv::FileNode::NONE)
257 fs[
"aruco-cornerRefinementM"] >> aux;
258 cornerRefinementM = getCornerRefinementMethodFromString(aux);
263 void MarkerDetector::Params::toStream(std::ostream &str)
const 265 str.write((
char *)&detectMode,
sizeof(detectMode));
266 str.write((
char *)&maxThreads,
sizeof(maxThreads));
267 str.write((
char *)&borderDistThres,
sizeof(borderDistThres));
268 str.write((
char *)&lowResMarkerSize,
sizeof(lowResMarkerSize));
269 str.write((
char *)&minSize,
sizeof(minSize));
270 str.write((
char *)&minSize_pix,
sizeof(minSize_pix));
271 str.write((
char *)&enclosedMarker,
sizeof(enclosedMarker));
272 str.write((
char *)&thresMethod,
sizeof(thresMethod));
273 str.write((
char *)&NAttemptsAutoThresFix,
sizeof(NAttemptsAutoThresFix));
274 str.write((
char *)&AdaptiveThresWindowSize,
sizeof(AdaptiveThresWindowSize));
275 str.write((
char *)&ThresHold,
sizeof(ThresHold));
276 str.write((
char *)&AdaptiveThresWindowSize_range,
sizeof(AdaptiveThresWindowSize_range));
277 str.write((
char *)&markerWarpPixSize,
sizeof(markerWarpPixSize));
278 str.write((
char *)&cornerRefinementM,
sizeof(cornerRefinementM));
279 str.write((
char *)&autoSize,
sizeof(autoSize));
280 str.write((
char *)&ts,
sizeof(pyrfactor));
281 str.write((
char *)&error_correction_rate,
sizeof(error_correction_rate));
282 str.write((
char *)&trackingMinDetections,
sizeof(trackingMinDetections));
283 str.write((
char *)&closingSize,
sizeof(closingSize));
286 _toStream(dictionary, str);
288 void MarkerDetector::Params::fromStream(std::istream &str)
290 str.read((
char *)&detectMode,
sizeof(detectMode));
291 str.read((
char *)&maxThreads,
sizeof(maxThreads));
292 str.read((
char *)&borderDistThres,
sizeof(borderDistThres));
293 str.read((
char *)&lowResMarkerSize,
sizeof(lowResMarkerSize));
294 str.read((
char *)&minSize,
sizeof(minSize));
295 str.read((
char *)&minSize_pix,
sizeof(minSize_pix));
296 str.read((
char *)&enclosedMarker,
sizeof(enclosedMarker));
297 str.read((
char *)&thresMethod,
sizeof(thresMethod));
298 str.read((
char *)&NAttemptsAutoThresFix,
sizeof(NAttemptsAutoThresFix));
299 str.read((
char *)&AdaptiveThresWindowSize,
sizeof(AdaptiveThresWindowSize));
300 str.read((
char *)&ThresHold,
sizeof(ThresHold));
301 str.read((
char *)&AdaptiveThresWindowSize_range,
sizeof(AdaptiveThresWindowSize_range));
302 str.read((
char *)&markerWarpPixSize,
sizeof(markerWarpPixSize));
303 str.read((
char *)&cornerRefinementM,
sizeof(cornerRefinementM));
304 str.read((
char *)&autoSize,
sizeof(autoSize));
305 str.read((
char *)&ts,
sizeof(pyrfactor));
306 str.read((
char *)&error_correction_rate,
sizeof(error_correction_rate));
307 str.read((
char *)&trackingMinDetections,
sizeof(trackingMinDetections));
308 str.read((
char *)&closingSize,
sizeof(closingSize));
309 _fromStream(dictionary, str);
313 void MarkerDetector::saveParamsToFile(
const std::string &path)
const 315 _impl->saveParamsToFile(path);
320 void MarkerDetector::loadParamsFromFile(
const std::string &path)
322 _impl->loadParamsFromFile(path);
325 void MarkerDetector::toStream(std::ostream &str)
const 327 _impl->toStream(str);
330 void MarkerDetector::fromStream(std::istream &str)
332 _impl->fromStream(str);
344 return "DM_VIDEO_FAST";
349 DetectionMode MarkerDetector::Params::getDetectionModeFromString(
const std::string &str)
351 if (str ==
"DM_FAST")
353 if (str ==
"DM_NORMAL")
355 if (str ==
"DM_VIDEO_FAST")
365 return "CORNER_LINES";
367 return "CORNER_SUBPIX";
369 return "CORNER_NONE";
371 return "CORNER_SUBPIX";
375 if (str ==
"CORNER_LINES")
377 if (str ==
"CORNER_SUBPIX")
379 if (str ==
"CORNER_NONE")
388 return "THRES_ADAPTIVE";
389 case THRES_AUTO_FIXED:
390 return "THRES_AUTO_FIXED";
392 return "THRES_ADAPTIVE";
396 if (str ==
"THRES_ADAPTIVE")
397 return THRES_ADAPTIVE;
398 if (str ==
"THRES_AUTO_FIXED")
399 return THRES_AUTO_FIXED;
400 return THRES_ADAPTIVE;
403 int thresHold,
int wsize,
int wsize_range)
405 AdaptiveThresWindowSize = wsize;
406 thresMethod = method;
409 if (method == MarkerDetector::THRES_AUTO_FIXED)
415 ThresHold = thresHold;
416 AdaptiveThresWindowSize_range = wsize_range;
418 void MarkerDetector::Params::setDetectionMode(
DetectionMode dm,
float minMarkerSize)
421 minSize = minMarkerSize;
424 setAutoSizeSpeedUp(
false);
425 setThresholdMethod(THRES_ADAPTIVE);
427 else if (detectMode ==
DM_FAST)
429 setAutoSizeSpeedUp(
false);
430 setThresholdMethod(THRES_AUTO_FIXED);
434 setThresholdMethod(THRES_AUTO_FIXED);
435 setAutoSizeSpeedUp(
true, 0.3);
440 cornerRefinementM = method;
444 void MarkerDetector::Params::_toStream(
const std::string &strg, std::ostream &str)
446 uint32_t s = strg.size();
447 str.write((
char *)&s,
sizeof(s));
448 str.write(strg.c_str(), strg.size());
450 void MarkerDetector::Params::_fromStream(std::string &strg, std::istream &str)
453 str.read((
char *)&s,
sizeof(s));
455 str.read(&strg[0], strg.size());
458 void MarkerDetector::cornerUpsample(std::vector<std::vector<cv::Point2f> > &corners,
459 cv::Size lowResImageSize)
461 _impl->cornerUpsample(corners, lowResImageSize);
Parameters of the camera.
Main class for marker detection.
DetectionMode
The DetectionMode enum defines the different possibilities for detection. Specifies the detection mod...