基于PCL三维曲面重建

原创 2016年05月17日 20:31:39

前言

曲面重建可以用于逆向工程、数据可视化、自动化建模等领域。本文希望能够将曲面重建运用在点云分割后的显示上,以增强点云分割后的可视化效果。
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::io::loadPCDFile("bun0.pcd", 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)
    gp3.setSearchRadius(0.025);

    // 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);

    // Additional vertex information
    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->addPolygonMesh(triangles, "triangles");

    viewer->addCoordinateSystem(1.0);
    viewer->initCameraParameters();
    while (!viewer->wasStopped()){
        viewer->spinOnce(100);
        boost::this_thread::sleep(boost::posix_time::microseconds(100000));
    }


    // 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)

在测量较小的数据时会产生一些误差,这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使得重建的曲面不光滑或者有漏洞,可以采用对数据重采样来解决这样问题,通过对周围的数据点进行高阶多项式插值来重建表...

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

转自:http://www.cnblogs.com/bozhicheng/p/5800874.html Poisson曲面重建算法 PCL-1.8测试通过 代码: #include ...

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

PCL库初步使用(1):小试牛刀

本次试验的目的是利用PCL库来重建地形点云数据,并进行显示。总体流程是1)把DEM数据导入PCL的数据格式.pcd文件中;2)进行法向量估计;3)重建曲面;4)三维显示。     1)写入pcd文件...
  • vbskj
  • vbskj
  • 2012年08月01日 20:23
  • 17164

PCL 室内三维重建

PCL 室内三维重建 http://blog.csdn.net/jinshengtao/article/details/48917263 分类: Kinect开发2015-...

PCL 室内三维重建

手头有三个prime sensor摄像头,分别固定在不同角度,打算根据RGBD信息,将三个摄像头的点云数据拼接起来。设备限制+能力不足,一直没有把point cloud library 1.8环境搭建...

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

从完全不知到弄出结果用了好几天的时间,虽然结果还不是很理想,但也值得纪念一下,总结一下过程中出现的问题。 按照上一篇博客中的算法代码(如下)就可以,问题处在pcd文件上,pcd文件有固定的书写格式,...

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

PCL系列 PCL系列——读入PCD格式文件操作 PCL系列——将点云数据写入PCD格式文件 PCL系列——拼接两个点云 PCL系列——从深度图像(RangeImage)中提取NARF关键点 PCL系...

点云三维重建有关原理

点云三维重建有关原理 分类: 点云三维重建2014-01-17 17:10 2158人阅读 评论(0) 收藏 举报 PCL3d 目录(?)[+]  ...
  • zkl99999
  • zkl99999
  • 2015年09月29日 13:34
  • 10336

个人项目-点云处理应用-PCLStudio

代码地址https://github.com/jiangjiangli1013/PCLStudio 基于PCL点云库和Qt框架的点云处理应用,可跨平台运行,已实现点云去噪、平滑、曲面重建、可视化等功...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于PCL三维曲面重建
举报原因:
原因补充:

(最多只允许输入30个字)