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, correctFisheye);
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, correctFisheye);
150 return _impl->getParameters();
156 return _impl->getParameters();
159 std::vector<MarkerCandidate> MarkerDetector::getCandidates()
const
161 return _impl->getCandidates();
164 std::vector<cv::Mat> MarkerDetector::getImagePyramid()
166 return _impl->getImagePyramid();
168 cv::Ptr<MarkerLabeler> MarkerDetector::getMarkerLabeler()
170 return _impl->getMarkerLabeler();
172 void MarkerDetector::setMarkerLabeler(cv::Ptr<MarkerLabeler> detector)
174 _impl->setMarkerLabeler(detector);
177 void MarkerDetector::setDictionary(
int dict_type,
float error_correction_rate)
179 _impl->setDictionary(dict_type, error_correction_rate);
183 void MarkerDetector::setDictionary(
string dict_type,
float error_correction_rate)
185 _impl->setDictionary(dict_type, error_correction_rate);
187 cv::Mat MarkerDetector::getThresholdedImage(uint32_t idx)
189 return _impl->getThresholdedImage(idx);
192 void MarkerDetector::Params::save(cv::FileStorage &fs)
const
194 fs <<
"aruco-dictionary" << dictionary;
195 fs <<
"aruco-detectMode" << toString(detectMode);
196 fs <<
"aruco-cornerRefinementM" << toString(cornerRefinementM);
197 fs <<
"aruco-thresMethod" << toString(thresMethod);
198 fs <<
"aruco-maxThreads" << maxThreads;
199 fs <<
"aruco-borderDistThres" << borderDistThres;
200 fs <<
"aruco-lowResMarkerSize" << lowResMarkerSize;
201 fs <<
"aruco-minSize" << minSize;
202 fs <<
"aruco-minSize_pix" << minSize_pix;
203 fs <<
"aruco-enclosedMarker" << enclosedMarker;
204 fs <<
"aruco-NAttemptsAutoThresFix" << NAttemptsAutoThresFix;
205 fs <<
"aruco-AdaptiveThresWindowSize" << AdaptiveThresWindowSize;
206 fs <<
"aruco-ThresHold" << ThresHold;
207 fs <<
"aruco-AdaptiveThresWindowSize_range" << AdaptiveThresWindowSize_range;
208 fs <<
"aruco-markerWarpPixSize" << markerWarpPixSize;
209 fs <<
"aruco-autoSize" << autoSize;
210 fs <<
"aruco-ts" << ts;
211 fs <<
"aruco-pyrfactor" << pyrfactor;
212 fs <<
"aruco-error_correction_rate" << error_correction_rate;
213 fs <<
"aruco-trackingMinDetections" << trackingMinDetections;
214 fs <<
"aruco-closingSize" << closingSize;
217 void MarkerDetector::Params::load(cv::FileStorage &fs)
219 attemtpRead(
"aruco-maxThreads", maxThreads, fs);
220 attemtpRead(
"aruco-borderDistThres", borderDistThres, fs);
221 attemtpRead(
"aruco-lowResMarkerSize", lowResMarkerSize, fs);
222 attemtpRead(
"aruco-minSize", minSize, fs);
223 attemtpRead(
"aruco-minSize_pix", minSize_pix, fs);
224 attemtpRead(
"aruco-enclosedMarker", enclosedMarker, fs);
225 attemtpRead(
"aruco-NAttemptsAutoThresFix", NAttemptsAutoThresFix, fs);
226 attemtpRead(
"aruco-AdaptiveThresWindowSize", AdaptiveThresWindowSize, fs);
227 attemtpRead(
"aruco-ThresHold", ThresHold, fs);
228 attemtpRead(
"aruco-AdaptiveThresWindowSize_range", AdaptiveThresWindowSize_range, fs);
229 attemtpRead(
"aruco-markerWarpPixSize", markerWarpPixSize, fs);
230 attemtpRead(
"aruco-autoSize", autoSize, fs);
231 attemtpRead(
"aruco-ts", ts, fs);
232 attemtpRead(
"aruco-pyrfactor", pyrfactor, fs);
233 attemtpRead(
"aruco-error_correction_rate", error_correction_rate, fs);
234 attemtpRead(
"aruco-dictionary", dictionary, fs);
235 attemtpRead(
"aruco-trackingMinDetections", trackingMinDetections, fs);
236 attemtpRead(
"aruco-closingSize", closingSize, fs);
240 if (fs[
"aruco-detectMode"].type() != cv::FileNode::NONE)
243 fs[
"aruco-detectMode"] >> aux;
244 detectMode = getDetectionModeFromString(aux);
246 if (fs[
"aruco-thresMethod"].type() != cv::FileNode::NONE)
249 fs[
"aruco-thresMethod"] >> aux;
250 thresMethod = getCornerThresMethodFromString(aux);
252 if (fs[
"aruco-cornerRefinementM"].type() != cv::FileNode::NONE)
255 fs[
"aruco-cornerRefinementM"] >> aux;
256 cornerRefinementM = getCornerRefinementMethodFromString(aux);
261 void MarkerDetector::Params::toStream(std::ostream &str)
const
263 str.write((
char *)&detectMode,
sizeof(detectMode));
264 str.write((
char *)&maxThreads,
sizeof(maxThreads));
265 str.write((
char *)&borderDistThres,
sizeof(borderDistThres));
266 str.write((
char *)&lowResMarkerSize,
sizeof(lowResMarkerSize));
267 str.write((
char *)&minSize,
sizeof(minSize));
268 str.write((
char *)&minSize_pix,
sizeof(minSize_pix));
269 str.write((
char *)&enclosedMarker,
sizeof(enclosedMarker));
270 str.write((
char *)&thresMethod,
sizeof(thresMethod));
271 str.write((
char *)&NAttemptsAutoThresFix,
sizeof(NAttemptsAutoThresFix));
272 str.write((
char *)&AdaptiveThresWindowSize,
sizeof(AdaptiveThresWindowSize));
273 str.write((
char *)&ThresHold,
sizeof(ThresHold));
274 str.write((
char *)&AdaptiveThresWindowSize_range,
sizeof(AdaptiveThresWindowSize_range));
275 str.write((
char *)&markerWarpPixSize,
sizeof(markerWarpPixSize));
276 str.write((
char *)&cornerRefinementM,
sizeof(cornerRefinementM));
277 str.write((
char *)&autoSize,
sizeof(autoSize));
278 str.write((
char *)&ts,
sizeof(pyrfactor));
279 str.write((
char *)&error_correction_rate,
sizeof(error_correction_rate));
280 str.write((
char *)&trackingMinDetections,
sizeof(trackingMinDetections));
281 str.write((
char *)&closingSize,
sizeof(closingSize));
284 _toStream(dictionary, str);
286 void MarkerDetector::Params::fromStream(std::istream &str)
288 str.read((
char *)&detectMode,
sizeof(detectMode));
289 str.read((
char *)&maxThreads,
sizeof(maxThreads));
290 str.read((
char *)&borderDistThres,
sizeof(borderDistThres));
291 str.read((
char *)&lowResMarkerSize,
sizeof(lowResMarkerSize));
292 str.read((
char *)&minSize,
sizeof(minSize));
293 str.read((
char *)&minSize_pix,
sizeof(minSize_pix));
294 str.read((
char *)&enclosedMarker,
sizeof(enclosedMarker));
295 str.read((
char *)&thresMethod,
sizeof(thresMethod));
296 str.read((
char *)&NAttemptsAutoThresFix,
sizeof(NAttemptsAutoThresFix));
297 str.read((
char *)&AdaptiveThresWindowSize,
sizeof(AdaptiveThresWindowSize));
298 str.read((
char *)&ThresHold,
sizeof(ThresHold));
299 str.read((
char *)&AdaptiveThresWindowSize_range,
sizeof(AdaptiveThresWindowSize_range));
300 str.read((
char *)&markerWarpPixSize,
sizeof(markerWarpPixSize));
301 str.read((
char *)&cornerRefinementM,
sizeof(cornerRefinementM));
302 str.read((
char *)&autoSize,
sizeof(autoSize));
303 str.read((
char *)&ts,
sizeof(pyrfactor));
304 str.read((
char *)&error_correction_rate,
sizeof(error_correction_rate));
305 str.read((
char *)&trackingMinDetections,
sizeof(trackingMinDetections));
306 str.read((
char *)&closingSize,
sizeof(closingSize));
307 _fromStream(dictionary, str);
311 void MarkerDetector::saveParamsToFile(
const std::string &path)
const
313 _impl->saveParamsToFile(path);
318 void MarkerDetector::loadParamsFromFile(
const std::string &path)
320 _impl->loadParamsFromFile(path);
323 void MarkerDetector::toStream(std::ostream &str)
const
325 _impl->toStream(str);
328 void MarkerDetector::fromStream(std::istream &str)
330 _impl->fromStream(str);
342 return "DM_VIDEO_FAST";
347 DetectionMode MarkerDetector::Params::getDetectionModeFromString(
const std::string &str)
349 if (str ==
"DM_FAST")
351 if (str ==
"DM_NORMAL")
353 if (str ==
"DM_VIDEO_FAST")
363 return "CORNER_LINES";
365 return "CORNER_SUBPIX";
367 return "CORNER_NONE";
369 return "CORNER_SUBPIX";
373 if (str ==
"CORNER_LINES")
375 if (str ==
"CORNER_SUBPIX")
377 if (str ==
"CORNER_NONE")
386 return "THRES_ADAPTIVE";
387 case THRES_AUTO_FIXED:
388 return "THRES_AUTO_FIXED";
390 return "THRES_ADAPTIVE";
394 if (str ==
"THRES_ADAPTIVE")
395 return THRES_ADAPTIVE;
396 if (str ==
"THRES_AUTO_FIXED")
397 return THRES_AUTO_FIXED;
398 return THRES_ADAPTIVE;
401 int thresHold,
int wsize,
int wsize_range)
403 AdaptiveThresWindowSize = wsize;
404 thresMethod = method;
407 if (method == MarkerDetector::THRES_AUTO_FIXED)
413 ThresHold = thresHold;
414 AdaptiveThresWindowSize_range = wsize_range;
416 void MarkerDetector::Params::setDetectionMode(
DetectionMode dm,
float minMarkerSize)
419 minSize = minMarkerSize;
422 setAutoSizeSpeedUp(
false);
423 setThresholdMethod(THRES_ADAPTIVE);
425 else if (detectMode ==
DM_FAST)
427 setAutoSizeSpeedUp(
false);
428 setThresholdMethod(THRES_AUTO_FIXED);
432 setThresholdMethod(THRES_AUTO_FIXED);
433 setAutoSizeSpeedUp(
true, 0.3);
438 cornerRefinementM = method;
442 void MarkerDetector::Params::_toStream(
const std::string &strg, std::ostream &str)
444 uint32_t s = strg.size();
445 str.write((
char *)&s,
sizeof(s));
446 str.write(strg.c_str(), strg.size());
448 void MarkerDetector::Params::_fromStream(std::string &strg, std::istream &str)
451 str.read((
char *)&s,
sizeof(s));
453 str.read(&strg[0], strg.size());
456 void MarkerDetector::cornerUpsample(std::vector<std::vector<cv::Point2f> > &corners,
457 cv::Size lowResImageSize)
459 _impl->cornerUpsample(corners, lowResImageSize);