# 基于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）

• u013019296
• 2017年04月11日 13:54
• 1372

## 基于Kinect v2+PCL的模型奶牛重建（下）——点云融合

• u010848251
• 2017年04月30日 16:15
• 1584

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

1.点云重建 虽然Delaunay三角剖分算法可以实现网格曲面重建，但是其应用主要在二维剖分，在三维空间网格生成中遇到了问题。因为在三维点云曲面重建中，Delaunay条件不在满足，不仅基于...
• shenziheng1
• 2017年02月05日 14:31
• 2333

## 基于图像的三维重建与基于三维点云数据的曲面拟合

• piaoxuezhong
• 2017年04月07日 13:50
• 2551

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

• Alan_1550587588
• 2017年04月16日 16:05
• 1008

## 用PCL进行点云的表面重建，用贪婪投影三角法进行网格化

• wkxxuanzijie920129
• 2016年05月14日 09:57
• 5099

## PCL——泊松表面重建

pcl库中有很多3为表面重建方法，下面是泊松表面重建的代码： //点的类型的头文件 #include //点云文件IO（pcd文件和ply文件） #include #include //kd树...
• y3254321
• 2017年05月15日 16:07
• 803

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

• 2015年11月16日 19:17
• 31.83MB
• 下载

## PCL 室内三维重建

• jinshengtao
• 2015年10月06日 00:00
• 7068

## PCL KinFusion配置 三维重建

• peng825223208
• 2014年08月09日 20:19
• 2826

举报原因： 您举报文章：基于PCL三维曲面重建 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)