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;
136 template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
137 inline uint32_t determineDarkPointStrength(
const uint8_t centerPixelValue,
const uint8_t* firstSurroundingPixel,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
149 template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
150 inline uint32_t determineDarkPointStrength(
const uint8_t* yPoint,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
163 template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
164 inline uint32_t determineBrightPointStrength(
const uint8_t centerPixelValue,
const uint8_t* firstSurroundingPixel,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
176 template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
177 inline uint32_t determineBrightPointStrength(
const uint8_t* yPoint,
const unsigned int minDifference,
const unsigned int maxVariance = 0u)
const;
194 inline bool isValid()
const;
213 unsigned int radius_ = 0u;
216 unsigned int innerRadius_ = 0u;
219 unsigned int frameStrideElements_ = 0u;
222 bool isCircle_ =
false;
231 float strengthNormalization_ = 0.0f;
251 template <
unsigned int tNumber>
274 inline const Points& points()
const;
303 template <
unsigned int tNumber,
bool tMatchSign>
344 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);
358 template <
bool tDarkPo
int>
377 template <
bool tDarkPo
int,
bool tUseMask>
378 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);
397 template <
bool tDarkPo
int>
398 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);
459 unsigned int minDifference_ = 5u;
462 unsigned int maxDeviation_ = 30u;
483 static constexpr unsigned int pointPatternImageSize_ = 31u;
493 ocean_assert(isValid());
494 return radius_ * 2u + 1u;
504 return frameStrideElements_;
514 return negativeOffset_;
519 return positiveOffsets_;
529 ocean_assert(strengthNormalization_ != 0.0f);
531 return float(strength) * strengthNormalization_;
534template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
537 ocean_assert(isValid());
538 ocean_assert(firstSurroundingPixel !=
nullptr);
540 static_assert(tMinSurroundingColorFixed < tMaxCenterColorFixed);
542 if (centerPixelValue > tMaxCenterColorFixed)
547 ocean_assert(centerPixelValue + minDifference <= 0xFFu);
548 const uint8_t minSurroundingColor = std::max(tMinSurroundingColorFixed, uint8_t(centerPixelValue + minDifference));
550 uint32_t sumSqrDifferences = 0u;
552 const uint8_t* surroundingPixel = firstSurroundingPixel;
556 for (
const Index32& positiveOffset : positiveOffsets_)
558 surroundingPixel += positiveOffset;
560 const uint8_t surroundingPixelValue = *surroundingPixel;
562 if (surroundingPixelValue < minSurroundingColor)
567 variance.
add(uint32_t(surroundingPixelValue));
569 ocean_assert(surroundingPixelValue > centerPixelValue);
571 const uint32_t difference = surroundingPixelValue - centerPixelValue;
573 sumSqrDifferences += difference * difference;
576 if (sumSqrDifferences != 0u && (maxVariance == 0u || variance.
variance() <= maxVariance))
578 return sumSqrDifferences;
584template <u
int8_t tMaxCenterColorFixed, u
int8_t tMinSurroundingColorFixed>
587 ocean_assert(yPoint !=
nullptr);
589 const uint8_t centerPixelValue = *yPoint;
591 return determineDarkPointStrength<tMaxCenterColorFixed, tMinSurroundingColorFixed>(centerPixelValue, yPoint - negativeOffset_, minDifference, maxVariance);
594template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
597 ocean_assert(isValid());
598 ocean_assert(firstSurroundingPixel !=
nullptr);
600 static_assert(tMinCenterColorFixed < tMaxSurroundingColorFixed);
602 if (centerPixelValue < tMinCenterColorFixed)
607 ocean_assert(int32_t(centerPixelValue) - int32_t(minDifference) >= 0);
608 const uint8_t maxSurroundingColor = std::min(tMaxSurroundingColorFixed, uint8_t(centerPixelValue - minDifference));
610 uint32_t sumSqrDifferences = 0u;
612 const uint8_t* surroundingPixel = firstSurroundingPixel;
616 for (
const Index32& positiveOffset : positiveOffsets_)
618 surroundingPixel += positiveOffset;
620 const uint8_t surroundingPixelValue = *surroundingPixel;
622 if (surroundingPixelValue > maxSurroundingColor)
627 variance.
add(uint32_t(surroundingPixelValue));
629 ocean_assert(surroundingPixelValue < centerPixelValue);
631 const uint32_t difference = centerPixelValue - surroundingPixelValue;
633 sumSqrDifferences += difference * difference;
636 if (sumSqrDifferences != 0u && (maxVariance == 0u || variance.
variance() <= maxVariance))
638 return sumSqrDifferences;
644template <u
int8_t tMinCenterColorFixed, u
int8_t tMaxSurroundingColorFixed>
647 ocean_assert(yPoint !=
nullptr);
649 const uint8_t centerPixelValue = *yPoint;
651 return determineBrightPointStrength<tMinCenterColorFixed, tMaxSurroundingColorFixed>(centerPixelValue, yPoint - negativeOffset_, minDifference, maxVariance);
656 ocean_assert(radius_ == 0u || innerRadius_ < radius_);
657 ocean_assert(radius_ == 0u || frameStrideElements_ != 0u);
659 return radius_ >= 1u;
662template <
unsigned int tNumber,
bool tMatchSign>
665 static_assert(tNumber >= 1u,
"Invalid number of points!");
667 ocean_assert(indexDistancePairs.
empty());
668 ocean_assert(queryPointIndex <
points.size());
670 const Vector2& point =
points[queryPointIndex].observation();
681 for (
const Index32& index : indices)
683 if (index ==
Index32(queryPointIndex))
688 if constexpr (tMatchSign)
690 if (
points[queryPointIndex].sign() !=
points[index].sign())
703 bool inserted =
false;
707 for (
size_t nCandidate = 0; nCandidate < indexDistancePairs.
size(); ++nCandidate)
709 if (
sqrDistance < indexDistancePairs[nCandidate].second)
711 if (indexDistancePairs.
size() != tNumber)
716 for (
size_t n = indexDistancePairs.
size() - 1; n > nCandidate; --n)
718 indexDistancePairs[n] = indexDistancePairs[n - 1];
730 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:213
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 PointDetector.h:535
CV::PixelPositionsI offsets_
The offsets of this pattern for all surrounding pixels.
Definition PointDetector.h:234
const Indices32 & positiveOffsets() const
Returns the positive offsets for all surrounding pixels starting at the top-left pixel,...
Definition PointDetector.h:517
Indices32 positiveOffsets_
The positive offsets for all surrounding pixels starting at the top-left pixel, all in relation to th...
Definition PointDetector.h:228
float normalizedStrength(const unsigned int strength) const
Returns the normalized strength of a determined strength for this pattern.
Definition PointDetector.h:527
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:486
unsigned int diameter() const
Returns the diameter of the point this pattern is able to detect.
Definition PointDetector.h:491
unsigned int negativeOffset() const
Returns the negative offset for the most top-left pixel of the surrounding pixels.
Definition PointDetector.h:512
bool isValid() const
Returns whether this pattern is valid.
Definition PointDetector.h:654
unsigned int frameStrideElements() const
Returns the stride of the frame which which this pattern has been created.
Definition PointDetector.h:502
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 PointDetector.h:595
unsigned int innerRadius() const
Returns the inner radius of this pattern.
Definition PointDetector.h:497
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 isCircle() const
Returns whether the outer shape of this pattern is a circle or a rectangle.
Definition PointDetector.h:507
const CV::PixelPositionsI & offsets() const
Returns the 2D offsets for all surrounding pixels.
Definition PointDetector.h:522
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
Determines the strength of a point at a sub-pixel position using bilinear interpolation.
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:240
Points points_
The precise points detected in the latest frame.
Definition PointDetector.h:474
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:471
Geometry::SpatialDistribution::DistributionArray pointsDistributionArray_
The spatial distribution array of the points detected in the latest frame.
Definition PointDetector.h:477
std::pair< Index32, Scalar > IndexDistancePair
Definition of a pair combining an index with a distance.
Definition PointDetector.h:245
Frame yPointPatternImages_
The frame with all images of point pattern with individual radii.
Definition PointDetector.h:480
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 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.
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).
const Geometry::SpatialDistribution::DistributionArray & pointsDistributionArray() const
Returns the spatial distribution array of the points detected in the latest frame.
Definition PointDetector.h:744
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.
const Points & points() const
Returns the points detected in the latest frame.
Definition PointDetector.h:739
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:468
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.
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:663
This class implements the possibility to find local maximum in a 2D array by applying a non-maximum-s...
Definition NonMaximumSuppression.h:104
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: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: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