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, correctFisheye);
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, correctFisheye);
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 std::vector<MarkerCandidate> MarkerDetector::getCandidates() const
160 {
161  return _impl->getCandidates();
162 }
163 
164 std::vector<cv::Mat> MarkerDetector::getImagePyramid()
165 {
166  return _impl->getImagePyramid();
167 }
168 cv::Ptr<MarkerLabeler> MarkerDetector::getMarkerLabeler()
169 {
170  return _impl->getMarkerLabeler();
171 }
172 void MarkerDetector::setMarkerLabeler(cv::Ptr<MarkerLabeler> detector)
173 {
174  _impl->setMarkerLabeler(detector);
175 }
176 
177 void MarkerDetector::setDictionary(int dict_type, float error_correction_rate)
178 {
179  _impl->setDictionary(dict_type, error_correction_rate);
180 }
181 
182 
183 void MarkerDetector::setDictionary(string dict_type, float error_correction_rate)
184 {
185  _impl->setDictionary(dict_type, error_correction_rate);
186 }
187 cv::Mat MarkerDetector::getThresholdedImage(uint32_t idx)
188 {
189  return _impl->getThresholdedImage(idx);
190 }
191 
192 void MarkerDetector::Params::save(cv::FileStorage &fs) const
193 {
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;
215 }
216 
217 void MarkerDetector::Params::load(cv::FileStorage &fs)
218 {
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);
237 
238 
239 
240  if (fs["aruco-detectMode"].type() != cv::FileNode::NONE)
241  {
242  string aux;
243  fs["aruco-detectMode"] >> aux;
244  detectMode = getDetectionModeFromString(aux);
245  }
246  if (fs["aruco-thresMethod"].type() != cv::FileNode::NONE)
247  {
248  string aux;
249  fs["aruco-thresMethod"] >> aux;
250  thresMethod = getCornerThresMethodFromString(aux);
251  }
252  if (fs["aruco-cornerRefinementM"].type() != cv::FileNode::NONE)
253  {
254  string aux;
255  fs["aruco-cornerRefinementM"] >> aux;
256  cornerRefinementM = getCornerRefinementMethodFromString(aux);
257  }
258 }
259 
260 
261 void MarkerDetector::Params::toStream(std::ostream &str) const
262 {
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));
282 
283 
284  _toStream(dictionary, str);
285 }
286 void MarkerDetector::Params::fromStream(std::istream &str)
287 {
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);
308 }
311 void MarkerDetector::saveParamsToFile(const std::string &path) const
312 {
313  _impl->saveParamsToFile(path);
314 }
315 
318 void MarkerDetector::loadParamsFromFile(const std::string &path)
319 {
320  _impl->loadParamsFromFile(path);
321 }
322 
323 void MarkerDetector::toStream(std::ostream &str) const
324 {
325  _impl->toStream(str);
326 }
327 
328 void MarkerDetector::fromStream(std::istream &str)
329 {
330  _impl->fromStream(str);
331 }
332 
333 std::string MarkerDetector::Params::toString(DetectionMode dm)
334 {
335  switch (dm)
336  {
337  case DM_FAST:
338  return "DM_FAST";
339  case DM_NORMAL:
340  return "DM_NORMAL";
341  case DM_VIDEO_FAST:
342  return "DM_VIDEO_FAST";
343  };
344  return "DM_NORMAL";
345 }
346 
347 DetectionMode MarkerDetector::Params::getDetectionModeFromString(const std::string &str)
348 {
349  if (str == "DM_FAST")
350  return DM_FAST;
351  if (str == "DM_NORMAL")
352  return DM_NORMAL;
353  if (str == "DM_VIDEO_FAST")
354  return DM_VIDEO_FAST;
355  return DM_NORMAL;
356 }
357 
358 std::string MarkerDetector::Params::toString(CornerRefinementMethod dm)
359 {
360  switch (dm)
361  {
362  case CORNER_LINES:
363  return "CORNER_LINES";
364  case CORNER_SUBPIX:
365  return "CORNER_SUBPIX";
366  case CORNER_NONE:
367  return "CORNER_NONE";
368  };
369  return "CORNER_SUBPIX";
370 }
371 CornerRefinementMethod MarkerDetector::Params::getCornerRefinementMethodFromString(const std::string &str)
372 {
373  if (str == "CORNER_LINES")
374  return CORNER_LINES;
375  if (str == "CORNER_SUBPIX")
376  return CORNER_SUBPIX;
377  if (str == "CORNER_NONE")
378  return CORNER_NONE;
379  return CORNER_SUBPIX;
380 }
381 std::string MarkerDetector::Params::toString(MarkerDetector::ThresMethod dm)
382 {
383  switch (dm)
384  {
385  case THRES_ADAPTIVE:
386  return "THRES_ADAPTIVE";
387  case THRES_AUTO_FIXED:
388  return "THRES_AUTO_FIXED";
389  };
390  return "THRES_ADAPTIVE";
391 }
392 MarkerDetector::ThresMethod MarkerDetector::Params::getCornerThresMethodFromString(const std::string &str)
393 {
394  if (str == "THRES_ADAPTIVE")
395  return THRES_ADAPTIVE;
396  if (str == "THRES_AUTO_FIXED")
397  return THRES_AUTO_FIXED;
398  return THRES_ADAPTIVE;
399 }
400 void MarkerDetector::Params::setThresholdMethod(MarkerDetector::ThresMethod method,
401  int thresHold, int wsize, int wsize_range)
402 {
403  AdaptiveThresWindowSize = wsize;
404  thresMethod = method;
405  if (thresHold == -1)
406  {
407  if (method == MarkerDetector::THRES_AUTO_FIXED)
408  ThresHold = 100;
409  else
410  ThresHold = 7;
411  }
412  else
413  ThresHold = thresHold;
414  AdaptiveThresWindowSize_range = wsize_range;
415 }
416 void MarkerDetector::Params::setDetectionMode(DetectionMode dm, float minMarkerSize)
417 {
418  detectMode = dm;
419  minSize = minMarkerSize;
420  if (detectMode == DM_NORMAL)
421  {
422  setAutoSizeSpeedUp(false);
423  setThresholdMethod(THRES_ADAPTIVE);
424  }
425  else if (detectMode == DM_FAST)
426  {
427  setAutoSizeSpeedUp(false);
428  setThresholdMethod(THRES_AUTO_FIXED);
429  }
430  else if (detectMode == DM_VIDEO_FAST)
431  {
432  setThresholdMethod(THRES_AUTO_FIXED);
433  setAutoSizeSpeedUp(true, 0.3);
434  }
435 }
436 void MarkerDetector::Params::setCornerRefinementMethod(CornerRefinementMethod method)
437 {
438  cornerRefinementM = method;
439  if (method != CORNER_SUBPIX)
440  minSize = 0;
441 }
442 void MarkerDetector::Params::_toStream(const std::string &strg, std::ostream &str)
443 {
444  uint32_t s = strg.size();
445  str.write((char *)&s, sizeof(s));
446  str.write(strg.c_str(), strg.size());
447 }
448 void MarkerDetector::Params::_fromStream(std::string &strg, std::istream &str)
449 {
450  uint32_t s;
451  str.read((char *)&s, sizeof(s));
452  strg.resize(s);
453  str.read(&strg[0], strg.size());
454 }
455 
456 void MarkerDetector::cornerUpsample(std::vector<std::vector<cv::Point2f> > &corners,
457  cv::Size lowResImageSize)
458 {
459  _impl->cornerUpsample(corners, lowResImageSize);
460 }
461 
462 
463 
464 }; // namespace aruco
aruco::DM_FAST
@ DM_FAST
Definition: markerdetector.h:63
aruco::DM_VIDEO_FAST
@ DM_VIDEO_FAST
Definition: markerdetector.h:64
markerlabeler.h
aruco::CORNER_SUBPIX
@ CORNER_SUBPIX
Definition: markerdetector.h:76
aruco::CameraParameters
Parameters of the camera.
Definition: cameraparameters.h:29
markerdetector.h
aruco::CornerRefinementMethod
CornerRefinementMethod
Definition: markerdetector.h:74
aruco::MarkerDetector_Impl
Main class for marker detection.
Definition: markerdetector_impl.h:41
markerdetector_impl.h
aruco::DM_NORMAL
@ DM_NORMAL
Definition: markerdetector.h:62
aruco::MarkerDetector::ThresMethod
ThresMethod
Definition: markerdetector.h:96
aruco::CORNER_LINES
@ CORNER_LINES
Definition: markerdetector.h:77
aruco::MarkerDetector::Params
Definition: markerdetector.h:104
timers.h
std
aruco
Definition: cameraparameters.h:24
aruco::DetectionMode
DetectionMode
The DetectionMode enum defines the different possibilities for detection. Specifies the detection mod...
Definition: markerdetector.h:60
aruco_cvversioning.h
cameraparameters.h
aruco::CORNER_NONE
@ CORNER_NONE
Definition: markerdetector.h:78


aruco
Author(s): Rafael Muñoz Salinas , Bence Magyar
autogenerated on Sat Sep 23 2023 02:26:45