40 #ifndef PCL_SURFACE_IMPL_POISSON_H_
41 #define PCL_SURFACE_IMPL_POISSON_H_
43 #include <pcl/surface/poisson.h>
45 #include <pcl/common/vector_average.h>
46 #include <pcl/Vertices.h>
48 #include <pcl/surface/3rdparty/poisson4/octree_poisson.h>
49 #include <pcl/surface/3rdparty/poisson4/sparse_matrix.h>
50 #include <pcl/surface/3rdparty/poisson4/function_data.h>
51 #include <pcl/surface/3rdparty/poisson4/ppolynomial.h>
52 #include <pcl/surface/3rdparty/poisson4/multi_grid_octree_data.h>
53 #include <pcl/surface/3rdparty/poisson4/geometry.h>
55 #define MEMORY_ALLOCATOR_BLOCK_SIZE 1<<12
63 template <
typename Po
intNT>
71 , samples_per_node_ (1.0)
73 , output_polygons_ (false)
74 , no_reset_samples_ (false)
75 , no_clip_tree_ (false)
80 , non_adaptive_weights_ (false)
81 , show_residual_ (false)
83 , solver_accuracy_ (1e-3f)
89 template <
typename Po
intNT>
95 template <
typename Po
intNT>
void
100 threads_ = omp_get_num_procs();
109 template <
typename Po
intNT>
template <
int Degree>
void
123 if (solver_divide_ < min_depth_)
125 PCL_WARN (
"[pcl::Poisson] solver_divide_ must be at least as large as min_depth_: %d >= %d\n", solver_divide_, min_depth_);
126 solver_divide_ = min_depth_;
128 if (iso_divide_< min_depth_)
130 PCL_WARN (
"[pcl::Poisson] iso_divide_ must be at least as large as min_depth_: %d >= %d\n", iso_divide_, min_depth_);
131 iso_divide_ = min_depth_;
136 kernel_depth_ = depth_ - 2;
143 int point_count = tree.template setTree<PointNT> (input_, depth_, min_depth_, kernel_depth_, samples_per_node_,
144 scale_, center, scale, confidence_, point_weight_, !non_adaptive_weights_);
150 PCL_DEBUG (
"Input Points: %d\n" , point_count );
151 PCL_DEBUG (
"Leaves/Nodes: %d/%d\n" , tree.
tree.leaves() , tree.
tree.nodes() );
161 tree.GetMCIsoTriangles (iso_value, iso_divide_, &mesh, 0, 1, manifold_, output_polygons_);
166 template <
typename Po
intNT>
void
177 execute<1> (mesh, center, scale);
182 execute<2> (mesh, center, scale);
187 execute<3> (mesh, center, scale);
192 execute<4> (mesh, center, scale);
197 execute<5> (mesh, center, scale);
202 PCL_ERROR (stderr,
"Degree %d not supported\n", degree_);
210 for (
int i = 0; i < int (mesh.
inCorePoints.size ()); i++)
228 std::vector<poisson::CoredVertexIndex> polygon;
233 v.
vertices.resize (polygon.size ());
235 for (
int i = 0; i < static_cast<int> (polygon.size ()); ++i)
236 if (polygon[i].inCore )
246 template <
typename Po
intNT>
void
248 std::vector<pcl::Vertices> &polygons)
258 execute<1> (mesh, center, scale);
263 execute<2> (mesh, center, scale);
268 execute<3> (mesh, center, scale);
273 execute<4> (mesh, center, scale);
278 execute<5> (mesh, center, scale);
283 PCL_ERROR (stderr,
"Degree %d not supported\n", degree_);
291 for (
int i = 0; i < int(mesh.
inCorePoints.size ()); i++)
309 std::vector<poisson::CoredVertexIndex> polygon;
314 v.
vertices.resize (polygon.size ());
316 for (
int i = 0; i < static_cast<int> (polygon.size ()); ++i)
317 if (polygon[i].inCore )
327 #define PCL_INSTANTIATE_Poisson(T) template class PCL_EXPORTS pcl::Poisson<T>;
329 #endif // PCL_SURFACE_IMPL_POISSON_H_