38 #ifndef PCL_GRAPH_IMPL_VOXEL_GRID_GRAPH_BUILDER_CPP
39 #define PCL_GRAPH_IMPL_VOXEL_GRID_GRAPH_BUILDER_CPP
42 #include <boost/unordered_map.hpp>
44 #include <pcl/common/centroid.h>
45 #include <pcl/common/common.h>
46 #include <pcl/common/io.h>
48 #pragma GCC diagnostic push
49 #pragma GCC diagnostic ignored "-Wignored-qualifiers"
50 #pragma GCC diagnostic push
51 #pragma GCC diagnostic ignored "-Wpedantic"
52 #include <pcl/octree/octree.h>
53 #pragma GCC diagnostic pop
54 #pragma GCC diagnostic pop
62 #pragma GCC diagnostic push
63 #pragma GCC diagnostic ignored "-Wunused-function"
72 hash_value(
const OctreeKey& b)
74 return boost::hash_value(b.key_);
81 #pragma GCC diagnostic pop
83 template <
typename Po
intT,
typename GraphT>
94 typename pcl::PointCloud<PointT>::Ptr transformed(
new pcl::PointCloud<PointT>);
95 pcl::copyPointCloud(*input_, *transformed);
96 for (
size_t i = 0; i < transformed->size(); ++i)
98 PointT& p = transformed->points[i];
105 pcl::getMinMax3D(*transformed, *indices_,
min,
max);
108 typedef pcl::octree::OctreePointCloud<PointT> Octree;
109 Octree octree(voxel_resolution_);
111 octree.setInputCloud(transformed, indices_);
112 octree.addPointsFromInputCloud();
114 graph = GraphT(octree.getLeafCount());
116 typedef boost::unordered_map<pcl::octree::OctreeKey, VertexId> KeyVertexMap;
117 KeyVertexMap key_to_vertex_map;
119 point_to_vertex_map_.clear();
122 typename Octree::LeafNodeIterator leaf_itr = octree.leaf_depth_begin();
123 for (
VertexId v = 0; leaf_itr != octree.leaf_depth_end(); ++leaf_itr, ++
v)
127 pcl::CentroidPoint<PointInT> centroid;
128 std::vector<int>&
indices = leaf_itr.getLeafContainer().getPointIndicesVector();
131 centroid.add(input_->operator[](
index));
132 point_to_vertex_map_[
index] =
v;
134 centroid.get(graph[
v]);
137 octree::OctreeKey key = leaf_itr.getCurrentOctreeKey();
138 key_to_vertex_map[key] =
v;
141 octree::OctreeKey neighbor_key;
142 for (
int dx = (key.x > 0) ? -1 : 0; dx <= 1; ++dx)
144 neighbor_key.x =
static_cast<std::uint32_t
>(key.x + dx);
145 for (
int dy = (key.y > 0) ? -1 : 0; dy <= 1; ++dy)
147 neighbor_key.y =
static_cast<std::uint32_t
>(key.y + dy);
148 for (
int dz = (key.z > 0) ? -1 : 0; dz <= 1; ++dz)
150 neighbor_key.z =
static_cast<std::uint32_t
>(key.z + dz);
151 typename KeyVertexMap::iterator f = key_to_vertex_map.find(neighbor_key);
152 if (f != key_to_vertex_map.end() &&
v != f->second)
154 boost::add_edge(
v, f->second, graph);
160 graph.m_graph.m_point_cloud->header = input_->header;