Point Cloud Library (PCL)
1.12.1-dev
|
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> >;
250 inline Eigen::Vector3f
289 inline Eigen::Vector3i
295 inline Eigen::Vector3i
301 inline Eigen::Vector3i
307 inline Eigen::Vector3i
332 inline std::vector<int>
335 Eigen::Vector4i ijk (
static_cast<int> (std::floor (reference_point.x *
inverse_leaf_size_[0])),
338 Eigen::Array4i diff2min =
min_b_ - ijk;
339 Eigen::Array4i diff2max =
max_b_ - ijk;
340 std::vector<int> neighbors (relative_coordinates.cols());
341 for (Eigen::Index ni = 0; ni < relative_coordinates.cols (); ni++)
343 Eigen::Vector4i displacement = (Eigen::Vector4i() << relative_coordinates.col(ni), 0).finished();
345 if ((diff2min <= displacement.array()).all() && (diff2max >= displacement.array()).all())
356 inline std::vector<int>
364 inline Eigen::Vector3i
378 int idx = ((Eigen::Vector4i() << ijk, 0).finished() -
min_b_).dot (
divb_mul_);
379 if (idx < 0 || idx >=
static_cast<int> (
leaf_layout_.size ()))
399 inline std::string
const
441 PCL_DEPRECATED(1, 16,
"use bool getFilterLimitsNegative() instead")
491 using FieldList =
typename pcl::traits::fieldList<PointT>::type;
525 leaf_size_ (
Eigen::Vector4f::Zero ()),
526 inverse_leaf_size_ (
Eigen::Array4f::Zero ()),
527 downsample_all_data_ (true),
528 save_leaf_layout_ (false),
529 min_b_ (
Eigen::Vector4i::Zero ()),
530 max_b_ (
Eigen::Vector4i::Zero ()),
531 div_b_ (
Eigen::Vector4i::Zero ()),
532 divb_mul_ (
Eigen::Vector4i::Zero ()),
533 filter_field_name_ (
""),
534 filter_limit_min_ (std::numeric_limits<float>::lowest()),
535 filter_limit_max_ (std::numeric_limits<float>::max()),
536 filter_limit_negative_ (false),
537 min_points_per_voxel_ (0)
539 filter_name_ =
"VoxelGrid";
553 leaf_size_ = leaf_size;
555 if (leaf_size_[3] == 0)
558 inverse_leaf_size_ = Eigen::Array4f::Ones () / leaf_size_.array ();
569 leaf_size_[0] = lx; leaf_size_[1] = ly; leaf_size_[2] = lz;
571 if (leaf_size_[3] == 0)
574 inverse_leaf_size_ = Eigen::Array4f::Ones () / leaf_size_.array ();
578 inline Eigen::Vector3f
617 inline Eigen::Vector3i
623 inline Eigen::Vector3i
629 inline Eigen::Vector3i
635 inline Eigen::Vector3i
648 return (leaf_layout_.at ((Eigen::Vector4i (
static_cast<int> (std::floor (x * inverse_leaf_size_[0])),
649 static_cast<int> (std::floor (y * inverse_leaf_size_[1])),
650 static_cast<int> (std::floor (z * inverse_leaf_size_[2])),
652 - min_b_).dot (divb_mul_)));
663 inline std::vector<int>
666 Eigen::Vector4i ijk (
static_cast<int> (std::floor (x * inverse_leaf_size_[0])),
667 static_cast<int> (std::floor (y * inverse_leaf_size_[1])),
668 static_cast<int> (std::floor (z * inverse_leaf_size_[2])), 0);
669 Eigen::Array4i diff2min = min_b_ - ijk;
670 Eigen::Array4i diff2max = max_b_ - ijk;
671 std::vector<int> neighbors (relative_coordinates.cols());
672 for (Eigen::Index ni = 0; ni < relative_coordinates.cols (); ni++)
674 Eigen::Vector4i displacement = (Eigen::Vector4i() << relative_coordinates.col(ni), 0).finished();
676 if ((diff2min <= displacement.array()).all() && (diff2max >= displacement.array()).all())
677 neighbors[ni] = leaf_layout_[((ijk + displacement - min_b_).dot (divb_mul_))];
692 inline std::vector<int>
693 getNeighborCentroidIndices (
float x,
float y,
float z,
const std::vector<Eigen::Vector3i, Eigen::aligned_allocator<Eigen::Vector3i> > &relative_coordinates)
const
695 Eigen::Vector4i ijk (
static_cast<int> (std::floor (x * inverse_leaf_size_[0])),
static_cast<int> (std::floor (y * inverse_leaf_size_[1])),
static_cast<int> (std::floor (z * inverse_leaf_size_[2])), 0);
696 std::vector<int> neighbors;
697 neighbors.reserve (relative_coordinates.size ());
698 for (
const auto &relative_coordinate : relative_coordinates)
699 neighbors.push_back (leaf_layout_[(ijk + (Eigen::Vector4i() << relative_coordinate, 0).finished() - min_b_).dot (divb_mul_)]);
706 inline std::vector<int>
714 inline Eigen::Vector3i
717 return (Eigen::Vector3i (
static_cast<int> (std::floor (x * inverse_leaf_size_[0])),
718 static_cast<int> (std::floor (y * inverse_leaf_size_[1])),
719 static_cast<int> (std::floor (z * inverse_leaf_size_[2]))));
728 int idx = ((Eigen::Vector4i() << ijk, 0).finished() - min_b_).dot (divb_mul_);
729 if (idx < 0 || idx >=
static_cast<int> (leaf_layout_.size ()))
735 return (leaf_layout_[idx]);
745 filter_field_name_ = field_name;
749 inline std::string
const
752 return (filter_field_name_);
762 filter_limit_min_ = limit_min;
763 filter_limit_max_ = limit_max;
774 limit_min = filter_limit_min_;
775 limit_max = filter_limit_max_;
785 filter_limit_negative_ = limit_negative;
791 PCL_DEPRECATED(1, 16,
"use bool getFilterLimitsNegative() instead")
793 getFilterLimitsNegative (
bool &limit_negative)
const
795 limit_negative = filter_limit_negative_;
804 return (filter_limit_negative_);
830 Eigen::Vector4i
min_b_, max_b_, div_b_, divb_mul_;
855 #ifdef PCL_NO_PRECOMPILE
856 #include <pcl/filters/impl/voxel_grid.hpp>
VoxelGrid assembles a local 3D grid over a given PointCloud, and downsamples + filters the data.
Eigen::Vector3i getMinBoxCoordinates() const
Get the minimum coordinates of the bounding box (after filtering is performed).
Eigen::Vector4f leaf_size_
The size of a leaf.
Eigen::Vector4i min_b_
The minimum and maximum bin coordinates, the number of divisions, and the division multiplier.
std::vector< int > getLeafLayout() const
Returns the layout of the leafs for fast access to cells relative to current position.
std::vector< int > getLeafLayout() const
Returns the layout of the leafs for fast access to cells relative to current position.
int getCentroidIndexAt(const Eigen::Vector3i &ijk) const
Returns the index in the downsampled cloud corresponding to a given set of coordinates.
Eigen::Vector3i getMaxBoxCoordinates() const
Get the minimum coordinates of the bounding box (after filtering is performed).
void setFilterLimitsNegative(const bool limit_negative)
Set to true if we want to return the data outside the interval specified by setFilterLimits (min,...
shared_ptr< Filter< pcl::PointXYZRGBL > > Ptr
bool getDownsampleAllData() const
Get the state of the internal downsampling parameter (true if all fields need to be downsampled,...
typename PointCloud::ConstPtr PointCloudConstPtr
void setDownsampleAllData(bool downsample)
Set to true if all fields need to be downsampled, or false if just XYZ.
void applyFilter(PointCloud &output) override
Downsample a Point Cloud using a voxelized grid approach.
typename PointCloud::Ptr PointCloudPtr
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,...
shared_ptr< ::pcl::PCLPointCloud2 > Ptr
Eigen::Vector3i getDivisionMultiplier() const
Get the multipliers to be applied to the grid coordinates in order to find the centroid index (after ...
Eigen::MatrixXi getHalfNeighborCellIndices()
Get the relative cell indices of the "upper half" 13 neighbors.
VoxelGrid()
Empty constructor.
void setLeafSize(const Eigen::Vector4f &leaf_size)
Set the voxel grid leaf size.
void setFilterLimits(const double &limit_min, const double &limit_max)
Set the field filter limits.
void getFilterLimits(double &limit_min, double &limit_max) const
Get the field filter limits (min/max) set by the user.
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.
double filter_limit_max_
The maximum allowed filter value a point will be considered from.
void setFilterLimits(const double &limit_min, const double &limit_max)
Set the field filter limits.
int getCentroidIndexAt(const Eigen::Vector3i &ijk) const
Returns the index in the downsampled cloud corresponding to a given set of coordinates.
bool downsample_all_data_
Set to true if all fields need to be downsampled, or false if just XYZ.
int getCentroidIndex(const PointT &p) const
Returns the index in the resulting downsampled cloud of the specified point.
bool downsample_all_data_
Set to true if all fields need to be downsampled, or false if just XYZ.
Eigen::Vector3i getMinBoxCoordinates() const
Get the minimum coordinates of the bounding box (after filtering is performed).
std::vector< int > leaf_layout_
The leaf layout information for fast access to cells relative to current position.
PCLPointCloud2::ConstPtr PCLPointCloud2ConstPtr
bool filter_limit_negative_
Set to true if we want to return the data outside (filter_limit_min_;filter_limit_max_).
Eigen::Array4f inverse_leaf_size_
Internal leaf sizes stored as 1/leaf_size_ for efficiency reasons.
typename pcl::traits::fieldList< pcl::PointXYZRGBL >::type FieldList
A point structure representing Euclidean xyz coordinates, and the RGB color.
void setMinimumPointsNumberPerVoxel(unsigned int min_points_per_voxel)
Set the minimum number of points required for a voxel to be used.
Eigen::MatrixXi getAllNeighborCellIndices()
Get the relative cell indices of all the 26 neighbors.
bool save_leaf_layout_
Set to true if leaf layout information needs to be saved in leaf_layout_.
bool getSaveLeafLayout() const
Returns true if leaf layout information will to be saved for later access.
void getFilterLimits(double &limit_min, double &limit_max) const
Get the field filter limits (min/max) set by the user.
const std::string getFilterFieldName() const
Get the name of the field used for filtering.
PCLPointCloud2::ConstPtr PCLPointCloud2ConstPtr
bool getSaveLeafLayout() const
Returns true if leaf layout information will to be saved for later access.
#define PCL_DEPRECATED(Major, Minor, Message)
macro for compatibility across compilers and help remove old deprecated items for the Major....
unsigned int getMinimumPointsNumberPerVoxel() const
Return the minimum number of points required for a voxel to be used.
Eigen::Vector3f getLeafSize() const
Get the voxel grid leaf size.
PCLPointCloud2::Ptr PCLPointCloud2Ptr
Eigen::Vector3i getNrDivisions() const
Get the number of divisions along all 3 axes (after filtering is performed).
unsigned int getMinimumPointsNumberPerVoxel() const
Return the minimum number of points required for a voxel to be used.
double filter_limit_max_
The maximum allowed filter value a point will be considered from.
shared_ptr< const ::pcl::PCLPointCloud2 > ConstPtr
PCL_MAKE_ALIGNED_OPERATOR_NEW
unsigned int min_points_per_voxel_
Minimum number of points per voxel for the centroid to be computed.
void setLeafSize(float lx, float ly, float lz)
Set the voxel grid leaf size.
const std::string getFilterFieldName() const
Get the name of the field used for filtering.
std::string filter_field_name_
The desired user filter field name.
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).
double filter_limit_min_
The minimum allowed filter value a point will be considered from.
Eigen::Vector3i getDivisionMultiplier() const
Get the multipliers to be applied to the grid coordinates in order to find the centroid index (after ...
Eigen::Vector4i min_b_
The minimum and maximum bin coordinates, the number of divisions, and the division multiplier.
Eigen::Vector3i getMaxBoxCoordinates() const
Get the minimum coordinates of the bounding box (after filtering is performed).
shared_ptr< const Filter< pcl::PointXYZRGBL > > ConstPtr
VoxelGrid()
Empty constructor.
bool getFilterLimitsNegative() const
Get whether the data outside the interval (min/max) is to be returned (true) or inside (false).
Filter represents the base filter class.
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...
IndicesAllocator<> Indices
Type used for indices in PCL.
Eigen::Vector4i divb_mul_
bool getFilterLimitsNegative() const
Get whether the data outside the interval (min/max) is to be returned (true) or inside (false).
std::string filter_name_
The filter name.
shared_ptr< PointCloud< PointT > > Ptr
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::Array4f inverse_leaf_size_
Internal leaf sizes stored as 1/leaf_size_ for efficiency reasons.
std::vector< int > leaf_layout_
The leaf layout information for fast access to cells relative to current position.
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::Vector4f leaf_size_
The size of a leaf.
void setDownsampleAllData(bool downsample)
Set to true if all fields need to be downsampled, or false if just XYZ.
bool save_leaf_layout_
Set to true if leaf layout information needs to be saved in leaf_layout.
bool filter_limit_negative_
Set to true if we want to return the data outside (filter_limit_min_;filter_limit_max_).
shared_ptr< const PointCloud< PointT > > ConstPtr
void setMinimumPointsNumberPerVoxel(unsigned int min_points_per_voxel)
Set the minimum number of points required for a voxel to be used.
void setFilterFieldName(const std::string &field_name)
Provide the name of the field to be used for filtering data.
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...
void setLeafSize(float lx, float ly, float lz)
Set the voxel grid leaf size.
std::string filter_field_name_
The desired user filter field name.
void setSaveLeafLayout(bool save_leaf_layout)
Set to true if leaf layout information needs to be saved for later access.
Eigen::Vector3i getNrDivisions() const
Get the number of divisions along all 3 axes (after filtering is performed).
bool getDownsampleAllData() const
Get the state of the internal downsampling parameter (true if all fields need to be downsampled,...
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.
double filter_limit_min_
The minimum allowed filter value a point will be considered from.
int getCentroidIndex(float x, float y, float z) const
Returns the index in the resulting downsampled cloud of the specified point.
Eigen::Vector3f getLeafSize() const
Get the voxel grid leaf size.