42#include <pcl/common/point_tests.h>
43#include <pcl/keypoints/agast_2d.h>
72 template <
typename Po
intInT,
typename Po
intOutT = pcl::Po
intWithScale,
typename IntensityT = pcl::common::IntensityFieldAccessor<Po
intInT> >
91 : threshold_ (threshold)
93 , remove_invalid_3D_keypoints_ (
false)
96 name_ =
"BriskKeypoint2D";
110 threshold_ = threshold;
144 remove_invalid_3D_keypoints_ = remove;
153 return (remove_invalid_3D_keypoints_);
167 const PointInT &p1 = (*cloud)(u, v);
168 const PointInT &p2 = (*cloud)(u+1, v);
169 const PointInT &p3 = (*cloud)(u, v+1);
170 const PointInT &p4 = (*cloud)(u+1, v+1);
173 float fx1 = 1.0f - fx,
fy1 = 1.0f - fy;
208 pt.x =
pt.y =
pt.z = std::numeric_limits<float>::quiet_NaN ();
211 weight = 1.0f / weight;
212 pt.x *= weight;
pt.y *= weight;
pt.z *= weight;
237 bool remove_invalid_3D_keypoints_;
266 int width,
int height,
267 float scale = 1.0f,
float offset = 0.0f);
316 int width,
int height,
float xf,
float yf,
float scale);
319 const std::vector<unsigned char>&
336 return (img_height_);
354 inline const std::vector<unsigned char>&
363 halfsample (
const std::vector<unsigned char>&
srcimg,
365 std::vector<unsigned char>&
dstimg,
370 twothirdsample (
const std::vector<unsigned char>&
srcimg,
372 std::vector<unsigned char>&
dstimg,
376 std::vector<unsigned char> img_;
381 std::vector<unsigned char> scores_;
409 int width,
int height);
417 std::vector<
pcl::PointWithScale, Eigen::aligned_allocator<pcl::PointWithScale> > &keypoints);
447 float& x,
float& y,
float& scale,
bool&
ismax);
460 const int threshold,
bool&
ismax,
461 float& dx,
float&
dy);
466 const int threshold,
bool&
ismax,
467 float& dx,
float&
dy);
471 std::vector<pcl::keypoints::brisk::Layer>
pyramid_;
486#include <pcl/keypoints/impl/brisk_2d.hpp>
Detects BRISK interest points based on the original code and paper reference by.
void setThreshold(const int threshold)
Sets the threshold for corner detection.
void detectKeypoints(PointCloudOut &output) override
Detects the keypoints.
typename Keypoint< PointInT, PointOutT >::PointCloudIn PointCloudIn
typename Keypoint< PointInT, PointOutT >::PointCloudOut PointCloudOut
typename Keypoint< PointInT, PointOutT >::KdTree KdTree
bool getRemoveInvalid3DKeypoints()
Specify whether the keypoints that do not have a valid 3D position are kept (false) or removed (true)...
std::size_t getThreshold()
Get the threshold for corner detection, as set by the user.
BriskKeypoint2D(int octaves=4, int threshold=60)
Constructor.
void setOctaves(const int octaves)
Set the number of octaves to use.
int getOctaves()
Returns the number of octaves used.
void bilinearInterpolation(const PointCloudInConstPtr &cloud, float x, float y, PointOutT &pt)
bool initCompute() override
Initializes everything and checks whether input data is fine.
~BriskKeypoint2D()
Destructor.
typename PointCloudIn::ConstPtr PointCloudInConstPtr
void setRemoveInvalid3DKeypoints(bool remove)
Specify whether we should do a 2nd pass through the list of keypoints found, and remove the ones that...
Iterator class for point clouds with or without given indices.
Keypoint represents the base class for key points.
int k_
The number of K nearest neighbors to use for each point.
std::string name_
The key point detection method's name.
PointCloudConstPtr input_
The input point cloud dataset.
IndicesPtr indices_
A pointer to the vector of point indices to use.
shared_ptr< AgastDetector5_8 > Ptr
shared_ptr< OastDetector9_16 > Ptr
A layer in the BRISK detector pyramid.
Layer(const Layer &layer, int mode)
Copy constructor for deriving a layer.
float getOffset() const
Get the offset used.
std::uint8_t getAgastScore(int x, int y, std::uint8_t threshold)
Get the AGAST keypoint score for a given pixel using a threshold.
std::uint8_t getAgastScore_5_8(int x, int y, std::uint8_t threshold)
Get the AGAST keypoint score for a given pixel using a threshold.
int getImageWidth() const
Get the width of the image used.
const std::vector< unsigned char > & getImage() const
Get the image used.
int getImageHeight() const
Get the height of the image used.
float getScale() const
Get the scale used.
Layer(const std::vector< unsigned char > &img, int width, int height, float scale=1.0f, float offset=0.0f)
Constructor.
std::uint8_t getAgastScore(float xf, float yf, std::uint8_t threshold, float scale=1.0f)
Get the AGAST keypoint score for a given pixel using a threshold.
std::uint8_t getValue(const std::vector< unsigned char > &mat, int width, int height, float xf, float yf, float scale)
Access gray values (smoothed/interpolated)
void getAgastPoints(std::uint8_t threshold, std::vector< pcl::PointUV, Eigen::aligned_allocator< pcl::PointUV > > &keypoints)
AGAST keypoints without non-max suppression.
const std::vector< unsigned char > & getScores() const
Get the scores obtained.
BRISK Scale Space helper.
float refine1D_1(const float s_05, const float s0, const float s05, float &max)
1D (scale axis) refinement: around intra
float getScoreMaxAbove(const std::uint8_t layer, const int x_layer, const int y_layer, const int threshold, bool &ismax, float &dx, float &dy)
return the maximum of score patches above or below
int getScoreAbove(const std::uint8_t layer, const int x_layer, const int y_layer)
interpolated score access with recalculation when needed
float subpixel2D(const int s_0_0, const int s_0_1, const int s_0_2, const int s_1_0, const int s_1_1, const int s_1_2, const int s_2_0, const int s_2_1, const int s_2_2, float &delta_x, float &delta_y)
2D maximum refinement
float refine1D_2(const float s_05, const float s0, const float s05, float &max)
1D (scale axis) refinement: around octave 0 only
float getScoreMaxBelow(const std::uint8_t layer, const int x_layer, const int y_layer, const int threshold, bool &ismax, float &dx, float &dy)
ScaleSpace(int octaves=3)
Constructor.
int getScoreBelow(const std::uint8_t layer, const int x_layer, const int y_layer)
void constructPyramid(const std::vector< unsigned char > &image, int width, int height)
Construct the image pyramids.
std::uint8_t safe_threshold_
float refine3D(const std::uint8_t layer, const int x_layer, const int y_layer, float &x, float &y, float &scale, bool &ismax)
3D maximum refinement centered around (x_layer,y_layer)
float refine1D(const float s_05, const float s0, const float s05, float &max)
1D (scale axis) refinement: around octave
std::vector< pcl::keypoints::brisk::Layer > pyramid_
bool isMax2D(const std::uint8_t layer, const int x_layer, const int y_layer)
Nonmax suppression.
void getKeypoints(const int threshold, std::vector< pcl::PointWithScale, Eigen::aligned_allocator< pcl::PointWithScale > > &keypoints)
Get the keypoints for the associated image and threshold.
bool isFinite(const PointT &pt)
Tests if the 3D components of a point are all finite param[in] pt point to be tested return true if f...
A 2D point structure representing pixel image coordinates.
A point structure representing a 3-D position and scale.
static const int HALFSAMPLE
static const int TWOTHIRDSAMPLE