8#ifndef META_OCEAN_CV_CALIBRATION_POINT_DETECTOR_H
9#define META_OCEAN_CV_CALIBRATION_POINT_DETECTOR_H
67 PointPattern(
const unsigned int radius,
const unsigned int innerRadius,
const unsigned int frameStrideElements,
const bool useCircle =
true);
73 inline unsigned int radius()
const;
79 inline unsigned int diameter()
const;
85 inline unsigned int innerRadius()
const;
91 inline unsigned int frameStrideElements()
const;
97 inline bool isCircle()
const;
103 inline unsigned int negativeOffset()
const;
109 inline const Indices32& positiveOffsets()
const;
123 inline float normalizedStrength(
const unsigned int strength)
const;
128 template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
129 inline uint32_t determineDarkPointStrength(
const uint8_t centerPixelValue,
const uint8_t* firstSurroundingPixel,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
134 template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
135 inline uint32_t determineDarkPointStrength(
const uint8_t* yPoint,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
140 template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
141 inline uint32_t determineBrightPointStrength(
const uint8_t centerPixelValue,
const uint8_t* firstSurroundingPixel,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
146 template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
147 inline uint32_t determineBrightPointStrength(
const uint8_t* yPoint,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
163 inline bool isValid()
const;
182 unsigned int radius_ = 0u;
185 unsigned int innerRadius_ = 0u;
188 unsigned int frameStrideElements_ = 0u;
191 bool isCircle_ =
false;
200 float strengthNormalization_ = 0.0f;
220 template <
unsigned int tNumber>
243 inline const Points& points()
const;
272 template <
unsigned int tNumber,
bool tMatchSign>
313 static bool detectPoints(
const Frame& yFrame,
const PointPatterns& pointPatterns,
const unsigned int minDifference,
const unsigned int maxVariance,
Points& points,
const bool suppressNonMaximum,
const unsigned int detectionScaleSteps = 2u,
Worker* worker =
nullptr);
318 template <
bool tDarkPo
int>
324 template <
bool tDarkPo
int,
bool tUseMask>
325 static void detectPointCandidatesSubset(
const uint8_t* yFrame,
const unsigned int yFramePaddingElements,
const uint8_t* mask,
const PointPattern* pointPatterns,
const uint8_t minDifference,
const unsigned int maxVariance,
CV::NonMaximumSuppression<uint32_t>* nonMaximumSuppression,
const unsigned int firstColumn,
const unsigned int numberColumns,
const unsigned int firstRow,
const unsigned int numberRows);
330 template <
bool tDarkPo
int>
331 static bool determinePointRadius(
const uint8_t* yFrame,
const unsigned int width,
const unsigned int height,
const unsigned int yFramePaddingElements,
const CV::PixelPosition& pixelPosition,
const unsigned int currentRadius,
const PointPattern* pointPatterns,
const size_t numberPointPatterns,
const uint8_t minDifference,
const unsigned int maxVariance,
unsigned int& radius,
unsigned int& strength);
392 unsigned int minDifference_ = 5u;
395 unsigned int maxDeviation_ = 30u;
416 static constexpr unsigned int pointPatternImageSize_ = 31u;
426 ocean_assert(isValid());
427 return radius_ * 2u + 1u;
437 return frameStrideElements_;
447 return negativeOffset_;
452 return positiveOffsets_;
462 ocean_assert(strengthNormalization_ != 0.0f);
464 return float(strength) * strengthNormalization_;
467template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
470 ocean_assert(isValid());
471 ocean_assert(firstSurroundingPixel !=
nullptr);
473 static_assert(tMinSurroundingColorFixed < tMaxCenterColorFixed);
475 if (centerPixelValue > tMaxCenterColorFixed)
480 ocean_assert(centerPixelValue + minDifference <= 0xFFu);
481 const uint8_t minSurroundingColor = std::max(tMinSurroundingColorFixed, uint8_t(centerPixelValue + minDifference));
483 uint32_t sumSqrDifferences = 0u;
485 const uint8_t* surroundingPixel = firstSurroundingPixel;
489 for (
const Index32& positiveOffset : positiveOffsets_)
491 surroundingPixel += positiveOffset;
493 const uint8_t surroundingPixelValue = *surroundingPixel;
495 if (surroundingPixelValue < minSurroundingColor)
500 variance.
add(uint32_t(surroundingPixelValue));
502 ocean_assert(surroundingPixelValue > centerPixelValue);
504 const uint32_t difference = surroundingPixelValue - centerPixelValue;
506 sumSqrDifferences += difference * difference;
509 if (sumSqrDifferences != 0u && (maxVariance == 0u || variance.
variance() <= maxVariance))
511 return sumSqrDifferences;
517template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
520 ocean_assert(yPoint !=
nullptr);
522 const uint8_t centerPixelValue = *yPoint;
524 return determineDarkPointStrength<tMaxCenterColorFixed, tMinSurroundingColorFixed>(centerPixelValue, yPoint - negativeOffset_, minDifference, maxVariance);
527template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
530 ocean_assert(isValid());
531 ocean_assert(firstSurroundingPixel !=
nullptr);
533 static_assert(tMinCenterColorFixed < tMaxSurroundingColorFixed);
535 if (centerPixelValue < tMinCenterColorFixed)
540 ocean_assert(int32_t(centerPixelValue) - int32_t(minDifference) >= 0);
541 const uint8_t maxSurroundingColor = std::min(tMaxSurroundingColorFixed, uint8_t(centerPixelValue - minDifference));
543 uint32_t sumSqrDifferences = 0u;
545 const uint8_t* surroundingPixel = firstSurroundingPixel;
549 for (
const Index32& positiveOffset : positiveOffsets_)
551 surroundingPixel += positiveOffset;
553 const uint8_t surroundingPixelValue = *surroundingPixel;
555 if (surroundingPixelValue > maxSurroundingColor)
560 variance.
add(uint32_t(surroundingPixelValue));
562 ocean_assert(surroundingPixelValue < centerPixelValue);
564 const uint32_t difference = centerPixelValue - surroundingPixelValue;
566 sumSqrDifferences += difference * difference;
569 if (sumSqrDifferences != 0u && (maxVariance == 0u || variance.
variance() <= maxVariance))
571 return sumSqrDifferences;
577template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
580 ocean_assert(yPoint !=
nullptr);
582 const uint8_t centerPixelValue = *yPoint;
584 return determineBrightPointStrength<tMinCenterColorFixed, tMaxSurroundingColorFixed>(centerPixelValue, yPoint - negativeOffset_, minDifference, maxVariance);
589 ocean_assert(radius_ == 0u || innerRadius_ < radius_);
590 ocean_assert(radius_ == 0u || frameStrideElements_ != 0u);
592 return radius_ >= 1u;
595template <
unsigned int tNumber,
bool tMatchSign>
598 static_assert(tNumber >= 1u,
"Invalid number of points!");
600 ocean_assert(indexDistancePairs.
empty());
601 ocean_assert(queryPointIndex <
points.size());
603 const Vector2& point =
points[queryPointIndex].observation();
614 for (
const Index32& index : indices)
616 if (index ==
Index32(queryPointIndex))
621 if constexpr (tMatchSign)
623 if (
points[queryPointIndex].sign() !=
points[index].sign())
636 bool inserted =
false;
640 for (
size_t nCandidate = 0; nCandidate < indexDistancePairs.
size(); ++nCandidate)
642 if (
sqrDistance < indexDistancePairs[nCandidate].second)
644 if (indexDistancePairs.
size() != tNumber)
649 for (
size_t n = indexDistancePairs.
size() - 1; n > nCandidate; --n)
651 indexDistancePairs[n] = indexDistancePairs[n - 1];
663 if (!inserted && indexDistancePairs.
size() < tNumber)
This class implements debug elements for the calibration library.
Definition CalibrationDebugElements.h:41
This class implements a pattern for fast point detection.
Definition PointDetector.h:50
unsigned int radius_
The radius of the point this pattern is able to detect.
Definition PointDetector.h:182
uint32_t determineDarkPointStrength(const uint8_t centerPixelValue, const uint8_t *firstSurroundingPixel, const unsigned int minDifference, const unsigned int maxVariance=0u) const
TODO
Definition PointDetector.h:468
CV::PixelPositionsI offsets_
The offsets of this pattern for all surrounding pixels.
Definition PointDetector.h:203
const Indices32 & positiveOffsets() const
Returns the positive offsets for all surrounding pixels starting at the top-left pixel,...
Definition PointDetector.h:450
Indices32 positiveOffsets_
The positive offsets for all surrounding pixels starting at the top-left pixel, all in relation to th...
Definition PointDetector.h:197
float normalizedStrength(const unsigned int strength) const
Returns the normalized strength of a determined strength for this pattern.
Definition PointDetector.h:460
PointPattern(const unsigned int radius, const unsigned int innerRadius, const unsigned int frameStrideElements, const bool useCircle=true)
Creates a new point pattern.
unsigned int radius() const
Returns the radius of the point this pattern is able to detect.
Definition PointDetector.h:419
unsigned int diameter() const
Returns the diameter of the point this pattern is able to detect.
Definition PointDetector.h:424
unsigned int negativeOffset() const
Returns the negative offset for the most top-left pixel of the surrounding pixels.
Definition PointDetector.h:445
bool isValid() const
Returns whether this pattern is valid.
Definition PointDetector.h:587
unsigned int frameStrideElements() const
Returns the stride of the frame which which this pattern has been created.
Definition PointDetector.h:435
uint32_t determineBrightPointStrength(const uint8_t centerPixelValue, const uint8_t *firstSurroundingPixel, const unsigned int minDifference, const unsigned int maxVariance=0u) const
TODO
Definition PointDetector.h:528
unsigned int innerRadius() const
Returns the inner radius of this pattern.
Definition PointDetector.h:430
PointPattern(const PointPattern &pointPattern, const unsigned int frameStrideElements)
Creates a new point pattern with same properties as a given point pattern but with different frame st...
bool determinePointStrength(const Frame &yFrame, const CV::PixelPosition &observation, int32_t &strength, bool &strict) const
TODO
bool isCircle() const
Returns whether the outer shape of this pattern is a circle or a rectangle.
Definition PointDetector.h:440
const CV::PixelPositionsI & offsets() const
Returns the 2D offsets for all surrounding pixels.
Definition PointDetector.h:455
static bool determineOffsets(const unsigned int radius, const unsigned int innerRadius, const unsigned int frameStrideElements, const bool useCircle, Index32 &negativeOffset, Indices32 &positiveOffsets, CV::PixelPositionsI *offsets=nullptr)
Determines the offsets for all surrounding pixels.
bool determinePointStrength(const Frame &yFrame, const Vector2 &observation, int32_t &strength, bool &strict) const
TODO
This class implements a point detector for marker points.
Definition PointDetector.h:39
std::vector< PointPattern > PointPatterns
Definition of a vector holding point patterns.
Definition PointDetector.h:209
Points points_
The precise points detected in the latest frame.
Definition PointDetector.h:407
static void removeDuplicatedPoints(const unsigned int width, const unsigned int height, Points &points, const Scalar maxDistance)
Removes duplicated points from a given set of points.
PointDetector()=default
Creates a new point detector.
Points roughPoints_
Rough intermediate points.
Definition PointDetector.h:404
Geometry::SpatialDistribution::DistributionArray pointsDistributionArray_
The spatial distribution array of the points detected in the latest frame.
Definition PointDetector.h:410
std::pair< Index32, Scalar > IndexDistancePair
Definition of a pair combining an index with a distance.
Definition PointDetector.h:214
Frame yPointPatternImages_
The frame with all images of point pattern with individual radii.
Definition PointDetector.h:413
static void updatePointPatterns(PointPatterns &pointPatterns, const unsigned int frameStrideElements)
Updates the point patterns for a specified frame stride.
static bool closestPoints(const Vector2 &queryPoint, const Geometry::SpatialDistribution::DistributionArray &pointsDistributionArray, const Points &points, const Scalar maxSqrDistance, Indices32 &pointIndices)
Returns the closest points to a query point.
static bool hasClosePoint(const Vector2 &queryPoint, const Geometry::SpatialDistribution::DistributionArray &pointsDistributionArray, const Points &points, const Scalar maxSqrDistance)
Returns whether a query point is close to another point.
static bool detectPoints(const Frame &yFrame, const PointPatterns &pointPatterns, const unsigned int minDifference, const unsigned int maxVariance, Points &points, const bool suppressNonMaximum, const unsigned int detectionScaleSteps=2u, Worker *worker=nullptr)
Detects points with several point patterns.
bool detectPoints(const Frame &yFrame, Worker *worker=nullptr)
Detects points in a new frame.
static void detectPointCandidates(const uint8_t *yFrame, const unsigned int yFramePaddingElements, const uint8_t *mask, const PointPattern &pointPattern, const uint8_t minDifference, const unsigned int maxVariance, CV::NonMaximumSuppression< uint32_t > &nonMaximumSuppression, Worker *worker=nullptr)
TODO
static size_t closestPoint(const Vector2 &queryPoint, const bool sign, const Geometry::SpatialDistribution::DistributionArray &pointsDistributionArray, const Points &points, const Scalar maxSqrDistance)
Returns the closest point to a given point.
bool optimizePoints(const Frame &yFrame, const Points &points, const PointPatterns &pointPatterns, Points &optimizedPoints, Worker *worker=nullptr) const
Optimizes the position of detected points and removes outliers.
const Geometry::SpatialDistribution::DistributionArray & pointsDistributionArray() const
Returns the spatial distribution array of the points detected in the latest frame.
Definition PointDetector.h:677
static bool determinePointRadius(const uint8_t *yFrame, const unsigned int width, const unsigned int height, const unsigned int yFramePaddingElements, const CV::PixelPosition &pixelPosition, const unsigned int currentRadius, const PointPattern *pointPatterns, const size_t numberPointPatterns, const uint8_t minDifference, const unsigned int maxVariance, unsigned int &radius, unsigned int &strength)
TODO
const Points & points() const
Returns the points detected in the latest frame.
Definition PointDetector.h:672
static void detectPointCandidatesSubset(const uint8_t *yFrame, const unsigned int yFramePaddingElements, const uint8_t *mask, const PointPattern *pointPatterns, const uint8_t minDifference, const unsigned int maxVariance, CV::NonMaximumSuppression< uint32_t > *nonMaximumSuppression, const unsigned int firstColumn, const unsigned int numberColumns, const unsigned int firstRow, const unsigned int numberRows)
TODO
static PointPatterns createPointPatterns(const unsigned int radius, const unsigned int innerRadius, const bool useCircle, const unsigned int frameStrideElements)
Creates the point patterns with increasing radii.
static bool closestPoints(const Vector2 &queryPoint, const Geometry::SpatialDistribution::DistributionArray &pointsDistributionArray, const Points &points, Index32 &closestPointIndex, Index32 &secondClosestPointIndex, Scalar &closestSqrDistance, Scalar &secondClosestSqrDistance)
Returns the two closest points to a given point.
PointDetector::PointPatterns pointPatterns_
The point patterns to be used for point detection.
Definition PointDetector.h:401
static bool paintPointPattern(Frame &yFrame, const unsigned int radius, const uint8_t pointColor=0x00u)
Paints a point pattern into a frame.
static void closestPoints(const Geometry::SpatialDistribution::DistributionArray &pointsDistributionArray, const size_t queryPointIndex, const Points &points, IndexDistancePairs< tNumber > &indexDistancePairs, const Scalar maxSqrDistance)
Returns the closest points to a given point.
Definition PointDetector.h:596
This class implements the possibility to find local maximum in a 2D array by applying a non-maximum-s...
Definition NonMaximumSuppression.h:42
This class implements Ocean's image class.
Definition Frame.h:1808
unsigned int horizontalBins() const
Returns the number of horizontal distribution bins.
Definition SpatialDistribution.h:1078
int horizontalBin(const Scalar x) const
Returns the horizontal bin of a given horizontal position.
Definition SpatialDistribution.h:1104
int verticalBin(const Scalar y) const
Returns the vertical bin of a given vertical position.
Definition SpatialDistribution.h:1110
unsigned int verticalBins() const
Returns the number of vertical distribution bins.
Definition SpatialDistribution.h:1083
This class implements a distribution array.
Definition SpatialDistribution.h:228
This class implements a static vector that has a fixed capacity.
Definition StaticVector.h:25
size_t size() const
Returns the size of this vector.
Definition StaticVector.h:340
void weakResize(const size_t size)
Resizes this vector.
Definition StaticVector.h:534
bool empty() const
Returns whether this vector hold no element.
Definition StaticVector.h:487
void pushBack(const T &value)
Adds a new element to this vector.
Definition StaticVector.h:352
const T & back() const
Returns the last elements of this vector.
Definition StaticVector.h:471
This class allows to determine the variance in a given data set.
Definition Variance.h:56
void add(const T &value)
Adds a new value.
Definition Variance.h:148
T variance() const
Returns the variance of the data set.
Definition Variance.h:200
const T & x() const noexcept
Returns the x value.
Definition Vector2.h:710
const T & y() const noexcept
Returns the y value.
Definition Vector2.h:722
T sqrDistance(const VectorT2< T > &right) const
Returns the square distance between this 2D position and a second 2D position.
Definition Vector2.h:645
This class implements a worker able to distribute function calls over different threads.
Definition Worker.h:33
unsigned int sqrDistance(const char first, const char second)
Returns the square distance between two values.
Definition base/Utilities.h:1113
std::vector< Index32 > Indices32
Definition of a vector holding 32 bit index values.
Definition Base.h:96
uint32_t Index32
Definition of a 32 bit index value.
Definition Base.h:84
std::vector< PixelPositionI > PixelPositionsI
Definition of a vector holding pixel positions (with positive and negative coordinate values).
Definition PixelPosition.h:53
std::vector< Point > Points
Definition of a vector holding points.
Definition cv/calibration/Point.h:31
float Scalar
Definition of a scalar type.
Definition Math.h:129
The namespace covering the entire Ocean framework.
Definition Accessor.h:15