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>
93 template <
typename Po
intNT>
void
98 threads_ = omp_get_num_procs();
107 template <
typename Po
intNT>
template <
int Degree>
void
121 if (solver_divide_ < min_depth_)
123 PCL_WARN (
"[pcl::Poisson] solver_divide_ must be at least as large as min_depth_: %d >= %d\n", solver_divide_, min_depth_);
124 solver_divide_ = min_depth_;
126 if (iso_divide_< min_depth_)
128 PCL_WARN (
"[pcl::Poisson] iso_divide_ must be at least as large as min_depth_: %d >= %d\n", iso_divide_, min_depth_);
129 iso_divide_ = min_depth_;
134 kernel_depth_ = depth_ - 2;
141 int point_count = tree.template setTree<PointNT> (input_, depth_, min_depth_, kernel_depth_, samples_per_node_,
142 scale_, center, scale, confidence_, point_weight_, !non_adaptive_weights_);
148 PCL_DEBUG (
"Input Points: %d\n" , point_count );
159 tree.GetMCIsoTriangles (iso_value, iso_divide_, &mesh, 0, 1, manifold_, output_polygons_);
164 template <
typename Po
intNT>
void
175 execute<1> (mesh, center, scale);
180 execute<2> (mesh, center, scale);
185 execute<3> (mesh, center, scale);
190 execute<4> (mesh, center, scale);
195 execute<5> (mesh, center, scale);
200 PCL_ERROR (stderr,
"Degree %d not supported\n", degree_);
208 for (
int i = 0; i < int (mesh.
inCorePoints.size ()); i++)
226 std::vector<poisson::CoredVertexIndex> polygon;
231 v.
vertices.resize (polygon.size ());
233 for (
int i = 0; i < static_cast<int> (polygon.size ()); ++i)
234 if (polygon[i].inCore )
244 template <
typename Po
intNT>
void
246 std::vector<pcl::Vertices> &polygons)
256 execute<1> (mesh, center, scale);
261 execute<2> (mesh, center, scale);
266 execute<3> (mesh, center, scale);
271 execute<4> (mesh, center, scale);
276 execute<5> (mesh, center, scale);
281 PCL_ERROR (stderr,
"Degree %d not supported\n", degree_);
289 for (
int i = 0; i < int(mesh.
inCorePoints.size ()); i++)
307 std::vector<poisson::CoredVertexIndex> polygon;
312 v.
vertices.resize (polygon.size ());
314 for (
int i = 0; i < static_cast<int> (polygon.size ()); ++i)
315 if (polygon[i].inCore )
325 #define PCL_INSTANTIATE_Poisson(T) template class PCL_EXPORTS pcl::Poisson<T>;
void resize(std::size_t count)
Resizes the container to contain count elements.
The Poisson surface reconstruction algorithm.
void setThreads(int threads)
Set the number of threads to use.
Poisson()
Constructor that sets all the parameters to working default values.
void performReconstruction(pcl::PolygonMesh &output) override
Create the surface.
~Poisson() override
Destructor.
std::vector< Point3D< float > > inCorePoints
int nextPolygon(std::vector< CoredVertexIndex > &vertices)
int outOfCorePointCount(void)
int nextOutOfCorePoint(Point3D< float > &p)
static void SetAllocator(int blockSize)
void RefineBoundary(int subdivisionDepth)
void setBSplineData(int maxDepth, Real normalSmooth=-1, bool reflectBoundary=false)
int LaplacianMatrixIteration(int subdivideDepth, bool showResidual, int minIters, double accuracy)
void SetLaplacianConstraints(void)
static double maxMemoryUsage
Define standard C methods and C++ classes that are common to all methods.
void toPCLPointCloud2(const pcl::PointCloud< PointT > &cloud, pcl::PCLPointCloud2 &msg)
Convert a pcl::PointCloud<T> object to a PCLPointCloud2 binary data blob.
std::vector< ::pcl::Vertices > polygons
::pcl::PCLPointCloud2 cloud
Describes a set of vertices in a polygon mesh, by basically storing an array of indices.