markerdetector.cpp
Go to the documentation of this file.
1 
17 #include "markerdetector.h"
18 #include "cameraparameters.h"
19 #include "markerlabeler.h"
20 #include "timers.h"
21 
22 #include <opencv2/core/core.hpp>
23 #include <opencv2/imgproc/imgproc.hpp>
24 #include <opencv2/features2d/features2d.hpp>
25 #include <opencv2/calib3d/calib3d.hpp>
26 #include <fstream>
27 #include <iostream>
28 #include <valarray>
29 #include <chrono>
30 #include <thread>
31 #include "debug.h"
32 #include "aruco_cvversioning.h"
33 #include "markerdetector_impl.h"
34 
35 //#ifdef _DEBUG
36 //#include <opencv2/highgui/highgui.hpp>
37 //#endif
38 using namespace std;
39 using namespace cv;
40 
41 namespace aruco
42 {
43 /************************************
44  *
45  *
46  *
47  *
48  ************************************/
49 MarkerDetector::MarkerDetector()
50 {
51  _impl = new MarkerDetector_Impl();
52  // _iplm=std::unique_ptr<MarkerDetector_Impl>(new MarkerDetector_Impl());
53 }
54 /************************************
55  *
56  *
57  *
58  *
59  ************************************/
60 MarkerDetector::MarkerDetector(int dict_type, float error_correction_rate)
61 {
62  _impl = new MarkerDetector_Impl();
63  setDictionary(dict_type, error_correction_rate);
64  setDetectionMode(DM_NORMAL);
65 }
66 /************************************
67  *
68  *
69  *
70  *
71  ************************************/
72 MarkerDetector::MarkerDetector(std::string dict_type, float error_correction_rate)
73 {
74  _impl = new MarkerDetector_Impl();
75  setDictionary(dict_type, error_correction_rate);
76  setDetectionMode(DM_NORMAL);
77 }
78 /************************************
79  *
80  *
81  *
82  *
83  ************************************/
84 
85 MarkerDetector::~MarkerDetector()
86 {
87  delete _impl;
88 }
89 
90 void MarkerDetector::setParameters(const Params &params)
91 {
92  _impl->setParameters(params);
93 }
94 
95 /************************************
96  *
97  *
98  *
99  *
100  ************************************/
101 void MarkerDetector::setDetectionMode(DetectionMode dm, float minMarkerSize)
102 {
103  _impl->_params.setDetectionMode(dm, minMarkerSize);
104 }
105 
106 DetectionMode MarkerDetector::getDetectionMode()
107 {
108  return _impl->_params.detectMode;
109 }
110 
111 
112 
113 /************************************
114  *
115  *
116  *
117  *
118  ************************************/
119 
120 std::vector<aruco::Marker> MarkerDetector::detect(const cv::Mat &input)
121 {
122  return _impl->detect(input);
123 }
124 
125 std::vector<aruco::Marker> MarkerDetector::detect(const cv::Mat &input,
126  const CameraParameters &camParams,
127  float markerSizeMeters,
128  bool setYPerperdicular, bool correctFisheye)
129 {
130  return _impl->detect(input, camParams, markerSizeMeters, setYPerperdicular);
131 }
132 
133 /************************************
134  *
135  *
136  *
137  *
138  ************************************/
139 void MarkerDetector::detect(const cv::Mat &input, std::vector<Marker> &detectedMarkers,
140  CameraParameters camParams, float markerSizeMeters,
141  bool setYPerpendicular, bool correctFisheye)
142 {
143  _impl->detect(input, detectedMarkers, camParams, markerSizeMeters, setYPerpendicular);
144 }
145 
148 MarkerDetector::Params MarkerDetector::getParameters() const
149 {
150  return _impl->getParameters();
151 }
154 MarkerDetector::Params &MarkerDetector::getParameters()
155 {
156  return _impl->getParameters();
157 }
158 
159 
160 
161 std::vector<MarkerCandidate> MarkerDetector::getCandidates() const
162 {
163  return _impl->getCandidates();
164 }
165 
166 std::vector<cv::Mat> MarkerDetector::getImagePyramid()
167 {
168  return _impl->getImagePyramid();
169 }
170 cv::Ptr<MarkerLabeler> MarkerDetector::getMarkerLabeler()
171 {
172  return _impl->getMarkerLabeler();
173 }
174 void MarkerDetector::setMarkerLabeler(cv::Ptr<MarkerLabeler> detector)
175 {
176  _impl->setMarkerLabeler(detector);
177 }
178 
179 void MarkerDetector::setDictionary(int dict_type, float error_correction_rate)
180 {
181  _impl->setDictionary(dict_type, error_correction_rate);
182 }
183 
184 
185 void MarkerDetector::setDictionary(string dict_type, float error_correction_rate)
186 {
187  _impl->setDictionary(dict_type, error_correction_rate);
188 }
189 cv::Mat MarkerDetector::getThresholdedImage(uint32_t idx)
190 {
191  return _impl->getThresholdedImage(idx);
192 }
193 
194 void MarkerDetector::Params::save(cv::FileStorage &fs) const
195 {
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;
217 }
218 
219 void MarkerDetector::Params::load(cv::FileStorage &fs)
220 {
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);
239 
240 
241 
242  if (fs["aruco-detectMode"].type() != cv::FileNode::NONE)
243  {
244  string aux;
245  fs["aruco-detectMode"] >> aux;
246  detectMode = getDetectionModeFromString(aux);
247  }
248  if (fs["aruco-thresMethod"].type() != cv::FileNode::NONE)
249  {
250  string aux;
251  fs["aruco-thresMethod"] >> aux;
252  thresMethod = getCornerThresMethodFromString(aux);
253  }
254  if (fs["aruco-cornerRefinementM"].type() != cv::FileNode::NONE)
255  {
256  string aux;
257  fs["aruco-cornerRefinementM"] >> aux;
258  cornerRefinementM = getCornerRefinementMethodFromString(aux);
259  }
260 }
261 
262 
263 void MarkerDetector::Params::toStream(std::ostream &str) const
264 {
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));
284 
285 
286  _toStream(dictionary, str);
287 }
288 void MarkerDetector::Params::fromStream(std::istream &str)
289 {
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);
310 }
313 void MarkerDetector::saveParamsToFile(const std::string &path) const
314 {
315  _impl->saveParamsToFile(path);
316 }
317 
320 void MarkerDetector::loadParamsFromFile(const std::string &path)
321 {
322  _impl->loadParamsFromFile(path);
323 }
324 
325 void MarkerDetector::toStream(std::ostream &str) const
326 {
327  _impl->toStream(str);
328 }
329 
330 void MarkerDetector::fromStream(std::istream &str)
331 {
332  _impl->fromStream(str);
333 }
334 
335 std::string MarkerDetector::Params::toString(DetectionMode dm)
336 {
337  switch (dm)
338  {
339  case DM_FAST:
340  return "DM_FAST";
341  case DM_NORMAL:
342  return "DM_NORMAL";
343  case DM_VIDEO_FAST:
344  return "DM_VIDEO_FAST";
345  };
346  return "DM_NORMAL";
347 }
348 
349 DetectionMode MarkerDetector::Params::getDetectionModeFromString(const std::string &str)
350 {
351  if (str == "DM_FAST")
352  return DM_FAST;
353  if (str == "DM_NORMAL")
354  return DM_NORMAL;
355  if (str == "DM_VIDEO_FAST")
356  return DM_VIDEO_FAST;
357  return DM_NORMAL;
358 }
359 
360 std::string MarkerDetector::Params::toString(CornerRefinementMethod dm)
361 {
362  switch (dm)
363  {
364  case CORNER_LINES:
365  return "CORNER_LINES";
366  case CORNER_SUBPIX:
367  return "CORNER_SUBPIX";
368  case CORNER_NONE:
369  return "CORNER_NONE";
370  };
371  return "CORNER_SUBPIX";
372 }
373 CornerRefinementMethod MarkerDetector::Params::getCornerRefinementMethodFromString(const std::string &str)
374 {
375  if (str == "CORNER_LINES")
376  return CORNER_LINES;
377  if (str == "CORNER_SUBPIX")
378  return CORNER_SUBPIX;
379  if (str == "CORNER_NONE")
380  return CORNER_NONE;
381  return CORNER_SUBPIX;
382 }
383 std::string MarkerDetector::Params::toString(MarkerDetector::ThresMethod dm)
384 {
385  switch (dm)
386  {
387  case THRES_ADAPTIVE:
388  return "THRES_ADAPTIVE";
389  case THRES_AUTO_FIXED:
390  return "THRES_AUTO_FIXED";
391  };
392  return "THRES_ADAPTIVE";
393 }
394 MarkerDetector::ThresMethod MarkerDetector::Params::getCornerThresMethodFromString(const std::string &str)
395 {
396  if (str == "THRES_ADAPTIVE")
397  return THRES_ADAPTIVE;
398  if (str == "THRES_AUTO_FIXED")
399  return THRES_AUTO_FIXED;
400  return THRES_ADAPTIVE;
401 }
402 void MarkerDetector::Params::setThresholdMethod(MarkerDetector::ThresMethod method,
403  int thresHold, int wsize, int wsize_range)
404 {
405  AdaptiveThresWindowSize = wsize;
406  thresMethod = method;
407  if (thresHold == -1)
408  {
409  if (method == MarkerDetector::THRES_AUTO_FIXED)
410  ThresHold = 100;
411  else
412  ThresHold = 7;
413  }
414  else
415  ThresHold = thresHold;
416  AdaptiveThresWindowSize_range = wsize_range;
417 }
418 void MarkerDetector::Params::setDetectionMode(DetectionMode dm, float minMarkerSize)
419 {
420  detectMode = dm;
421  minSize = minMarkerSize;
422  if (detectMode == DM_NORMAL)
423  {
424  setAutoSizeSpeedUp(false);
425  setThresholdMethod(THRES_ADAPTIVE);
426  }
427  else if (detectMode == DM_FAST)
428  {
429  setAutoSizeSpeedUp(false);
430  setThresholdMethod(THRES_AUTO_FIXED);
431  }
432  else if (detectMode == DM_VIDEO_FAST)
433  {
434  setThresholdMethod(THRES_AUTO_FIXED);
435  setAutoSizeSpeedUp(true, 0.3);
436  }
437 }
438 void MarkerDetector::Params::setCornerRefinementMethod(CornerRefinementMethod method)
439 {
440  cornerRefinementM = method;
441  if (method != CORNER_SUBPIX)
442  minSize = 0;
443 }
444 void MarkerDetector::Params::_toStream(const std::string &strg, std::ostream &str)
445 {
446  uint32_t s = strg.size();
447  str.write((char *)&s, sizeof(s));
448  str.write(strg.c_str(), strg.size());
449 }
450 void MarkerDetector::Params::_fromStream(std::string &strg, std::istream &str)
451 {
452  uint32_t s;
453  str.read((char *)&s, sizeof(s));
454  strg.resize(s);
455  str.read(&strg[0], strg.size());
456 }
457 
458 void MarkerDetector::cornerUpsample(std::vector<std::vector<cv::Point2f> > &corners,
459  cv::Size lowResImageSize)
460 {
461  _impl->cornerUpsample(corners, lowResImageSize);
462 }
463 
464 
465 
466 }; // namespace aruco
CornerRefinementMethod
Parameters of the camera.
Main class for marker detection.
DetectionMode
The DetectionMode enum defines the different possibilities for detection. Specifies the detection mod...


aruco
Author(s): Rafael Muñoz Salinas , Bence Magyar
autogenerated on Fri Nov 25 2022 04:02:23