38 #ifndef PCL_SURFACE_GRID_PROJECTION_H_
39 #define PCL_SURFACE_GRID_PROJECTION_H_
42 #include <boost/dynamic_bitset/dynamic_bitset.hpp>
43 #include <boost/unordered_map.hpp>
49 {0, 4}, {1, 5}, {2, 6}, {3, 7},
50 {0, 1}, {1, 2}, {2, 3}, {3, 0},
51 {4, 5}, {5, 6}, {6, 7}, {7, 4}
72 template <
typename Po
intNT>
94 typedef boost::unordered_map<int, Leaf, boost::hash<int>, std::equal_to<int>, Eigen::aligned_allocator<int> >
HashMap;
113 leaf_size_ = resolution;
134 padding_size_ = padding_size;
139 return (padding_size_);
164 max_binary_search_level_ = max_binary_search_level;
169 return (max_binary_search_level_);
176 return (cell_hash_map_);
179 inline const std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f> >&
182 return (vector_at_data_point_);
185 inline const std::vector<Eigen::Vector4f, Eigen::aligned_allocator<Eigen::Vector4f> >&
202 reconstructPolygons (std::vector<pcl::Vertices> &polygons);
228 std::vector<pcl::Vertices> &polygons);
236 scaleInputDataPoint (
double scale_factor);
244 getCellIndex (
const Eigen::Vector4f &p, Eigen::Vector3i& index)
const
246 for (
int i = 0; i < 3; ++i)
247 index[i] = static_cast<int> ((p[i] - min_p_(i)) / leaf_size_);
256 getCellCenterFromIndex (
const Eigen::Vector3i &index, Eigen::Vector4f ¢er)
const
258 for (
int i = 0; i < 3; ++i)
260 min_p_[i] + static_cast<float> (index[i]) *
261 static_cast<float> (leaf_size_) +
262 static_cast<float> (leaf_size_) / 2.0f;
270 getVertexFromCellCenter (
const Eigen::Vector4f &cell_center,
271 std::vector<Eigen::Vector4f, Eigen::aligned_allocator<Eigen::Vector4f> > &pts)
const;
278 getIndexIn1D (
const Eigen::Vector3i &index)
const
281 return (index[0] * data_size_ * data_size_ +
282 index[1] * data_size_ + index[2]);
291 getIndexIn3D (
int index_1d, Eigen::Vector3i& index_3d)
const
294 index_3d[0] = index_1d / (data_size_ * data_size_);
295 index_1d -= index_3d[0] * data_size_ * data_size_;
296 index_3d[1] = index_1d / data_size_;
297 index_1d -= index_3d[1] * data_size_;
298 index_3d[2] = index_1d;
306 fillPad (
const Eigen::Vector3i &index);
313 getDataPtsUnion (
const Eigen::Vector3i &index, std::vector <int> &pt_union_indices);
322 createSurfaceForCell (
const Eigen::Vector3i &index, std::vector <int> &pt_union_indices);
333 getProjection (
const Eigen::Vector4f &p, std::vector<int> &pt_union_indices, Eigen::Vector4f &projection);
343 getProjectionWithPlaneFit (
const Eigen::Vector4f &p,
344 std::vector<int> &pt_union_indices,
345 Eigen::Vector4f &projection);
354 getVectorAtPoint (
const Eigen::Vector4f &p,
355 std::vector <int> &pt_union_indices, Eigen::Vector3f &vo);
365 getVectorAtPointKNN (
const Eigen::Vector4f &p,
366 std::vector<int> &k_indices,
367 std::vector<float> &k_squared_distances,
368 Eigen::Vector3f &vo);
375 getMagAtPoint (
const Eigen::Vector4f &p,
const std::vector <int> &pt_union_indices);
383 getD1AtPoint (
const Eigen::Vector4f &p,
const Eigen::Vector3f &vec,
384 const std::vector <int> &pt_union_indices);
392 getD2AtPoint (
const Eigen::Vector4f &p,
const Eigen::Vector3f &vec,
393 const std::vector <int> &pt_union_indices);
404 isIntersected (
const std::vector<Eigen::Vector4f, Eigen::aligned_allocator<Eigen::Vector4f> > &end_pts,
405 std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f> > &vect_at_end_pts,
406 std::vector <int> &pt_union_indices);
417 findIntersection (
int level,
418 const std::vector<Eigen::Vector4f, Eigen::aligned_allocator<Eigen::Vector4f> > &end_pts,
419 const std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f> > &vect_at_end_pts,
420 const Eigen::Vector4f &start_pt,
421 std::vector<int> &pt_union_indices,
422 Eigen::Vector4f &intersection);
439 storeVectAndSurfacePoint (
int index_1d,
const Eigen::Vector3i &index_3d,
440 std::vector<int> &pt_union_indices,
const Leaf &cell_data);
456 storeVectAndSurfacePointKNN (
int index_1d,
const Eigen::Vector3i &index_3d,
const Leaf &cell_data);
463 Eigen::Vector4f min_p_, max_p_;
469 double gaussian_scale_;
475 int max_binary_search_level_;
487 std::vector<Eigen::Vector3f, Eigen::aligned_allocator<Eigen::Vector3f> > vector_at_data_point_;
490 std::vector<Eigen::Vector4f, Eigen::aligned_allocator<Eigen::Vector4f> > surface_;
493 boost::dynamic_bitset<> occupied_cell_list_;
496 std::string getClassName ()
const {
return (
"GridProjection"); }
499 EIGEN_MAKE_ALIGNED_OPERATOR_NEW
503 #endif // PCL_SURFACE_GRID_PROJECTION_H_