8#ifndef META_OCEAN_CV_CALIBRATION_LEGACY_POINT_DETECTOR_H
9#define META_OCEAN_CV_CALIBRATION_LEGACY_POINT_DETECTOR_H
53 template <
unsigned int tNumber>
81 PointPattern(
const unsigned int radius,
const unsigned int innerRadius,
const unsigned int frameStrideElements,
const bool useCircle =
true);
87 inline unsigned int radius()
const;
93 inline unsigned int diameter()
const;
99 inline unsigned int innerRadius()
const;
105 inline unsigned int frameStrideElements()
const;
111 inline bool isCircle()
const;
117 inline unsigned int negativeOffset()
const;
123 inline const Indices32& positiveOffsets()
const;
137 inline float normalizedStrength(
const unsigned int strength)
const;
150 template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
151 inline uint32_t determineDarkPointStrength(
const uint8_t centerPixelValue,
const uint8_t* firstSurroundingPixel,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
163 template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
164 inline uint32_t determineDarkPointStrength(
const uint8_t* yPoint,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
177 template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
178 inline uint32_t determineBrightPointStrength(
const uint8_t centerPixelValue,
const uint8_t* firstSurroundingPixel,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
190 template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
191 inline uint32_t determineBrightPointStrength(
const uint8_t* yPoint,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
208 inline bool isValid()
const;
227 unsigned int radius_ = 0u;
230 unsigned int innerRadius_ = 0u;
233 unsigned int frameStrideElements_ = 0u;
236 bool isCircle_ =
false;
245 float strengthNormalization_ = 0.0f;
276 inline const Points& points()
const;
305 template <
unsigned int tNumber,
bool tMatchSign>
346 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);
360 template <
bool tDarkPo
int>
379 template <
bool tDarkPo
int,
bool tUseMask>
380 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::NonMaximumSuppressionT<uint32_t>* nonMaximumSuppression,
const unsigned int firstColumn,
const unsigned int numberColumns,
const unsigned int firstRow,
const unsigned int numberRows);
399 template <
bool tDarkPo
int>
400 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);
461 unsigned int minDifference_ = 5u;
464 unsigned int maxDeviation_ = 30u;
485 static constexpr unsigned int pointPatternImageSize_ = 31u;
495 ocean_assert(isValid());
496 return radius_ * 2u + 1u;
506 return frameStrideElements_;
516 return negativeOffset_;
521 return positiveOffsets_;
531 ocean_assert(strengthNormalization_ != 0.0f);
533 return float(strength) * strengthNormalization_;
536template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
539 ocean_assert(isValid());
540 ocean_assert(firstSurroundingPixel !=
nullptr);
542 static_assert(tMinSurroundingColorFixed < tMaxCenterColorFixed);
544 if (centerPixelValue > tMaxCenterColorFixed)
549 ocean_assert(centerPixelValue + minDifference <= 0xFFu);
550 const uint8_t minSurroundingColor = std::max(tMinSurroundingColorFixed, uint8_t(centerPixelValue + minDifference));
552 uint32_t sumSqrDifferences = 0u;
554 const uint8_t* surroundingPixel = firstSurroundingPixel;
558 for (
const Index32& positiveOffset : positiveOffsets_)
560 surroundingPixel += positiveOffset;
562 const uint8_t surroundingPixelValue = *surroundingPixel;
564 if (surroundingPixelValue < minSurroundingColor)
569 variance.
add(uint32_t(surroundingPixelValue));
571 ocean_assert(surroundingPixelValue > centerPixelValue);
573 const uint32_t difference = surroundingPixelValue - centerPixelValue;
575 sumSqrDifferences += difference * difference;
578 if (sumSqrDifferences != 0u && (maxVariance == 0u || variance.
variance() <= maxVariance))
580 return sumSqrDifferences;
586template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
589 ocean_assert(yPoint !=
nullptr);
591 const uint8_t centerPixelValue = *yPoint;
593 return determineDarkPointStrength<tMaxCenterColorFixed, tMinSurroundingColorFixed>(centerPixelValue, yPoint - negativeOffset_, minDifference, maxVariance);
596template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
599 ocean_assert(isValid());
600 ocean_assert(firstSurroundingPixel !=
nullptr);
602 static_assert(tMinCenterColorFixed < tMaxSurroundingColorFixed);
604 if (centerPixelValue < tMinCenterColorFixed)
609 ocean_assert(int32_t(centerPixelValue) - int32_t(minDifference) >= 0);
610 const uint8_t maxSurroundingColor = std::min(tMaxSurroundingColorFixed, uint8_t(centerPixelValue - minDifference));
612 uint32_t sumSqrDifferences = 0u;
614 const uint8_t* surroundingPixel = firstSurroundingPixel;
618 for (
const Index32& positiveOffset : positiveOffsets_)
620 surroundingPixel += positiveOffset;
622 const uint8_t surroundingPixelValue = *surroundingPixel;
624 if (surroundingPixelValue > maxSurroundingColor)
629 variance.
add(uint32_t(surroundingPixelValue));
631 ocean_assert(surroundingPixelValue < centerPixelValue);
633 const uint32_t difference = centerPixelValue - surroundingPixelValue;
635 sumSqrDifferences += difference * difference;
638 if (sumSqrDifferences != 0u && (maxVariance == 0u || variance.
variance() <= maxVariance))
640 return sumSqrDifferences;
646template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
649 ocean_assert(yPoint !=
nullptr);
651 const uint8_t centerPixelValue = *yPoint;
653 return determineBrightPointStrength<tMinCenterColorFixed, tMaxSurroundingColorFixed>(centerPixelValue, yPoint - negativeOffset_, minDifference, maxVariance);
658 ocean_assert(radius_ == 0u || innerRadius_ < radius_);
659 ocean_assert(radius_ == 0u || frameStrideElements_ != 0u);
661 return radius_ >= 1u;
664template <
unsigned int tNumber,
bool tMatchSign>
667 static_assert(tNumber >= 1u,
"Invalid number of points!");
669 ocean_assert(indexDistancePairs.
empty());
670 ocean_assert(queryPointIndex <
points.size());
672 const Vector2& point =
points[queryPointIndex].observation();
683 for (
const Index32& index : indices)
685 if (index ==
Index32(queryPointIndex))
690 if constexpr (tMatchSign)
692 if (
points[queryPointIndex].sign() !=
points[index].sign())
705 bool inserted =
false;
709 for (
size_t nCandidate = 0; nCandidate < indexDistancePairs.
size(); ++nCandidate)
711 if (
sqrDistance < indexDistancePairs[nCandidate].second)
713 if (indexDistancePairs.
size() != tNumber)
718 for (
size_t n = indexDistancePairs.
size() - 1; n > nCandidate; --n)
720 indexDistancePairs[n] = indexDistancePairs[n - 1];
732 if (!inserted && indexDistancePairs.
size() < tNumber)
This class implements debug elements for the calibration library.
Definition CalibrationDebugElements.h:43
This class implements a pattern for fast point detection.
Definition LegacyPointDetector.h:64
const CV::PixelPositionsI & offsets() const
Returns the 2D offsets for all surrounding pixels.
Definition LegacyPointDetector.h:524
PointPattern(const unsigned int radius, const unsigned int innerRadius, const unsigned int frameStrideElements, const bool useCircle=true)
Creates a new point pattern.
bool determinePointStrength(const Frame &yFrame, const Vector2 &observation, int32_t &strength, bool &strict) const
Determines the strength of a point at a sub-pixel position using bilinear interpolation.
const Indices32 & positiveOffsets() const
Returns the positive offsets for all surrounding pixels starting at the top-left pixel,...
Definition LegacyPointDetector.h:519
unsigned int frameStrideElements() const
Returns the stride of the frame which which this pattern has been created.
Definition LegacyPointDetector.h:504
unsigned int radius_
The radius of the point this pattern is able to detect.
Definition LegacyPointDetector.h:227
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.
unsigned int diameter() const
Returns the diameter of the point this pattern is able to detect.
Definition LegacyPointDetector.h:493
unsigned int negativeOffset() const
Returns the negative offset for the most top-left pixel of the surrounding pixels.
Definition LegacyPointDetector.h:514
unsigned int radius() const
Returns the radius of the point this pattern is able to detect.
Definition LegacyPointDetector.h:488
uint32_t determineBrightPointStrength(const uint8_t centerPixelValue, const uint8_t *firstSurroundingPixel, const unsigned int minDifference, const unsigned int maxVariance=0u) const
Determines the strength of a bright point candidate.
Definition LegacyPointDetector.h:597
unsigned int innerRadius() const
Returns the inner radius of this pattern.
Definition LegacyPointDetector.h:499
Indices32 positiveOffsets_
The positive offsets for all surrounding pixels starting at the top-left pixel, all in relation to th...
Definition LegacyPointDetector.h:242
uint32_t determineDarkPointStrength(const uint8_t centerPixelValue, const uint8_t *firstSurroundingPixel, const unsigned int minDifference, const unsigned int maxVariance=0u) const
Determines the strength of a dark point candidate.
Definition LegacyPointDetector.h:537
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...
CV::PixelPositionsI offsets_
The offsets of this pattern for all surrounding pixels.
Definition LegacyPointDetector.h:248
bool isValid() const
Returns whether this pattern is valid.
Definition LegacyPointDetector.h:656
bool isCircle() const
Returns whether the outer shape of this pattern is a circle or a rectangle.
Definition LegacyPointDetector.h:509
float normalizedStrength(const unsigned int strength) const
Returns the normalized strength of a determined strength for this pattern.
Definition LegacyPointDetector.h:529
This class implements a point detector for marker points.
Definition LegacyPointDetector.h:39
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)
Determines the best matching radius for a detected point by testing smaller point patterns.
std::pair< Index32, Scalar > IndexDistancePair
Definition of a pair combining an index with a distance.
Definition LegacyPointDetector.h:47
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 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.
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.
Frame yPointPatternImages_
The frame with all images of point pattern with individual radii.
Definition LegacyPointDetector.h:482
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.
const Points & points() const
Returns the points detected in the latest frame.
Definition LegacyPointDetector.h:741
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.
Points roughPoints_
Rough intermediate points.
Definition LegacyPointDetector.h:473
const Geometry::SpatialDistribution::DistributionArray & pointsDistributionArray() const
Returns the spatial distribution array of the points detected in the latest frame.
Definition LegacyPointDetector.h:746
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::NonMaximumSuppressionT< uint32_t > &nonMaximumSuppression, Worker *worker=nullptr)
Detects point candidates in a frame and adds them to a non-maximum suppression object.
Points points_
The precise points detected in the latest frame.
Definition LegacyPointDetector.h:476
static void updatePointPatterns(PointPatterns &pointPatterns, const unsigned int frameStrideElements)
Updates the point patterns for a specified frame stride.
LegacyPointDetector::PointPatterns pointPatterns_
The point patterns to be used for point detection.
Definition LegacyPointDetector.h:470
static bool paintPointPattern(Frame &yFrame, const unsigned int radius, const uint8_t pointColor=0x00u)
Paints a point pattern into a frame.
std::vector< PointPattern > PointPatterns
Definition of a vector holding point patterns.
Definition LegacyPointDetector.h:254
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.
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 LegacyPointDetector.h:665
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.
bool detectPoints(const Frame &yFrame, Worker *worker=nullptr)
Detects points in a new frame.
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::NonMaximumSuppressionT< uint32_t > *nonMaximumSuppression, const unsigned int firstColumn, const unsigned int numberColumns, const unsigned int firstRow, const unsigned int numberRows)
Detects point candidates in a subset of rows (worker function for parallel execution).
LegacyPointDetector()=default
Creates a new point detector.
Geometry::SpatialDistribution::DistributionArray pointsDistributionArray_
The spatial distribution array of the points detected in the latest frame.
Definition LegacyPointDetector.h:479
This class implements the possibility to find local maximum in a 2D array by applying a non-maximum-s...
Definition NonMaximumSuppression.h:138
This class implements Ocean's image class.
Definition Frame.h:1879
unsigned int horizontalBins() const
Returns the number of horizontal distribution bins.
Definition SpatialDistribution.h:1122
int horizontalBin(const Scalar x) const
Returns the horizontal bin of a given horizontal position.
Definition SpatialDistribution.h:1148
int verticalBin(const Scalar y) const
Returns the vertical bin of a given vertical position.
Definition SpatialDistribution.h:1154
unsigned int verticalBins() const
Returns the number of vertical distribution bins.
Definition SpatialDistribution.h:1127
This class implements a distribution array.
Definition SpatialDistribution.h:272
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:390
void weakResize(const size_t size)
Resizes this vector.
Definition StaticVector.h:645
bool empty() const
Returns whether this vector hold no element.
Definition StaticVector.h:584
void pushBack(const T &value)
Adds a new element to this vector.
Definition StaticVector.h:402
const T & back() const
Returns the last elements of this vector.
Definition StaticVector.h:544
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:1159
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