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

从完全不知到弄出结果用了好几天的时间,虽然结果还不是很理想,但也值得纪念一下,总结一下过程中出现的问题。

按照上一篇博客中的算法代码(如下)就可以,问题处在pcd文件上,pcd文件有固定的书写格式,可以按程序生成,也可以自己写,只要格式没问题即可。

接下来就是储存位置问题,pcd文件要和可执行文件即.exe文件放在同一文件夹下。运行程序,即可看到输出结果。

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/vtk_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>
#include <boost/thread/thread.hpp>
#include <fstream>
#include <iostream>
#include <stdio.h>
#include <string.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>);


 

### 贪婪投影三角剖分的表面重建方法 #### 方法概述 贪婪投影三角化算法是一种高效的点云数据处理技术,主要用于从无序点云中生成连续的三角网格。此算法的核心思想是将三维点云映射至二维空间,在二维平面上执行Delaunay三角剖分后再将其转换回三维空间[^1]。 #### 实现步骤详解 以下是贪婪投影三角化的具体实现细节: 1. **计算法向量** 首先需要估算输入点云中每一点的局部法线方向。这一步骤对于后续的点云投影至关重要,因为法线决定了点如何被投射到二维平面[^2]。 2. **点云投影** 利用第一步获得的法线信息,将所有的三维点投影到一个选定的二维平面上。这个过程可以看作是从特定视角观察整个点云并记录下每个点的位置坐标[^2]。 3. **Delaunay三角剖分** 对于已经投影后的二维点集合应用经典的Delaunay三角划分策略。这种方法能够保证所形成的三角形尽可能接近正则形状,从而减少畸变现象的发生[^2]。 4. **恢复三维结构** 最后依据之前保存下来的对应关系把第二步产生的二维三角网重新拉伸回到原来的三维空间位置处形成最终的目标物体表面表示形式——即所谓的“曲面模型”。这一阶段还需要考虑一些额外因素比如角度阈值设置等参数调整来优化结果质量[^2]。 #### 示例代码展示 下面提供了一段利用PCL库实现上述功能的C++程序样例供参考学习之用: ```cpp #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/surface/gp3.h> int main () { pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>); // 加载点云文件 if (pcl::io::loadPCDFile<pcl::PointXYZ> ("test_pcd.pcd", *cloud) == -1) { PCL_ERROR ("Couldn't read file test_pcd.pcd \n"); return (-1); } std::vector<int> indices; pcl::removeNaNFromPointCloud(*cloud, *cloud, indices); pcl::NormalEstimation<pcl::PointXYZ, pcl::Normal> ne; pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>); ne.setSearchMethod(tree); ne.setInputCloud(cloud); pcl::PointCloud<pcl::Normal>::Ptr normals(new pcl::PointCloud<pcl::Normal>()); ne.setRadiusSearch(0.03); ne.compute(*normals); pcl::concatenateFields (*cloud, *normals, *cloud_with_normals); pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3; pcl::PolygonMesh triangles; gp3.setSearchRadius (0.025); gp3.setMaximumNearestNeighbors (100); gp3.setMinimumAngle (10); gp3.setMaximumAngle (120); gp3.setMu (2.5); gp3.setNumberOfThreads (4); gp3.setInputCloud (cloud_with_normals.makeShared ()); gp3.reconstruct(triangles); pcl::io::saveVTKFile("triangular_mesh.vtk", triangles); return 0; } ``` #### 参数解释 - `setSearchRadius`: 定义搜索半径范围内的邻居节点数作为候选集大小。 - `setMaximumNearestNeighbors`: 设置最大允许最近邻数量上限值,默认推荐取值区间为[50~100]. - `setMinimumAngle` & `setMaximumAngle`: 控制生成三角形单元内部夹角约束条件,防止出现过尖锐或者扁平的情况发生。 - `setMu`: 平滑因子调节项,数值越大越倾向于保持原有几何特征不变;反之,则更强调简化效果。 - `setNumberOfThreads`: 多核处理器环境下指定并发运行线程数目加速运算效率提升性能表现. ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值