40 #ifndef PCL_FILTERS_VOXEL_GRID_MAP_H_
41 #define PCL_FILTERS_VOXEL_GRID_MAP_H_
45 #include <boost/unordered_map.hpp>
46 #include <boost/fusion/sequence/intrinsic/at_key.hpp>
60 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt);
78 const std::string &distance_field_name,
float min_distance,
float max_distance,
79 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt,
bool limit_negative =
false);
85 inline Eigen::MatrixXi
88 Eigen::MatrixXi relative_coordinates (3, 13);
92 for (
int i = -1; i < 2; i++)
94 for (
int j = -1; j < 2; j++)
96 relative_coordinates (0, idx) = i;
97 relative_coordinates (1, idx) = j;
98 relative_coordinates (2, idx) = -1;
103 for (
int i = -1; i < 2; i++)
105 relative_coordinates (0, idx) = i;
106 relative_coordinates (1, idx) = -1;
107 relative_coordinates (2, idx) = 0;
111 relative_coordinates (0, idx) = -1;
112 relative_coordinates (1, idx) = 0;
113 relative_coordinates (2, idx) = 0;
115 return (relative_coordinates);
122 inline Eigen::MatrixXi
126 Eigen::MatrixXi relative_coordinates_all( 3, 26);
127 relative_coordinates_all.block<3, 13> (0, 0) = relative_coordinates;
128 relative_coordinates_all.block<3, 13> (0, 13) = -relative_coordinates;
129 return (relative_coordinates_all);
143 template <
typename Po
intT>
void
145 const std::string &distance_field_name,
float min_distance,
float max_distance,
146 Eigen::Vector4f &min_pt, Eigen::Vector4f &max_pt,
bool limit_negative =
false);
160 template <
typename Po
intT>
176 leaf_size_ (Eigen::Vector4f::Zero ()),
177 inverse_leaf_size_ (Eigen::Array4f::Zero ()),
178 downsample_all_data_ (true),
179 save_leaf_layout_ (false),
181 min_b_ (Eigen::Vector4i::Zero ()),
182 max_b_ (Eigen::Vector4i::Zero ()),
183 div_b_ (Eigen::Vector4i::Zero ()),
184 divb_mul_ (Eigen::Vector4i::Zero ()),
185 filter_field_name_ (
""),
186 filter_limit_min_ (-FLT_MAX),
187 filter_limit_max_ (FLT_MAX),
188 filter_limit_negative_ (false)
190 filter_name_ =
"VoxelGrid";
204 leaf_size_ = leaf_size;
206 if (leaf_size_[3] == 0)
209 inverse_leaf_size_ = Eigen::Array4f::Ones () / leaf_size_.array ();
220 leaf_size_[0] = lx; leaf_size_[1] = ly; leaf_size_[2] = lz;
222 if (leaf_size_[3] == 0)
225 inverse_leaf_size_ = Eigen::Array4f::Ones () / leaf_size_.array ();
229 inline Eigen::Vector3f
257 inline Eigen::Vector3i
263 inline Eigen::Vector3i
269 inline Eigen::Vector3i
275 inline Eigen::Vector3i
289 return (leaf_layout_.at ((Eigen::Vector4i (static_cast<int> (floor (p.x * inverse_leaf_size_[0])),
290 static_cast<int> (floor (p.y * inverse_leaf_size_[1])),
291 static_cast<int> (floor (p.z * inverse_leaf_size_[2])), 0) - min_b_).dot (divb_mul_)));
300 inline std::vector<int>
303 Eigen::Vector4i ijk (static_cast<int> (floor (reference_point.x * inverse_leaf_size_[0])),
304 static_cast<int> (floor (reference_point.y * inverse_leaf_size_[1])),
305 static_cast<int> (floor (reference_point.z * inverse_leaf_size_[2])), 0);
306 Eigen::Array4i diff2min = min_b_ - ijk;
307 Eigen::Array4i diff2max = max_b_ - ijk;
308 std::vector<int> neighbors (relative_coordinates.cols());
309 for (
int ni = 0; ni < relative_coordinates.cols (); ni++)
311 Eigen::Vector4i displacement = (Eigen::Vector4i() << relative_coordinates.col(ni), 0).finished();
313 if ((diff2min <= displacement.array()).all() && (diff2max >= displacement.array()).all())
314 neighbors[ni] = leaf_layout_[((ijk + displacement - min_b_).dot (divb_mul_))];
324 inline std::vector<int>
332 inline Eigen::Vector3i
335 return (Eigen::Vector3i (static_cast<int> (floor (x * inverse_leaf_size_[0])),
336 static_cast<int> (floor (y * inverse_leaf_size_[1])),
337 static_cast<int> (floor (z * inverse_leaf_size_[2]))));
346 int idx = ((Eigen::Vector4i() << ijk, 0).finished() - min_b_).dot (divb_mul_);
347 if (idx < 0 || idx >= static_cast<int> (leaf_layout_.size ()))
353 return (leaf_layout_[idx]);
363 filter_field_name_ = field_name;
367 inline std::string
const
370 return (filter_field_name_);
380 filter_limit_min_ = limit_min;
381 filter_limit_max_ = limit_max;
391 limit_min = filter_limit_min_;
392 limit_max = filter_limit_max_;
402 filter_limit_negative_ = limit_negative;
411 limit_negative = filter_limit_negative_;
420 return (filter_limit_negative_);
425 Eigen::Vector4f leaf_size_;
428 Eigen::Array4f inverse_leaf_size_;
431 bool downsample_all_data_;
434 bool save_leaf_layout_;
437 std::vector<int> leaf_layout_;
440 Eigen::Vector4i min_b_, max_b_, div_b_, divb_mul_;
443 std::string filter_field_name_;
446 double filter_limit_min_;
449 double filter_limit_max_;
452 bool filter_limit_negative_;
488 leaf_size_ (Eigen::Vector4f::Zero ()),
489 inverse_leaf_size_ (Eigen::Array4f::Zero ()),
490 downsample_all_data_ (true),
491 save_leaf_layout_ (false),
493 min_b_ (Eigen::Vector4i::Zero ()),
494 max_b_ (Eigen::Vector4i::Zero ()),
495 div_b_ (Eigen::Vector4i::Zero ()),
496 divb_mul_ (Eigen::Vector4i::Zero ()),
497 filter_field_name_ (
""),
498 filter_limit_min_ (-FLT_MAX),
499 filter_limit_max_ (FLT_MAX),
500 filter_limit_negative_ (false)
502 filter_name_ =
"VoxelGrid";
516 leaf_size_ = leaf_size;
518 if (leaf_size_[3] == 0)
521 inverse_leaf_size_ = Eigen::Array4f::Ones () / leaf_size_.array ();
532 leaf_size_[0] = lx; leaf_size_[1] = ly; leaf_size_[2] = lz;
534 if (leaf_size_[3] == 0)
537 inverse_leaf_size_ = Eigen::Array4f::Ones () / leaf_size_.array ();
541 inline Eigen::Vector3f
569 inline Eigen::Vector3i
575 inline Eigen::Vector3i
581 inline Eigen::Vector3i
587 inline Eigen::Vector3i
600 return (leaf_layout_.at ((Eigen::Vector4i (static_cast<int> (floor (x * inverse_leaf_size_[0])),
601 static_cast<int> (floor (y * inverse_leaf_size_[1])),
602 static_cast<int> (floor (z * inverse_leaf_size_[2])),
604 - min_b_).dot (divb_mul_)));
615 inline std::vector<int>
618 Eigen::Vector4i ijk (static_cast<int> (floor (x * inverse_leaf_size_[0])),
619 static_cast<int> (floor (y * inverse_leaf_size_[1])),
620 static_cast<int> (floor (z * inverse_leaf_size_[2])), 0);
621 Eigen::Array4i diff2min = min_b_ - ijk;
622 Eigen::Array4i diff2max = max_b_ - ijk;
623 std::vector<int> neighbors (relative_coordinates.cols());
624 for (
int ni = 0; ni < relative_coordinates.cols (); ni++)
626 Eigen::Vector4i displacement = (Eigen::Vector4i() << relative_coordinates.col(ni), 0).finished();
628 if ((diff2min <= displacement.array()).all() && (diff2max >= displacement.array()).all())
629 neighbors[ni] = leaf_layout_[((ijk + displacement - min_b_).dot (divb_mul_))];
644 inline std::vector<int>
647 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);
648 std::vector<int> neighbors;
649 neighbors.reserve (relative_coordinates.size ());
650 for (std::vector<Eigen::Vector3i>::const_iterator it = relative_coordinates.begin (); it != relative_coordinates.end (); it++)
651 neighbors.push_back (leaf_layout_[(ijk + (Eigen::Vector4i() << *it, 0).finished() - min_b_).dot (divb_mul_)]);
658 inline std::vector<int>
666 inline Eigen::Vector3i
669 return (Eigen::Vector3i (static_cast<int> (floor (x * inverse_leaf_size_[0])),
670 static_cast<int> (floor (y * inverse_leaf_size_[1])),
671 static_cast<int> (floor (z * inverse_leaf_size_[2]))));
680 int idx = ((Eigen::Vector4i() << ijk, 0).finished() - min_b_).dot (divb_mul_);
681 if (idx < 0 || idx >= static_cast<int> (leaf_layout_.size ()))
687 return (leaf_layout_[idx]);
697 filter_field_name_ = field_name;
701 inline std::string
const
704 return (filter_field_name_);
714 filter_limit_min_ = limit_min;
715 filter_limit_max_ = limit_max;
725 limit_min = filter_limit_min_;
726 limit_max = filter_limit_max_;
736 filter_limit_negative_ = limit_negative;
745 limit_negative = filter_limit_negative_;
754 return (filter_limit_negative_);
759 Eigen::Vector4f leaf_size_;
762 Eigen::Array4f inverse_leaf_size_;
765 bool downsample_all_data_;
770 bool save_leaf_layout_;
775 std::vector<int> leaf_layout_;
780 Eigen::Vector4i min_b_, max_b_, div_b_, divb_mul_;
783 std::string filter_field_name_;
786 double filter_limit_min_;
789 double filter_limit_max_;
792 bool filter_limit_negative_;
798 applyFilter (PointCloud2 &output);
802 #endif //#ifndef PCL_FILTERS_VOXEL_GRID_MAP_H_