PCL Possion泊松表面重建(Surface_Poisson)

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.结果展示

原始点云

重建结果

三维泊松表面重建是一种常用的点云数据处理方法,可以将离散的点云数据重建成连续的三维表面模型。PCL(Point Cloud Library)是一个开源的点云处理库,提供了许多实用的算法和工具函数,包括三维泊松表面重建算法。 在PCL中使用三维泊松表面重建算法,你可以按照以下步骤进行操作: 1. 使用PCL加载点云数据:首先,你需要使用PCL库中的函数将点云数据加载到程序中。可以使用`pcl::io::loadPCDFile()`函数加载`.pcd`格式的点云文件,或者使用其他合适的函数加载其他格式的点云数据。 2. 对点云进行预处理:在进行泊松表面重建之前,有时需要对点云进行预处理,例如去除离群点、滤波等。PCL提供了许多预处理的方法,可以根据具体情况选择合适的方法进行处理。 3. 执行三维泊松表面重建:使用`pcl::Poisson`类可以进行三维泊松表面重建。你需要创建一个`pcl::Poisson`对象,并将预处理后的点云数据传递给它。然后,调用`performReconstruction()`函数执行重建过程。 4. 获取重建的三维模型:重建完成后,你可以使用`pcl::PolygonMesh`对象来获取重建的三维模型。可以使用`pcl::toPCLPointCloud2()`函数将重建的模型转换为点云格式,或者直接保存为`.ply`等格式的文件。 需要注意的是,三维泊松表面重建是一个计算密集型的算法,对于大规模的点云数据可能需要较长的运行时间。此外,泊松表面重建的结果可能受到输入点云的质量和密度等因素的影响,需要根据具体情况进行调整和优化。 希望以上信息对你有帮助!如果你还有其他问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值