基于PCL三维曲面重建

前言

PCL中目前实现了多种基于点云的曲面重建算法，如：泊松曲面重建、贪婪投影三角化、移动立方体、EarClipping等算法。下面我将对泊松曲面重建算法和贪婪投影三角化算法进行介绍，具体算法的原理这里就不过多介绍了，只将代码和实验效果贴出共大家交流学习。

http://pointclouds.org/documentation/tutorials/greedy_projection.php#greedy-triangulation

贪婪投影三角化算法

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/gp3.h>
#include <pcl/visualization/pcl_visualizer.h>

int
main(/*int argc, char** argv*/)
{
// Load input file into a PointCloud<T> with an appropriate type
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
pcl::PCLPointCloud2 cloud_blob;
pcl::fromPCLPointCloud2(cloud_blob, *cloud);
//* the data should be available in cloud

// Normal estimation*
pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> n;
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud(cloud);
n.setInputCloud(cloud);
n.setSearchMethod(tree);
n.setKSearch(20);
n.compute(*normals);
//* normals should not contain the point normals + surface curvatures

// Concatenate the XYZ and normal fields*
pcl::PointCloud<pcl::PointNormal>::Ptr cloud_with_normals(new pcl::PointCloud<pcl::PointNormal>);
pcl::concatenateFields(*cloud, *normals, *cloud_with_normals);
//* cloud_with_normals = cloud + normals

// Create search tree*
pcl::search::KdTree<pcl::PointNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointNormal>);
tree2->setInputCloud(cloud_with_normals);

// Initialize objects
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
pcl::PolygonMesh triangles;

// Set the maximum distance between connected points (maximum edge length)

// Set typical values for the parameters
gp3.setMu(2.5);
gp3.setMaximumNearestNeighbors(100);
gp3.setMaximumSurfaceAngle(M_PI / 4); // 45 degrees
gp3.setMinimumAngle(M_PI / 18); // 10 degrees
gp3.setMaximumAngle(2 * M_PI / 3); // 120 degrees
gp3.setNormalConsistency(false);

// Get result
gp3.setInputCloud(cloud_with_normals);
gp3.setSearchMethod(tree2);
gp3.reconstruct(triangles);

std::vector<int> parts = gp3.getPartIDs();
std::vector<int> states = gp3.getPointStates();

boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("3D Viewer"));
viewer->setBackgroundColor(0, 0, 0);

viewer->initCameraParameters();
while (!viewer->wasStopped()){
viewer->spinOnce(100);
}

// Finish
return (0);
}

viewer->addPolylineFromPolygonMesh(triangles);

泊松曲面重建算法

    pcl::Poisson<pcl::PointNormal> pn;
pn.setConfidence(false);
pn.setDegree(2);
pn.setDepth(8);
pn.setIsoDivide(8);
pn.setManifold(false);
pn.setOutputPolygons(false);
pn.setSamplesPerNode(3.0);
pn.setScale(1.25);
pn.setSolverDivide(8);
pn.setSearchMethod(tree2);
pn.setInputCloud(cloud_with_normals);
pcl::PolygonMesh mesh;
pn.performReconstruction(mesh);

PCL点云曲面重建（1）

2017-04-11 13:54:34

PCL系列——三维重构之泊松重构

2016-04-01 09:35:09

pcl实现的曲面重建（包括泊松，贪婪三角，移动立方体算法）

2015年11月16日 31.83MB 下载

pcl曲面重建模块-poisson重建算法示例

2017-04-16 16:05:27

PCL 室内三维重建

2015-10-06 22:03:30

泊松曲面重建

2016-08-05 09:50:23

PCL实现泊松表面重建

2016-05-14 08:49:34

PCL-泊松重建

2016-01-02 20:13:19

Meshlab读取三维点云、三维点云重建以及三维点云法向量计算

2017-05-27 09:38:57

VTK修炼之道56：图形基本操作进阶_表面重建技术（三维点云曲面重建）

2018-04-06 22:05:55