40 #ifndef PCL_FILTERS_VOXEL_GRID_MAP_H_
41 #define PCL_FILTERS_VOXEL_GRID_MAP_H_
43 #include <pcl/filters/boost.h>
44 #include <pcl/filters/filter.h>
59 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt);
77 const std::string &distance_field_name,
float min_distance,
float max_distance,
78 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt,
bool limit_negative =
false);
84 inline Eigen::MatrixXi
87 Eigen::MatrixXi relative_coordinates (3, 13);
91 for (
int i = -1; i < 2; i++)
93 for (
int j = -1; j < 2; j++)
95 relative_coordinates (0, idx) = i;
96 relative_coordinates (1, idx) = j;
97 relative_coordinates (2, idx) = -1;
102 for (
int i = -1; i < 2; i++)
104 relative_coordinates (0, idx) = i;
105 relative_coordinates (1, idx) = -1;
106 relative_coordinates (2, idx) = 0;
110 relative_coordinates (0, idx) = -1;
111 relative_coordinates (1, idx) = 0;
112 relative_coordinates (2, idx) = 0;
114 return (relative_coordinates);
121 inline Eigen::MatrixXi
125 Eigen::MatrixXi relative_coordinates_all( 3, 26);
126 relative_coordinates_all.block<3, 13> (0, 0) = relative_coordinates;
127 relative_coordinates_all.block<3, 13> (0, 13) = -relative_coordinates;
128 return (relative_coordinates_all);
142 template <
typename Po
intT>
void
144 const std::string &distance_field_name,
float min_distance,
float max_distance,
145 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt,
bool limit_negative =
false);
159 template <
typename Po
intT>
void
161 const std::vector<int> &indices,
162 const std::string &distance_field_name,
float min_distance,
float max_distance,
163 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt,
bool limit_negative =
false);
177 template <
typename Po
intT>
189 typedef boost::shared_ptr< VoxelGrid<PointT> >
Ptr;
190 typedef boost::shared_ptr< const VoxelGrid<PointT> >
ConstPtr;
201 min_b_ (Eigen::Vector4i::Zero ()),
202 max_b_ (Eigen::Vector4i::Zero ()),
203 div_b_ (Eigen::Vector4i::Zero ()),
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> (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 (
int 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
368 static_cast<int> (floor (y * inverse_leaf_size_[1])),
369 static_cast<int> (floor (z * inverse_leaf_size_[2]))));
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
523 leaf_size_ (Eigen::Vector4f::Zero ()),
524 inverse_leaf_size_ (Eigen::Array4f::Zero ()),
525 downsample_all_data_ (true),
526 save_leaf_layout_ (false),
528 min_b_ (Eigen::Vector4i::Zero ()),
529 max_b_ (Eigen::Vector4i::Zero ()),
530 div_b_ (Eigen::Vector4i::Zero ()),
531 divb_mul_ (Eigen::Vector4i::Zero ()),
532 filter_field_name_ (
""),
533 filter_limit_min_ (-FLT_MAX),
534 filter_limit_max_ (FLT_MAX),
535 filter_limit_negative_ (false),
536 min_points_per_voxel_ (0)
538 filter_name_ =
"VoxelGrid";
550 setLeafSize (
const Eigen::Vector4f &leaf_size)
552 leaf_size_ = leaf_size;
554 if (leaf_size_[3] == 0)
557 inverse_leaf_size_ = Eigen::Array4f::Ones () / leaf_size_.array ();
566 setLeafSize (
float lx,
float ly,
float lz)
568 leaf_size_[0] = lx; leaf_size_[1] = ly; leaf_size_[2] = lz;
570 if (leaf_size_[3] == 0)
573 inverse_leaf_size_ = Eigen::Array4f::Ones () / leaf_size_.array ();
577 inline Eigen::Vector3f
616 inline Eigen::Vector3i
622 inline Eigen::Vector3i
628 inline Eigen::Vector3i
634 inline Eigen::Vector3i
645 getCentroidIndex (
float x,
float y,
float z)
647 return (leaf_layout_.at ((Eigen::Vector4i (static_cast<int> (floor (x * inverse_leaf_size_[0])),
648 static_cast<int> (floor (y * inverse_leaf_size_[1])),
649 static_cast<int> (floor (z * inverse_leaf_size_[2])),
651 - min_b_).dot (divb_mul_)));
662 inline std::vector<int>
663 getNeighborCentroidIndices (
float x,
float y,
float z,
const Eigen::MatrixXi &relative_coordinates)
665 Eigen::Vector4i ijk (static_cast<int> (floor (x * inverse_leaf_size_[0])),
666 static_cast<int> (floor (y * inverse_leaf_size_[1])),
667 static_cast<int> (floor (z * inverse_leaf_size_[2])), 0);
668 Eigen::Array4i diff2min = min_b_ - ijk;
669 Eigen::Array4i diff2max = max_b_ - ijk;
670 std::vector<int> neighbors (relative_coordinates.cols());
671 for (
int ni = 0; ni < relative_coordinates.cols (); ni++)
673 Eigen::Vector4i displacement = (Eigen::Vector4i() << relative_coordinates.col(ni), 0).finished();
675 if ((diff2min <= displacement.array()).all() && (diff2max >= displacement.array()).all())
676 neighbors[ni] = leaf_layout_[((ijk + displacement - min_b_).dot (divb_mul_))];
691 inline std::vector<int>
692 getNeighborCentroidIndices (
float x,
float y,
float z,
const std::vector<Eigen::Vector3i> &relative_coordinates)
694 Eigen::Vector4i ijk (static_cast<int> (floorf (x * inverse_leaf_size_[0])), static_cast<int> (floorf (y * inverse_leaf_size_[1])), static_cast<int> (floorf (z * inverse_leaf_size_[2])), 0);
695 std::vector<int> neighbors;
696 neighbors.reserve (relative_coordinates.size ());
697 for (std::vector<Eigen::Vector3i>::const_iterator it = relative_coordinates.begin (); it != relative_coordinates.end (); it++)
698 neighbors.push_back (leaf_layout_[(ijk + (Eigen::Vector4i() << *it, 0).finished() - min_b_).dot (divb_mul_)]);
705 inline std::vector<int>
713 inline Eigen::Vector3i
714 getGridCoordinates (
float x,
float y,
float z)
716 return (Eigen::Vector3i (static_cast<int> (floor (x * inverse_leaf_size_[0])),
717 static_cast<int> (floor (y * inverse_leaf_size_[1])),
718 static_cast<int> (floor (z * inverse_leaf_size_[2]))));
725 getCentroidIndexAt (
const Eigen::Vector3i &ijk)
727 int idx = ((Eigen::Vector4i() << ijk, 0).finished() - min_b_).dot (divb_mul_);
728 if (idx < 0 || idx >= static_cast<int> (leaf_layout_.size ()))
734 return (leaf_layout_[idx]);
742 setFilterFieldName (
const std::string &field_name)
744 filter_field_name_ = field_name;
748 inline std::string
const
749 getFilterFieldName ()
751 return (filter_field_name_);
759 setFilterLimits (
const double &limit_min,
const double &limit_max)
761 filter_limit_min_ = limit_min;
762 filter_limit_max_ = limit_max;
770 getFilterLimits (
double &limit_min,
double &limit_max)
772 limit_min = filter_limit_min_;
773 limit_max = filter_limit_max_;
781 setFilterLimitsNegative (
const bool limit_negative)
783 filter_limit_negative_ = limit_negative;
790 getFilterLimitsNegative (
bool &limit_negative)
792 limit_negative = filter_limit_negative_;
799 getFilterLimitsNegative ()
801 return (filter_limit_negative_);
827 Eigen::Vector4i
min_b_, max_b_, div_b_, divb_mul_;
852 #ifdef PCL_NO_PRECOMPILE
853 #include <pcl/filters/impl/voxel_grid.hpp>
856 #endif //#ifndef PCL_FILTERS_VOXEL_GRID_MAP_H_