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
62 template <
typename Po
intNT>
66 template <
typename Po
intNT>
70 template <
typename Po
intNT>
void
75 threads_ = omp_get_num_procs();
84 template <
typename Po
intNT>
template <
int Degree>
void
98 if (solver_divide_ < min_depth_)
100 PCL_WARN (
"[pcl::Poisson] solver_divide_ must be at least as large as min_depth_: %d >= %d\n", solver_divide_, min_depth_);
101 solver_divide_ = min_depth_;
103 if (iso_divide_< min_depth_)
105 PCL_WARN (
"[pcl::Poisson] iso_divide_ must be at least as large as min_depth_: %d >= %d\n", iso_divide_, min_depth_);
106 iso_divide_ = min_depth_;
111 kernel_depth_ = depth_ - 2;
118 int point_count = tree.template setTree<PointNT> (input_, depth_, min_depth_, kernel_depth_, samples_per_node_,
119 scale_, center, scale, confidence_, point_weight_, !non_adaptive_weights_);
125 PCL_DEBUG (
"Input Points: %d\n" , point_count );
136 tree.GetMCIsoTriangles (iso_value, iso_divide_, &mesh, 0, 1, manifold_, output_polygons_);
141 template <
typename Po
intNT>
void
152 execute<1> (mesh, center, scale);
157 execute<2> (mesh, center, scale);
162 execute<3> (mesh, center, scale);
167 execute<4> (mesh, center, scale);
172 execute<5> (mesh, center, scale);
177 PCL_ERROR (stderr,
"Degree %d not supported\n", degree_);
185 for (
int i = 0; i < static_cast<int>(mesh.
inCorePoints.size ()); i++)
203 std::vector<poisson::CoredVertexIndex> polygon;
208 v.
vertices.resize (polygon.size ());
210 for (
int i = 0; i < static_cast<int> (polygon.size ()); ++i)
211 if (polygon[i].inCore )
221 template <
typename Po
intNT>
void
223 std::vector<pcl::Vertices> &polygons)
233 execute<1> (mesh, center, scale);
238 execute<2> (mesh, center, scale);
243 execute<3> (mesh, center, scale);
248 execute<4> (mesh, center, scale);
253 execute<5> (mesh, center, scale);
258 PCL_ERROR (stderr,
"Degree %d not supported\n", degree_);
266 for (
int i = 0; i < static_cast<int>(mesh.
inCorePoints.size ()); i++)
284 std::vector<poisson::CoredVertexIndex> polygon;
289 v.
vertices.resize (polygon.size ());
291 for (
int i = 0; i < static_cast<int> (polygon.size ()); ++i)
292 if (polygon[i].inCore )
302 #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, bool padding)
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.