fractalmarker.cpp
Go to the documentation of this file.
2 
3 #include <bitset>
4 
5 
6 namespace aruco
7 {
9 {
10 }
11 
12 FractalMarker::FractalMarker(int id, cv::Mat m, std::vector<cv::Point3f> corners,
13  std::vector<int> id_submarkers)
14 {
15  this->id = id;
16  this->_M = m;
17  for (auto p : corners)
18  push_back(p);
19 
20  _submarkers = id_submarkers;
21  _mask = cv::Mat::ones(m.size(), CV_8UC1);
22 }
23 
25 {
26  float bitSize = (at(1).x - at(0).x) / int(mat().cols + 2);
27  float nsubBits = (submarker.at(1).x - submarker.at(0).x) / bitSize;
28 
29  int x_min = int(round(submarker[0].x / bitSize + mat().cols / 2));
30  int x_max = x_min + nsubBits;
31  int y_min = int(round(-submarker[0].y / bitSize + mat().cols / 2));
32  int y_max = y_min + nsubBits;
33 
34  for (int y = y_min; y < y_max; y++)
35  {
36  for (int x = x_min; x < x_max; x++)
37  {
38  _mask.at<uchar>(y, x) = 0;
39  }
40  }
41 }
42 
43 std::vector<cv::Point3f> FractalMarker::findInnerCorners()
44 {
45  int nBitsSquared = int(sqrt(mat().total()));
46  float bitSize = getMarkerSize() / (nBitsSquared + 2);
47 
48  // Set submarker pixels (=1) and add border
49  cv::Mat marker;
50  mat().copyTo(marker);
51  marker += -1 * (mask() - 1);
52  cv::Mat markerBorder;
53  copyMakeBorder(marker, markerBorder, 1, 1, 1, 1, cv::BORDER_CONSTANT, 0);
54 
55  // Get inner corners
56  std::vector<cv::Point3f> innerCorners;
57  for (int y = 0; y < markerBorder.rows - 1; y++)
58  {
59  for (int x = 0; x < markerBorder.cols - 1; x++)
60  {
61  if (((markerBorder.at<uchar>(y, x) == markerBorder.at<uchar>(y + 1, x + 1)) &&
62  (markerBorder.at<uchar>(y, x) != markerBorder.at<uchar>(y, x + 1) ||
63  markerBorder.at<uchar>(y, x) != markerBorder.at<uchar>(y + 1, x)))
64 
65  ||
66 
67  ((markerBorder.at<uchar>(y, x + 1) == markerBorder.at<uchar>(y + 1, x)) &&
68  (markerBorder.at<uchar>(y, x + 1) != markerBorder.at<uchar>(y, x) ||
69  markerBorder.at<uchar>(y, x + 1) != markerBorder.at<uchar>(y + 1, x + 1))))
70  innerCorners.push_back(
71  cv::Point3f(x - nBitsSquared / 2.f, -(y - nBitsSquared / 2.f), 0) * bitSize);
72  }
73  }
74  return innerCorners;
75 }
76 } // namespace aruco
aruco::FractalMarker::_submarkers
std::vector< int > _submarkers
Definition: fractalmarker.h:60
aruco::Marker3DInfo::at
cv::Point3f at(size_t idx) const
Definition: markermap.h:51
aruco::FractalMarker::addSubFractalMarker
void addSubFractalMarker(FractalMarker submarker)
Definition: fractalmarker.cpp:24
fractalmarker.h
aruco::FractalMarker::mat
const cv::Mat mat() const
Definition: fractalmarker.h:25
aruco::FractalMarker::_M
cv::Mat _M
Definition: fractalmarker.h:58
f
f
aruco::FractalMarker::innerCorners
std::vector< cv::Point3f > innerCorners
Definition: fractalmarker.h:61
aruco::FractalMarker::mask
const cv::Mat mask() const
Definition: fractalmarker.h:31
aruco::FractalMarker::FractalMarker
FractalMarker()
Definition: fractalmarker.cpp:8
aruco::Marker3DInfo::push_back
void push_back(const cv::Point3f &p)
Definition: markermap.h:63
aruco::FractalMarker::findInnerCorners
std::vector< cv::Point3f > findInnerCorners()
Definition: fractalmarker.cpp:43
aruco::FractalMarker::_mask
cv::Mat _mask
Definition: fractalmarker.h:59
aruco::Marker3DInfo::id
int id
Definition: markermap.h:37
aruco::Marker3DInfo::getMarkerSize
float getMarkerSize() const
Definition: markermap.h:47
aruco
Definition: cameraparameters.h:24
aruco::FractalMarker
Definition: fractalmarker.h:11


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