vrcore  0.45
visuReal Messkern
 All Classes Files Functions Variables
features.h
Go to the documentation of this file.
1 #ifndef FEATURES_H
2 #define FEATURES_H
3 
8 namespace vr
9 {
10 
11 typedef std::vector<cv::Rect> Rects;
12 
16 typedef StatusInfo FeatureStatus;
17 
18 const StatusInfo fsIndeterminate = todo;
19 const StatusInfo fsNegative = fail;
20 const StatusInfo fsGuessed = guessed;
21 const StatusInfo fsPositive = good;
22 const StatusInfo fsChanged = changed;
23 
24 class Feature;
25 
27 {
28 friend class Feature;
29 protected:
30  double scaleFactor_;
31  FeatureContainer(double scaleFactor = 1.0);
32  virtual ~FeatureContainer() {};
33  virtual void centerChanged(Feature& feature) = 0;
34  void getScaledImage(const cv::Mat& src, cv::Mat& dst);
35 public:
36  double getScaleFactor() const { return scaleFactor_; };
37  double getScaleFactor(ExposureArrangement arrangement) const {
38  switch (arrangement) {
39  case iPad_mini_3_zoom3_2:
40  return 2.0;
41  break;
42  case iPad_mini_3_zoom4_2:
43  return 2.1;
44  break;
45  case iPad_mini_4_zoom4_2:
46  return 2.1;
47  break;
48  case iPad_4_front:
49  case iPad_Air_front:
50  case iPad_mini_3_front:
51  return 1.0;
52  break;
53  default:
54  return 1.0;
55  }
56  };
57 };
58 
59 
60 
68 class Feature
69 {
70 friend class FeatureContainer;
71  FeatureContainer* container_;
72 protected:
73  FeatureStatus status_;
74  virtual ~Feature() {};
75  virtual void _setCenter(const cv::Point2f& center) = 0;
76  virtual void addOffset(const cv::Point& offset) = 0;
77  inline double getScaleFactor() const { return container_ ? container_->scaleFactor_ : 1.0; };
78 
79  virtual cv::Point2f getScaledCenter() const = 0;
87  void setScaledCenter(const cv::Point2f& center, bool notifyContainer = true);
88  inline void setContainer(FeatureContainer* container) { container_ = container; };
89 public:
90  Feature();
95  inline bool found() const { return status_ == fsPositive; };
96  inline bool usable() const { return (status_ == fsPositive) || (status_ == fsGuessed); };
101  bool isChanged() const { return status_ == fsChanged; };
102 
103  cv::Point2f getCenter() const { return getScaledCenter() * getScaleFactor(); };
108  void setCenter(const cv::Point2f& center) { setScaledCenter(center * (1.0 / getScaleFactor()), true); };
112  inline void reset() { status_ = fsIndeterminate; };
113  inline FeatureStatus getStatus() const { return status_; };
114  inline void setStatus(const FeatureStatus status) { status_ = status; };
115 };
116 
124 class CircularFeature : public Feature
125 {
126  friend class FrontalFixedMarksEvaluator;
127  friend class FrontFeatures;
128  friend class SideFeatures;
129 
130 protected:
131  cv::Point2f center_;
132  float radius_;
133  void _setCenter(const cv::Point2f& center) { center_ = center; };
134  void addOffset(const cv::Point& offset) {
135  cv::Point2f offs = offset;
136  center_ += offs;
137  };
138 
139  cv::Point2f getScaledCenter() const { return center_; };
140  inline float getScaledRadius() const { return radius_; };
141  inline void setScaledRadius(const float radius) { radius_ = radius; };
142  inline void setScaledData(const cv::Point2f& center, const float radius,
143  const FeatureStatus status, bool notifyContainer = true)
144  {
145  setScaledCenter(center, notifyContainer);
146  radius_ = radius;
147  status_ = status;
148  }
149 public:
150  CircularFeature();
151  CircularFeature(const cv::Point2f& center, const float radius);
152 
153  inline float getRadius() const { return radius_ * getScaleFactor(); };
154  inline void setData(const cv::Point2f& center, const float radius,
155  const FeatureStatus status)
156  {
157  setScaledData(center * (1.0 / getScaleFactor()), radius / getScaleFactor(), status, true);
158  }
159 };
160 
168 class Mark : public CircularFeature
169 {
170  MarkOrientation orientation_;
171 public:
172  Mark();
173  Mark(const cv::Point2f& center, const float radius = 0.0f,
174  const MarkOrientation orientation = moInvalid);
175 
176  inline void setScaledData(const MarkImageData& data,
177  const FeatureStatus status, bool notifyContainer = true)
178  {
179  CircularFeature::setScaledData(data.center, data.radius, status, notifyContainer);
180  orientation_ = data.orientation;
181  }
182 
183  MarkOrientation getOrientation() const { return orientation_; };
188  inline void setOrientation(const MarkOrientation orientation) { orientation_ = orientation; };
189 
190  inline MarkImageData getData() {
191  MarkImageData data;
192  data.center = getCenter();
193  data.radius = getRadius();
194  data.orientation = getOrientation();
195  return data;
196  }
197 
198  inline void setData(const MarkImageData& data, const FeatureStatus status) {
199  setScaledData(data, status, true);
200  }
201 };
202 
203 inline const cv::Rect scaledRect(const cv::Rect& rect, double scaleFactor) {
204  return cv::Rect(rect.tl() * scaleFactor, rect.br() * scaleFactor);
205 }
206 
214 class AreaFeature : public Feature
215 {
216  friend class FrontFeatures;
217 
218  cv::Rect area_;
219 protected:
220  void _setCenter(const cv::Point2f& center);
221  void addOffset(const cv::Point& offset) { area_ = area_ + offset; };
222  cv::Point2f getScaledCenter() const { return 0.5f * (area_.tl() + area_.br()); };
223  inline const cv::Rect& getScaledArea() const { return area_; };
224  inline void setScaledArea(const cv::Rect& area) { area_ = area; };
225 public:
226  AreaFeature();
227  inline const cv::Rect getArea() const { return scaledRect(area_, getScaleFactor()); };
228 // inline void setArea(const cv::Rect& area) { area_ = area / getScaleFactor(); };
229 };
230 
231 } // namespace vr
232 
233 #endif
void setCenter(const cv::Point2f &center)
Definition: features.h:108
Repräsentiert eine Marke des Meßaufsatzes (aka Meßbügel) im Bild.
Definition: features.h:168
beschreibt eine Visierbügelmarke
Definition: types.h:31
void setScaledCenter(const cv::Point2f &center, bool notifyContainer=true)
Setzt den Mittelpunkt relativ zum intern skalierten Bild.
Definition: features.cpp:27
Definition: front_features.h:20
void setOrientation(const MarkOrientation orientation)
Orientierung der schwarzen und weißen Felder in der Markenmitte.
Definition: features.h:188
Definition: features.h:68
bool found() const
Feature gefunden.
Definition: features.h:95
Definition: side_features.h:14
Definition: features.h:214
Definition: features.h:26
bool isChanged() const
Definition: features.h:101
Repräsentiert ein kreisförmiges Feature.
Definition: features.h:124