Files

84 lines
2.6 KiB
C++
Raw Permalink Normal View History

#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