Ocean
Loading...
Searching...
No Matches
BullseyeDetectorMono.h
Go to the documentation of this file.
1/*
2 * Copyright (c) Meta Platforms, Inc. and affiliates.
3 *
4 * This source code is licensed under the MIT license found in the
5 * LICENSE file in the root directory of this source tree.
6 */
7
8#ifndef OCEAN_CV_DETECTOR_BULLSEYES_BULLSEYEDETECTORMONO_H
9#define OCEAN_CV_DETECTOR_BULLSEYES_BULLSEYEDETECTORMONO_H
10
14
15#include "ocean/base/Frame.h"
16#include "ocean/base/Lock.h"
17#include "ocean/base/Worker.h"
18
19namespace Ocean
20{
21
22namespace CV
23{
24
25namespace Detector
26{
27
28namespace Bullseyes
29{
30
31/**
32 * Implementation of a monocular detector for the bullseye pattern.
33 * @ingroup cvdetectorbullseyes
34 */
35class OCEAN_CV_DETECTOR_BULLSEYES_EXPORT BullseyeDetectorMono
36{
37 public:
38
39 /**
40 * This class holds the most important parameters for the detector.
41 *
42 * Parameter Guide:
43 *
44 * framePyramidPixelThreshold:
45 * Controls when to use multi-scale detection via image pyramids.
46 * - Default: 640 * 480 = 307200 pixels (VGA resolution)
47 * - For images larger than this threshold, pyramid layers are used to detect bullseyes at multiple scales
48 * - Smaller values enable pyramid processing for smaller images (more thorough but slower)
49 * - Larger values disable pyramid processing for more images (faster but may miss small bullseyes)
50 *
51 * framePyramidLayers:
52 * Number of pyramid layers to use for multi-scale detection.
53 * - Default: 3 layers
54 * - More layers detect smaller bullseyes but increase computation time
55 * - Typical range: 2-4 layers
56 *
57 * useAdaptiveRowSpacing:
58 * Whether to skip rows during detection for better performance.
59 * - Default: true (enabled)
60 * - When enabled: Rows are skipped based on image height (height/150)
61 * - When disabled: Every row is scanned (slower but more accurate)
62 * - Recommended: true for real-time applications, false for offline/accuracy-critical applications
63 *
64 * minimumSegmentSize:
65 * Minimum size in pixels for each of the 5 segments in the bullseye pattern.
66 * - Default: 2 pixels
67 * - Segments smaller than this are rejected as unreliable for threshold computation
68 * - Helps filter out noise and false positives from tiny patterns at higher pyramid layers
69 */
70 class OCEAN_CV_DETECTOR_BULLSEYES_EXPORT Parameters
71 {
72 public:
73
74 /**
75 * Creates a new valid parameter object.
76 */
77 Parameters() = default;
78
79 /**
80 * Returns whether the parameters are valid.
81 * @return True if the parameters are valid
82 */
83 bool isValid() const noexcept;
84
85 /**
86 * Returns the pixel threshold for frame pyramid creation.
87 * @return The pixel threshold value, with range [0, infinity)
88 */
89 unsigned int framePyramidPixelThreshold() const noexcept;
90
91 /**
92 * Sets the pixel threshold for frame pyramid creation.
93 * @param framePyramidPixelThreshold The pixel threshold value, with range [0, infinity)
94 */
95 void setFramePyramidPixelThreshold(unsigned int framePyramidPixelThreshold) noexcept;
96
97 /**
98 * Returns the number of layers for the frame pyramid.
99 * @return The number of pyramid layers, with range [1, infinity)
100 */
101 unsigned int framePyramidLayers() const noexcept;
102
103 /**
104 * Sets the number of layers for the frame pyramid.
105 * @param framePyramidLayers The number of pyramid layers, with range [1, infinity)
106 */
107 void setFramePyramidLayers(unsigned int framePyramidLayers) noexcept;
108
109 /**
110 * Returns whether adaptive row spacing is enabled during bullseye detection.
111 * @return True if adaptive row spacing is used (performance optimization), false if every row is scanned (higher accuracy)
112 */
113 bool useAdaptiveRowSpacing() const noexcept;
114
115 /**
116 * Sets whether adaptive row spacing should be used during bullseye detection.
117 * When enabled (true), the detector uses adaptive row spacing based on frame height for better performance.
118 * When disabled (false), every row is scanned for higher accuracy but slower performance.
119 * @param useAdaptiveRowSpacing True to enable adaptive spacing, false to scan every row
120 */
121 void setUseAdaptiveRowSpacing(bool useAdaptiveRowSpacing) noexcept;
122
123 /**
124 * Returns the minimum segment size for a valid bullseye detection.
125 * @return The minimum segment size in pixels, with range [1, infinity)
126 */
127 unsigned int minimumSegmentSize() const noexcept;
128
129 /**
130 * Sets the minimum segment size for a valid bullseye detection.
131 * Segments smaller than this value are rejected as unreliable for threshold computation.
132 * @param minimumSegmentSize The minimum segment size in pixels, with range [1, infinity)
133 */
134 void setMinimumSegmentSize(unsigned int minimumSegmentSize) noexcept;
135
136 /**
137 * Returns the default parameters for the detector.
138 * @return The default parameters
139 */
140 static Parameters defaultParameters() noexcept;
141
142 protected:
143
144 /// The pixel threshold for frame pyramid creation, with range [0, infinity)
145 unsigned int framePyramidPixelThreshold_ = 640u * 480u;
146
147 /// The number of layers for the frame pyramid, with range [1, infinity)
148 unsigned int framePyramidLayers_ = 3u;
149
150 /// Determines whether adaptive row spacing is used (true) or every row is scanned (false) during bullseye detection
151 bool useAdaptiveRowSpacing_ = true;
152
153 /// The minimum segment size in pixels for a valid bullseye detection, with range [1, infinity)
154 unsigned int minimumSegmentSize_ = 2u;
155 };
156
157 public:
158
159 /**
160 * Detects bullseyes in a given 8-bit grayscale image.
161 * @param yFrame The 8-bit grayscale frame in which the bullseyes will be detected, with origin in the upper left corner, must be valid
162 * @param bullseyes The resulting detected bullseyes, will be appended to the end of the vector
163 * @param parameters The parameters for the detector, must be valid
164 * @param worker Optional worker to distribute the computation
165 * @return True, if succeeded
166 */
167 static bool detectBullseyes(const Frame& yFrame, Bullseyes& bullseyes, const Parameters& parameters = Parameters::defaultParameters(), Worker* worker = nullptr);
168
169 protected:
170
171 /**
172 * Detects bullseyes in a subset of a given 8-bit grayscale image.
173 * @param yFrame The 8-bit grayscale frame in which the bullseyes will be detected, must be valid
174 * @param bullseyes The resulting bullseyes, will be added to the end of the vector
175 * @param multiThreadLock Lock object in case this function is executed in multiple threads concurrently, otherwise nullptr
176 * @param useAdaptiveRowSpacing True to use adaptive row spacing, false to scan every row
177 * @param minimumSegmentSize The minimum segment size in pixels for a valid bullseye detection, with range [1, infinity)
178 * @param pyramidLayer The pyramid layer at which this detection is performed, with range [0, infinity)
179 * @param firstRow The first row to be handled, with range [0, yFrame.height())
180 * @param numberRows The number of rows to be handled, with range [1, yFrame.height() - firstRow]
181 */
182 static void detectBullseyesSubset(const Frame* yFrame, Bullseyes* bullseyes, Lock* multiThreadLock, const bool useAdaptiveRowSpacing, const unsigned int minimumSegmentSize, const unsigned int pyramidLayer, const unsigned int firstRow, const unsigned int numberRows);
183
184 /**
185 * Detects bullseyes in a row of a grayscale image.
186 * @param yFrame The 8-bit grayscale frame in which the bullseyes will be detected, must be valid
187 * @param y The index of the row in which the bullseyes will be detected, with range [0, yFrame.height())
188 * @param bullseyes The resulting detected bullseyes, will be added to the end of the vector
189 * @param minimumSegmentSize The minimum segment size in pixels for a valid bullseye detection, with range [1, infinity)
190 * @param pyramidLayer The pyramid layer at which this detection is performed, with range [0, infinity)
191 */
192 static void detectBullseyesInRow(const Frame& yFrame, const unsigned int y, Bullseyes& bullseyes, const unsigned int minimumSegmentSize, const unsigned int pyramidLayer = 0u);
193
194 /**
195 * Finds either the next black or the next white pixel towards negative y direction (upwards in an image).
196 * @param yFrame The 8-bit grayscale frame in which the pixel will be searched, must be valid
197 * @param x The horizontal location within the frame at which the search will be performed, in pixels, with range [0, yFrame.width())
198 * @param y The current vertical location within the image, with range [0, yFrame.height())
199 * @param maximalRows The maximal number of rows (vertical pixels) to travel, with range [1, y]
200 * @param threshold The threshold separating a bright pixel from a dark pixel, with range [0, 255]
201 * @param rows The resulting number of rows that have been traveled until the black or white pixel has been found
202 * @return True, if the black or white pixel has been found within the specified range of [1, maximalRows]
203 * @tparam tFindBlackPixel True, to find the next black pixel; False, to find the next white pixel
204 */
205 template <bool tFindBlackPixel>
206 static bool findNextUpperPixel(const Frame& yFrame, const unsigned int x, const unsigned int y, const unsigned int maximalRows, const unsigned int threshold, unsigned int& rows);
207
208 /**
209 * Finds either the next black or the next white pixel towards positive y direction (downwards in an image).
210 * @param yFrame The 8-bit grayscale frame in which the pixel will be searched, must be valid
211 * @param x The horizontal location within the frame at which the search will be performed, in pixels, with range [0, yFrame.width())
212 * @param y The current vertical location within the image, with range [0, yFrame.height())
213 * @param maximalRows The maximal number of rows (vertical pixels) to travel, with range [1, yFrame.height() - y]
214 * @param threshold The threshold separating a bright pixel from a dark pixel, with range [0, 255]
215 * @param rows The resulting number of rows that have been traveled until the black or white pixel has been found
216 * @return True, if the black or white pixel has been found within the specified range of [1, maximalRows]
217 * @tparam tFindBlackPixel True, to find the next black pixel; False, to find the next white pixel
218 */
219 template <bool tFindBlackPixel>
220 static bool findNextLowerPixel(const Frame& yFrame, const unsigned int x, const unsigned int y, const unsigned int maximalRows, const unsigned int threshold, unsigned int& rows);
221
222 /**
223 * Determines the gray threshold separating bright pixels from dark pixels.
224 * The threshold is based on actual pixel values for which the association is known already.
225 * The provided position is a pointer to any pixel within the image frame.
226 * In addition to the pixels covered by the five segments, pixels neighboring the segments are also used for estimation of the threshold.
227 * @param yPosition The first pixel within an 8-bit grayscale image for which 5 connected segments are known with black, white, black, white, and black pixels, must be valid
228 * @param segmentSize1 The number of pixels covering dark pixels, with range [1, infinity)
229 * @param segmentSize2 The number of pixels covering bright pixels, with range [1, infinity)
230 * @param segmentSize3 The number of pixels covering dark pixels, with range [1, infinity)
231 * @param segmentSize4 The number of pixels covering bright pixels, with range [1, infinity)
232 * @param segmentSize5 The number of pixels covering dark pixels, with range [1, infinity)
233 * @return The threshold separating bright pixels from dark pixels, with range [0, 255], -1 if no valid threshold could be determined
234 */
235 static unsigned int determineThreshold(const uint8_t* yPosition, const unsigned int segmentSize1, const unsigned int segmentSize2, const unsigned int segmentSize3, const unsigned int segmentSize4, const unsigned int segmentSize5);
236
237 /**
238 * Checks whether a column contains a bullseye at a specified location.
239 * This function is simply checking for the same bullseye pattern in vertical direction (within a small window).
240 * @param yFrame The 8-bit grayscale frame in which the bullseyes will be detected, must be valid
241 * @param xCenter The horizontal location within the frame at which the existence of the bullseye will be checked, in pixels, with range [0, yFrame.width())
242 * @param yCenter The vertical location within the frame at which the existence of the bullseye will be checked, in pixels, with range [0, yFrame.height())
243 * @param threshold The grayscale threshold separating a bright pixel from a dark pixel, with range [0, 255]
244 * @param blackRingSegmentMin The minimal size (thickness) of the black ring, in pixels, with range [1, infinity)
245 * @param blackRingSegmentMax The maximal size (thickness) of the black ring, in pixels, with range [blackRingSegmentMin, infinity)
246 * @param whiteRingSegmentMin The minimal size (thickness) of the white ring, in pixels, with range [1, infinity)
247 * @param whiteRingSegmentMax The maximal size (thickness) of the white ring, in pixels, with range [whiteRingSegmentMin, infinity)
248 * @param dotSegmentMin The minimal size (thickness) of the black dot, in pixels, with range [1, infinity)
249 * @param dotSegmentMax The maximal size (thickness) of the black dot, in pixels, with range [dotSegmentMin, infinity)
250 * @return True, if the column contains a bullseye at the specified location
251 */
252 static bool checkBullseyeInColumn(const Frame& yFrame, const unsigned int xCenter, const unsigned int yCenter, const unsigned int threshold, const unsigned int blackRingSegmentMin, const unsigned int blackRingSegmentMax, const unsigned int whiteRingSegmentMin, const unsigned int whiteRingSegmentMax, const unsigned int dotSegmentMin, const unsigned int dotSegmentMax);
253
254 /**
255 * Determines the sub-pixel location of the center dot of a known bullseye.
256 * @param yFrame The 8-bit grayscale frame in which the bullseye is located, must be valid
257 * @param xBullseye The horizontal location of the bullseye (the center location), the pixel must be black, with range [0, yFrame.width())
258 * @param yBullseye The vertical location of the bullseye (the center location), the pixel must be black, with range [0, yFrame.height())
259 * @param threshold The threshold separating a bright pixel from a dark pixel, with range [0, 255]
260 * @param location The resulting sub-pixel location of the center of the bullseye
261 * @return True, if the sub-pixel location could be determined
262 */
263 static bool determineAccurateBullseyeLocation(const Frame& yFrame, const unsigned int xBullseye, const unsigned int yBullseye, const unsigned int threshold, Vector2& location);
264
265 /**
266 * Checks if a pixel is black (dark) based on a threshold.
267 * @param pixel Pointer to the pixel value to check, must be valid
268 * @param threshold The threshold separating dark from bright pixels, with range [0, 255]
269 * @return True if the pixel intensity is below the threshold
270 */
271 static bool isBlackPixel(const uint8_t* pixel, const uint8_t threshold);
272
273 /**
274 * Checks if a pixel is white (bright) based on a threshold.
275 * @param pixel Pointer to the pixel value to check, must be valid
276 * @param threshold The threshold separating dark from bright pixels, with range [0, 255]
277 * @return True if the pixel intensity is at or above the threshold
278 */
279 static bool isWhitePixel(const uint8_t* pixel, const uint8_t threshold);
280
281 /**
282 * Computes the subpixel transition point between two integer pixels using intensity interpolation.
283 * @param lastPointInside The last pixel inside the transition region
284 * @param firstPointOutside The first pixel outside the transition region
285 * @param insideIntensity The intensity at the inside point
286 * @param outsideIntensity The intensity at the outside point
287 * @param threshold The intensity threshold being crossed, with range [0, 255]
288 * @return The interpolated subpixel transition point
289 */
290 static Vector2 computeSubpixelTransition(const VectorT2<unsigned int>& lastPointInside, const VectorT2<unsigned int>& firstPointOutside, uint8_t insideIntensity, uint8_t outsideIntensity, const unsigned int threshold);
291
292 /**
293 * Computes the interpolation factor for a threshold crossing between two intensity values.
294 * @param insideIntensity The intensity at the inside point
295 * @param outsideIntensity The intensity at the outside point
296 * @param threshold The intensity threshold being crossed, with range [0, 255]
297 * @return The interpolation factor in range [0, 1], where 0 means at inside point and 1 means at outside point
298 */
299 static Scalar computeIntensityInterpolationFactor(const uint8_t insideIntensity, const uint8_t outsideIntensity, const unsigned int threshold);
300
301 /**
302 * Computes the transition point along a ray using direct distance interpolation.
303 *
304 * Instead of computing a 2D subpixel point and projecting it onto the ray, this function
305 * directly interpolates the distance along the ray direction. This is mathematically
306 * equivalent but conceptually cleaner: we compute the ray distance for each Bresenham
307 * pixel and interpolate based on intensity, then reconstruct the 2D point from the
308 * interpolated distance.
309 *
310 * @param insidePoint The last Bresenham pixel inside the current region
311 * @param outsidePoint The first Bresenham pixel outside the current region
312 * @param insideIntensity The intensity at the inside point
313 * @param outsideIntensity The intensity at the outside point
314 * @param threshold The intensity threshold being crossed, with range [0, 255]
315 * @param center The center of the bullseye (ray origin)
316 * @param rayDirection The unit direction vector of the ray
317 * @return The transition point lying exactly on the ray at the interpolated distance from center
318 */
319 static Vector2 computeTransitionPointOnRay(const VectorT2<unsigned int>& insidePoint, const VectorT2<unsigned int>& outsidePoint, const uint8_t insideIntensity, const uint8_t outsideIntensity, const unsigned int threshold, const Vector2& center, const Vector2& rayDirection);
320
321 /**
322 * Casts a half-ray from the bullseye center and finds transition points.
323 * Uses Bresenham's line algorithm to step through pixels and detects the three
324 * threshold crossings: center-to-ring0, ring0-to-ring1, and ring1-to-background.
325 * @param yFrameData The 8-bit grayscale frame data, must be valid
326 * @param yFrameWidth The width of the frame in pixels
327 * @param yFrameHeight The height of the frame in pixels
328 * @param yFrameStrideElements The stride of the frame in elements
329 * @param xCenter The horizontal center location of the bullseye, in pixels
330 * @param yCenter The vertical center location of the bullseye, in pixels
331 * @param angle The angle of the ray in radians, with range [0, 2*PI)
332 * @param maxSearchRadius The maximum search radius in pixels
333 * @param centerIntensity The intensity at the center pixel
334 * @param grayThreshold The threshold separating dark from bright pixels
335 * @param ray The resulting half-ray with transition points
336 * @return True if all three transition points were found
337 */
338 static bool castHalfRay(const uint8_t* yFrameData, const unsigned int yFrameWidth, const unsigned int yFrameHeight, const unsigned int yFrameStrideElements, const unsigned int xCenter, const unsigned int yCenter, const Scalar angle, const Scalar maxSearchRadius, const uint8_t centerIntensity, const uint8_t grayThreshold, HalfRay& ray);
339
340 /**
341 * Checks radial consistency of a bullseye candidate by casting rays in multiple directions.
342 * The check verifies that the pattern of transitions (black->white->black->white) is consistent across all directions.
343 * @param yFrame The 8-bit grayscale frame, must be valid
344 * @param xCenter The horizontal center of the bullseye candidate, with range [0, yFrame.width())
345 * @param yCenter The vertical center of the bullseye candidate, with range [0, yFrame.height())
346 * @param threshold The grayscale threshold separating bright from dark pixels, with range [0, 255]
347 * @param maxSearchRadius Maximum ray length in pixels, with range [1, infinity)
348 * @param numberDiameters Number of diameters to cast (a diameter consists of two half-rays eminating from the center of the bullseye, one in positive direction and one in negative direction), with range [8, infinity)
349 * @param backgroundExtensionFactor How far to extend beyond r2 as fraction of ring width, with range [0, 1]
350 * @param scale Scale factor for debug visualization (2^pyramidLayer), with range [1, infinity)
351 * @return True if the candidate passes the radial consistency check
352 */
353 static bool checkRadialConsistency(const Frame& yFrame, const unsigned int xCenter, const unsigned int yCenter, const unsigned int threshold, const float maxSearchRadius, const unsigned int numberDiameters, const Scalar minValidRayFraction, const Scalar backgroundExtensionFactor, const Scalar scale = Scalar(1), Diameters* diameters = nullptr);
354
355 /**
356 * Phase 1 of radial consistency check: Cast symmetric half-rays.
357 * Casts half-rays in positive and negative directions for each diameter.
358 * @param yData Pointer to the frame data
359 * @param width Frame width in pixels
360 * @param height Frame height in pixels
361 * @param strideElements Frame stride in elements
362 * @param xCenter Horizontal center coordinate
363 * @param yCenter Vertical center coordinate
364 * @param threshold Grayscale threshold
365 * @param maxSearchRadius Maximum ray search radius
366 * @param centerIntensity Intensity at the center pixel
367 * @param numberDiameters Number of diameters to cast
368 * @param minValidRayFraction Minimum fraction of valid rays required
369 * @param scale Scale factor for debug visualization
370 * @param diameters Output: the diameter data with half-ray results
371 * @return True if phase passes (enough valid rays found)
372 */
373 static bool checkRadialConsistencyPhase1CastRays(const uint8_t* yData, const unsigned int width, const unsigned int height, const unsigned int strideElements, const unsigned int xCenter, const unsigned int yCenter, const unsigned int threshold, const float maxSearchRadius, const uint8_t centerIntensity, const unsigned int numberDiameters, const Scalar minValidRayFraction, const Scalar scale, Diameters& diameters);
374
375 /**
376 * Phase 2 of radial consistency check: Symmetry validation.
377 * Checks if transition points are symmetric around the center.
378 * @param xCenter Horizontal center coordinate
379 * @param yCenter Vertical center coordinate
380 * @param numberDiameters Number of diameters
381 * @param minValidRayFraction Minimum fraction of symmetric diameters required
382 * @param scale Scale factor for debug visualization
383 * @param diameters The diameter data to validate (modified with symmetry flags)
384 * @return True if phase passes (enough symmetric diameters found)
385 */
386 static bool checkRadialConsistencyPhase2SymmetryValidation(const unsigned int xCenter, const unsigned int yCenter, const unsigned int numberDiameters, const Scalar minValidRayFraction, const Scalar scale, Diameters& diameters);
387
388 /**
389 * Phase 3 of radial consistency check: Intensity validation.
390 * Validates that midpoints between transition points have expected intensities.
391 * @param yFrame The grayscale frame
392 * @param threshold Grayscale threshold
393 * @param numberDiameters Number of diameters
394 * @param backgroundExtensionFactor Extension factor for background check
395 * @param scale Scale factor for debug visualization
396 * @param xCenter Horizontal center coordinate
397 * @param yCenter Vertical center coordinate
398 * @param diameters The diameter data to validate (modified with intensity check results)
399 * @return True if phase passes (enough intensity checks pass)
400 */
401 static bool checkRadialConsistencyPhase3IntensityValidation(const Frame& yFrame, const unsigned int threshold, const unsigned int numberDiameters, const Scalar backgroundExtensionFactor, const Scalar scale, const unsigned int xCenter, const unsigned int yCenter, Diameters& diameters);
402
403 /**
404 * Phase 4 of radial consistency check: Radial profile validation.
405 * Validates that the radial profile has an ellipse-like shape (limited local extrema).
406 * @param xCenter Horizontal center coordinate
407 * @param yCenter Vertical center coordinate
408 * @param numberDiameters Number of diameters
409 * @param diameters The diameter data to validate
410 * @return True if phase passes (radial profile is ellipse-like)
411 */
412 static bool checkRadialConsistencyPhase4RadialProfileValidation(const unsigned int xCenter, const unsigned int yCenter, const unsigned int numberDiameters, const Diameters& diameters);
413
414 /**
415 * Phase 5 of radial consistency check: Ring proportion validation.
416 * Validates that ring widths are consistent across all diameters.
417 * @param xCenter Horizontal center coordinate
418 * @param yCenter Vertical center coordinate
419 * @param numberDiameters Number of diameters
420 * @param diameters The diameter data to validate
421 * @return True if phase passes (ring proportions are consistent)
422 */
423 static bool checkRadialConsistencyPhase5RingProportionValidation(const unsigned int xCenter, const unsigned int yCenter, const unsigned int numberDiameters, const Diameters& diameters);
424
425 /**
426 * Computes the arithmetic mean of a vector of scalar values.
427 * @param values The scalar values, must not be empty
428 * @return The arithmetic mean
429 */
430 static Scalar computeMean(const Scalars& values);
431
432 /**
433 * Computes the standard deviation of a vector of scalar values.
434 * @param values The scalar values, must not be empty
435 * @param mean The pre-computed mean of the values
436 * @return The standard deviation
437 */
438 static Scalar computeStddev(const Scalars& values, const Scalar mean);
439
440 /**
441 * Finds the minimum value in a vector of scalar values.
442 * @param values The scalar values, must not be empty
443 * @return The minimum value
444 */
445 static Scalar findMin(const Scalars& values);
446};
447
448} // namespace Bullseyes
449
450} // namespace Detector
451
452} // namespace CV
453
454} // namespace Ocean
455
456#endif // OCEAN_CV_DETECTOR_BULLSEYES_BULLSEYEDETECTORMONO_H
This class holds the most important parameters for the detector.
Definition BullseyeDetectorMono.h:71
bool isValid() const noexcept
Returns whether the parameters are valid.
Parameters()=default
Creates a new valid parameter object.
Implementation of a monocular detector for the bullseye pattern.
Definition BullseyeDetectorMono.h:36
Structure to hold a single half-ray result from radial consistency checking.
Definition Bullseye.h:35
This class implements Ocean's image class.
Definition Frame.h:1879
This class implements a recursive lock object.
Definition Lock.h:31
This class implements a worker able to distribute function calls over different threads.
Definition Worker.h:33
float Scalar
Definition of a scalar type.
Definition Math.h:129
std::vector< Scalar > Scalars
Definition of a vector holding Scalar objects.
Definition Math.h:145
std::vector< Bullseye > Bullseyes
Definition of a vector holding bullseyes.
Definition Bullseye.h:245
std::vector< Diameter > Diameters
Definition of a vector holding diameters.
Definition Bullseye.h:124
The namespace covering the entire Ocean framework.
Definition Accessor.h:15