Add Stencil class for describing threshold ranges
This commit is contained in:
@@ -0,0 +1,83 @@
|
||||
#ifndef _STENCIL_H
|
||||
#define _STENCIL_H
|
||||
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <user/stimFrame.h>
|
||||
#include <mentalEntity.h>
|
||||
|
||||
namespace smo {
|
||||
namespace cologex {
|
||||
|
||||
/**
|
||||
* Stencil represents range descriptions for sub-regions of sensor data frames.
|
||||
*
|
||||
* When a sensor yields frames with multiple values per frame, the Stencil class
|
||||
* allows the stimbufflib driver to describe the subset of the input data that
|
||||
* is relevant to SMO. For example:
|
||||
*
|
||||
* * A HSB format camera might treat brightness values above 128 as
|
||||
* negtrins, creating a Stencil that denotes all offsets in a
|
||||
* frame that exceed 128.
|
||||
*
|
||||
* * A lidar yielding XYZI[ntensity] might consider I values exceeding 128 to be
|
||||
* negtrins, creating a Stencil listing all values in the point
|
||||
* cloud that exceed 128.
|
||||
*
|
||||
* The Stencil internally represents offsets with ranges or other efficient
|
||||
* formats to describe offsets (e.g., by row). The internal format is opaque to
|
||||
* the stimbufflib, which describes relevant ranges by calling Stencil methods.
|
||||
*/
|
||||
class Stencil
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Constructor that takes a shared_ptr to StimFrame and produces a completed
|
||||
* Stencil. The Stencil scans the StimFrame and efficiently allocates
|
||||
* internal structures to describe the stencil ranges.
|
||||
*
|
||||
* @param frame Shared pointer to the StimFrame to analyze
|
||||
* @param threshold The threshold value for determining relevant data
|
||||
*/
|
||||
Stencil(
|
||||
const std::shared_ptr<stim_buff::StimFrame> &frame,
|
||||
const uint32_t threshold)
|
||||
: frame(frame), threshold(threshold)
|
||||
{}
|
||||
virtual ~Stencil() = default;
|
||||
|
||||
/**
|
||||
* Pure virtual method for derived classes to implement their specific
|
||||
* threshold analysis logic. Returns true if there are values above threshold,
|
||||
* false otherwise.
|
||||
*/
|
||||
virtual bool analyzeFrame() = 0;
|
||||
|
||||
/**
|
||||
* Stencil is constructed from a StimFrame. If the input StimFrame had no
|
||||
* values above threshold, then the Stencil will have no data.
|
||||
*/
|
||||
virtual bool hasData() const = 0;
|
||||
operator bool() const { return hasData(); }
|
||||
bool operator!() const { return !hasData(); }
|
||||
|
||||
// Return the number of relevant ranges/offsets in this Stencil.
|
||||
virtual size_t getRelevantCount() const = 0;
|
||||
// Return true if the offset is relevant, false otherwise
|
||||
virtual bool isRelevant(size_t offset) const = 0;
|
||||
|
||||
/**
|
||||
* Build internal stencil metadata from the shared_ptr member to describe
|
||||
* the range of StimFrame values that are relevant.
|
||||
*/
|
||||
virtual bool buildStencilMetadata() = 0;
|
||||
|
||||
protected:
|
||||
uint32_t threshold;
|
||||
std::shared_ptr<stim_buff::StimFrame> frame;
|
||||
};
|
||||
|
||||
} // namespace cologex
|
||||
} // namespace smo
|
||||
|
||||
#endif // _STENCIL_H
|
||||
Reference in New Issue
Block a user