PCL专栏目录及须知
1.原理介绍
2.完整代码
#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/io/ply_io.h>
#include <pcl/point_types.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/features/normal_3d.h>
#include <pcl/surface/poisson.h>
#include <boost/thread/thread.hpp>
#include <pcl/visualization/pcl_visualizer.h>
int main()
{
/****************泊松重建********************/
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>); // 源点云
pcl::io::loadPCDFile("D:/code/csdn/data/bunny2.pcd", *cloud);
// 计算法线
pcl::NormalEstimation<pcl::PointXYZRGB, pcl::Normal> n;
pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>);
n.setInputCloud(cloud);
n.setSearchMethod(tree);
n.setKSearch(20); // k邻域搜索范围
pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>);
n.compute(*normals);
pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr cloudNormals(new pcl::PointCloud<pcl::PointXYZRGBNormal>); // 连接点云及法向量
pcl::concatenateFields(*cloud, *normals, *cloudNormals);
// 泊松重建
pcl::search::KdTree<pcl::PointXYZRGBNormal>::Ptr tree2(new pcl::search::KdTree<pcl::PointXYZRGBNormal>);
tree2->setInputCloud(cloudNormals);
pcl::Poisson<pcl::PointXYZRGBNormal> segmentation;
segmentation.setSearchMethod(tree2);
segmentation.setInputCloud(cloudNormals);
segmentation.setDepth(6); // 将用于表面重建的树的最大深度
segmentation.setMinDepth(2);
segmentation.setScale(1.25); // 用于重建的立方体的直径与样本的边界立方体直径的比值
segmentation.setSolverDivide(3); // 块高斯-塞德尔求解器用于求解拉普拉斯方程的深度。
segmentation.setIsoDivide(6); // 块等表面提取器用于提取等表面的深度
segmentation.setSamplesPerNode(10); // 每个八叉树节点上最少采样点数目
segmentation.setConfidence(false); // 置信标志,为true时,使用法线向量长度作为置信度信息,false则需要对法线进行归一化处理
segmentation.setManifold(false); // 流行标志,如果设置为true,则对多边形进行细分三角话时添加重心,设置false则不添加
segmentation.setOutputPolygons(false); // 是否输出为多边形(而不是三角化行进立方体的结果)。
pcl::PolygonMesh triangles; // 存储最终三角化的网格模型
segmentation.performReconstruction(triangles);
pcl::io::savePLYFile("D:/code/csdn/data/bunny6.ply", triangles);
/****************展示********************/
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer(new pcl::visualization::PCLVisualizer("GridProjection"));
viewer->addPointCloud(cloud, "cloud");
boost::shared_ptr<pcl::visualization::PCLVisualizer> viewer0(new pcl::visualization::PCLVisualizer("GridProjection0"));
// viewer0->setBackgroundColor(255, 255, 255);
viewer0->addPolygonMesh(triangles, "triangles");
viewer0->setRepresentationToWireframeForAllActors(); // 网格模型以线框图模式显示
while (!viewer->wasStopped() || !viewer0->wasStopped())
{
viewer->spinOnce(100);
viewer0->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(100000));
}
return (0);
}
3.结果展示
原始点云
重建结果