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();
116 typedef boost::unordered_map<pcl::octree::OctreeKey, VertexId> KeyVertexMap;
117 KeyVertexMap key_to_vertex_map;
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));
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;