42#include <pcl/filters/filter.h>
57 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt);
75 const std::string &distance_field_name,
float min_distance,
float max_distance,
76 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt,
bool limit_negative =
false);
82 inline Eigen::MatrixXi
85 Eigen::MatrixXi relative_coordinates (3, 13);
89 for (
int i = -1; i < 2; i++)
91 for (
int j = -1; j < 2; j++)
93 relative_coordinates (0, idx) = i;
94 relative_coordinates (1, idx) = j;
95 relative_coordinates (2, idx) = -1;
100 for (
int i = -1; i < 2; i++)
102 relative_coordinates (0, idx) = i;
103 relative_coordinates (1, idx) = -1;
104 relative_coordinates (2, idx) = 0;
108 relative_coordinates (0, idx) = -1;
109 relative_coordinates (1, idx) = 0;
110 relative_coordinates (2, idx) = 0;
112 return (relative_coordinates);
119 inline Eigen::MatrixXi
123 Eigen::MatrixXi relative_coordinates_all( 3, 26);
124 relative_coordinates_all.block<3, 13> (0, 0) = relative_coordinates;
125 relative_coordinates_all.block<3, 13> (0, 13) = -relative_coordinates;
126 return (relative_coordinates_all);
140 template <
typename Po
intT>
void
142 const std::string &distance_field_name,
float min_distance,
float max_distance,
143 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt,
bool limit_negative =
false);
157 template <
typename Po
intT>
void
160 const std::string &distance_field_name,
float min_distance,
float max_distance,
161 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt,
bool limit_negative =
false);
175 template <
typename Po
intT>
190 using Ptr = shared_ptr<VoxelGrid<PointT> >;
191 using ConstPtr = shared_ptr<const VoxelGrid<PointT> >;
248 inline Eigen::Vector3f
287 inline Eigen::Vector3i
293 inline Eigen::Vector3i
299 inline Eigen::Vector3i
305 inline Eigen::Vector3i
330 inline std::vector<int>
333 Eigen::Vector4i ijk (
static_cast<int> (std::floor (reference_point.x *
inverse_leaf_size_[0])),
336 Eigen::Array4i diff2min =
min_b_ - ijk;
337 Eigen::Array4i diff2max =
max_b_ - ijk;
338 std::vector<int> neighbors (relative_coordinates.cols());
339 for (Eigen::Index ni = 0; ni < relative_coordinates.cols (); ni++)
341 Eigen::Vector4i displacement = (Eigen::Vector4i() << relative_coordinates.col(ni), 0).finished();
343 if ((diff2min <= displacement.array()).all() && (diff2max >= displacement.array()).all())
354 inline std::vector<int>
362 inline Eigen::Vector3i
376 int idx = ((Eigen::Vector4i() << ijk, 0).finished() -
min_b_).dot (
divb_mul_);
377 if (idx < 0 || idx >=
static_cast<int> (
leaf_layout_.size ()))
397 inline std::string
const
438 PCL_DEPRECATED(1, 16,
"use bool getFilterLimitsNegative() instead")
488 using FieldList =
typename pcl::traits::fieldList<PointT>::type;
575 inline Eigen::Vector3f
614 inline Eigen::Vector3i
620 inline Eigen::Vector3i
626 inline Eigen::Vector3i
632 inline Eigen::Vector3i
660 inline std::vector<int>
666 Eigen::Array4i diff2min =
min_b_ - ijk;
667 Eigen::Array4i diff2max =
max_b_ - ijk;
668 std::vector<int> neighbors (relative_coordinates.cols());
669 for (Eigen::Index ni = 0; ni < relative_coordinates.cols (); ni++)
671 Eigen::Vector4i displacement = (Eigen::Vector4i() << relative_coordinates.col(ni), 0).finished();
673 if ((diff2min <= displacement.array()).all() && (diff2max >= displacement.array()).all())
689 inline std::vector<int>
690 getNeighborCentroidIndices (
float x,
float y,
float z,
const std::vector<Eigen::Vector3i, Eigen::aligned_allocator<Eigen::Vector3i> > &relative_coordinates)
const
693 std::vector<int> neighbors;
694 neighbors.reserve (relative_coordinates.size ());
695 for (
const auto &relative_coordinate : relative_coordinates)
703 inline std::vector<int>
711 inline Eigen::Vector3i
725 int idx = ((Eigen::Vector4i() << ijk, 0).finished() -
min_b_).dot (
divb_mul_);
726 if (idx < 0 || idx >=
static_cast<int> (
leaf_layout_.size ()))
746 inline std::string
const
787 PCL_DEPRECATED(1, 16,
"use bool getFilterLimitsNegative() instead")
851#ifdef PCL_NO_PRECOMPILE
852#include <pcl/filters/impl/voxel_grid.hpp>
const std::string & getClassName() const
Get a string representation of the name of this class.
Filter(bool extract_removed_indices=false)
Empty constructor.
std::string filter_name_
The filter name.
pcl::PointCloud< PointT > PointCloud
const std::string & getClassName() const
Get a string representation of the name of this class.
std::string filter_name_
The filter name.
Filter(bool extract_removed_indices=false)
Empty constructor.
PointCloudConstPtr input_
The input point cloud dataset.
IndicesPtr indices_
A pointer to the vector of point indices to use.
shared_ptr< PointCloud< PointT > > Ptr
shared_ptr< const PointCloud< PointT > > ConstPtr
int getCentroidIndexAt(const Eigen::Vector3i &ijk) const
Returns the index in the downsampled cloud corresponding to a given set of coordinates.
Eigen::Vector3i getDivisionMultiplier() const
Get the multipliers to be applied to the grid coordinates in order to find the centroid index (after ...
bool getFilterLimitsNegative() const
Get whether the data outside the interval (min/max) is to be returned (true) or inside (false).
std::string filter_field_name_
The desired user filter field name.
std::vector< int > leaf_layout_
The leaf layout information for fast access to cells relative to current position.
void setDownsampleAllData(bool downsample)
Set to true if all fields need to be downsampled, or false if just XYZ.
void setFilterLimits(const double &limit_min, const double &limit_max)
Set the field filter limits.
Eigen::Vector4i min_b_
The minimum and maximum bin coordinates, the number of divisions, and the division multiplier.
Eigen::Vector3f getLeafSize() const
Get the voxel grid leaf size.
bool downsample_all_data_
Set to true if all fields need to be downsampled, or false if just XYZ.
std::vector< int > getNeighborCentroidIndices(float x, float y, float z, const std::vector< Eigen::Vector3i, Eigen::aligned_allocator< Eigen::Vector3i > > &relative_coordinates) const
Returns the indices in the resulting downsampled cloud of the points at the specified grid coordinate...
Eigen::Vector3i getNrDivisions() const
Get the number of divisions along all 3 axes (after filtering is performed).
Eigen::Vector3i getMinBoxCoordinates() const
Get the minimum coordinates of the bounding box (after filtering is performed).
void applyFilter(PCLPointCloud2 &output) override
Downsample a Point Cloud using a voxelized grid approach.
unsigned int getMinimumPointsNumberPerVoxel() const
Return the minimum number of points required for a voxel to be used.
void setLeafSize(const Eigen::Vector4f &leaf_size)
Set the voxel grid leaf size.
unsigned int min_points_per_voxel_
Minimum number of points per voxel for the centroid to be computed.
void getFilterLimits(double &limit_min, double &limit_max) const
Get the field filter limits (min/max) set by the user.
VoxelGrid()
Empty constructor.
bool filter_limit_negative_
Set to true if we want to return the data outside (filter_limit_min_;filter_limit_max_).
std::vector< int > getNeighborCentroidIndices(float x, float y, float z, const Eigen::MatrixXi &relative_coordinates) const
Returns the indices in the resulting downsampled cloud of the points at the specified grid coordinate...
Eigen::Vector3i getGridCoordinates(float x, float y, float z) const
Returns the corresponding (i,j,k) coordinates in the grid of point (x,y,z).
bool getDownsampleAllData() const
Get the state of the internal downsampling parameter (true if all fields need to be downsampled,...
bool getSaveLeafLayout() const
Returns true if leaf layout information will to be saved for later access.
std::vector< int > getLeafLayout() const
Returns the layout of the leafs for fast access to cells relative to current position.
std::string const getFilterFieldName() const
Get the name of the field used for filtering.
double filter_limit_max_
The maximum allowed filter value a point will be considered from.
Eigen::Vector3i getMaxBoxCoordinates() const
Get the minimum coordinates of the bounding box (after filtering is performed).
void setFilterFieldName(const std::string &field_name)
Provide the name of the field to be used for filtering data.
void getFilterLimitsNegative(bool &limit_negative) const
Get whether the data outside the interval (min/max) is to be returned (true) or inside (false).
double filter_limit_min_
The minimum allowed filter value a point will be considered from.
bool save_leaf_layout_
Set to true if leaf layout information needs to be saved in leaf_layout.
void setSaveLeafLayout(bool save_leaf_layout)
Set to true if leaf layout information needs to be saved for later access.
void setFilterLimitsNegative(const bool limit_negative)
Set to true if we want to return the data outside the interval specified by setFilterLimits (min,...
void setLeafSize(float lx, float ly, float lz)
Set the voxel grid leaf size.
Eigen::Array4f inverse_leaf_size_
Internal leaf sizes stored as 1/leaf_size_ for efficiency reasons.
void setMinimumPointsNumberPerVoxel(unsigned int min_points_per_voxel)
Set the minimum number of points required for a voxel to be used.
int getCentroidIndex(float x, float y, float z) const
Returns the index in the resulting downsampled cloud of the specified point.
Eigen::Vector4f leaf_size_
The size of a leaf.
Eigen::Vector4i divb_mul_
Eigen::Vector3i getGridCoordinates(float x, float y, float z) const
Returns the corresponding (i,j,k) coordinates in the grid of point (x,y,z).
void setFilterFieldName(const std::string &field_name)
Provide the name of the field to be used for filtering data.
void setDownsampleAllData(bool downsample)
Set to true if all fields need to be downsampled, or false if just XYZ.
bool downsample_all_data_
Set to true if all fields need to be downsampled, or false if just XYZ.
Eigen::Vector3i getDivisionMultiplier() const
Get the multipliers to be applied to the grid coordinates in order to find the centroid index (after ...
bool getFilterLimitsNegative() const
Get whether the data outside the interval (min/max) is to be returned (true) or inside (false).
void setFilterLimitsNegative(const bool limit_negative)
Set to true if we want to return the data outside the interval specified by setFilterLimits (min,...
Eigen::Vector3i getMaxBoxCoordinates() const
Get the minimum coordinates of the bounding box (after filtering is performed).
unsigned int min_points_per_voxel_
Minimum number of points per voxel for the centroid to be computed.
shared_ptr< const VoxelGrid< PointT > > ConstPtr
void applyFilter(PointCloud &output) override
Downsample a Point Cloud using a voxelized grid approach.
unsigned int getMinimumPointsNumberPerVoxel() const
Return the minimum number of points required for a voxel to be used.
bool getDownsampleAllData() const
Get the state of the internal downsampling parameter (true if all fields need to be downsampled,...
std::vector< int > leaf_layout_
The leaf layout information for fast access to cells relative to current position.
void getFilterLimits(double &limit_min, double &limit_max) const
Get the field filter limits (min/max) set by the user.
Eigen::Vector4i divb_mul_
typename pcl::traits::fieldList< PointT >::type FieldList
shared_ptr< VoxelGrid< PointT > > Ptr
int getCentroidIndex(const PointT &p) const
Returns the index in the resulting downsampled cloud of the specified point.
Eigen::Vector3i getNrDivisions() const
Get the number of divisions along all 3 axes (after filtering is performed).
bool save_leaf_layout_
Set to true if leaf layout information needs to be saved in leaf_layout_.
VoxelGrid()
Empty constructor.
bool filter_limit_negative_
Set to true if we want to return the data outside (filter_limit_min_;filter_limit_max_).
typename PointCloud::ConstPtr PointCloudConstPtr
int getCentroidIndexAt(const Eigen::Vector3i &ijk) const
Returns the index in the downsampled cloud corresponding to a given set of coordinates.
void setLeafSize(const Eigen::Vector4f &leaf_size)
Set the voxel grid leaf size.
Eigen::Vector4i min_b_
The minimum and maximum bin coordinates, the number of divisions, and the division multiplier.
void setSaveLeafLayout(bool save_leaf_layout)
Set to true if leaf layout information needs to be saved for later access.
double filter_limit_max_
The maximum allowed filter value a point will be considered from.
void setMinimumPointsNumberPerVoxel(unsigned int min_points_per_voxel)
Set the minimum number of points required for a voxel to be used.
typename Filter< PointT >::PointCloud PointCloud
std::string filter_field_name_
The desired user filter field name.
std::vector< int > getLeafLayout() const
Returns the layout of the leafs for fast access to cells relative to current position.
Eigen::Vector4f leaf_size_
The size of a leaf.
double filter_limit_min_
The minimum allowed filter value a point will be considered from.
Eigen::Vector3f getLeafSize() const
Get the voxel grid leaf size.
std::vector< int > getNeighborCentroidIndices(const PointT &reference_point, const Eigen::MatrixXi &relative_coordinates) const
Returns the indices in the resulting downsampled cloud of the points at the specified grid coordinate...
void setLeafSize(float lx, float ly, float lz)
Set the voxel grid leaf size.
std::string const getFilterFieldName() const
Get the name of the field used for filtering.
Eigen::Vector3i getMinBoxCoordinates() const
Get the minimum coordinates of the bounding box (after filtering is performed).
Eigen::Array4f inverse_leaf_size_
Internal leaf sizes stored as 1/leaf_size_ for efficiency reasons.
bool getSaveLeafLayout() const
Returns true if leaf layout information will to be saved for later access.
void getFilterLimitsNegative(bool &limit_negative) const
Get whether the data outside the interval (min/max) is to be returned (true) or inside (false).
void setFilterLimits(const double &limit_min, const double &limit_max)
Set the field filter limits.
typename PointCloud::Ptr PointCloudPtr
void getMinMax3D(const pcl::PointCloud< PointT > &cloud, PointT &min_pt, PointT &max_pt)
Get the minimum and maximum values on each of the 3 (x-y-z) dimensions in a given pointcloud.
Eigen::MatrixXi getAllNeighborCellIndices()
Get the relative cell indices of all the 26 neighbors.
Eigen::MatrixXi getHalfNeighborCellIndices()
Get the relative cell indices of the "upper half" 13 neighbors.
PCLPointCloud2::ConstPtr PCLPointCloud2ConstPtr
IndicesAllocator<> Indices
Type used for indices in PCL.
#define PCL_DEPRECATED(Major, Minor, Message)
macro for compatibility across compilers and help remove old deprecated items for the Major....
shared_ptr< ::pcl::PCLPointCloud2 > Ptr
shared_ptr< const ::pcl::PCLPointCloud2 > ConstPtr