返回「计算机、信息技术与工程」
PCL 贪婪投影三角化:从有向点云生成局部网格
本文目录 5 个章节
PCL 贪婪投影三角化:从有向点云生成局部网格
note · 来源与许可 旧稿是 2014 年 CSDN 文章转载,导出内容未保留明确转载许可,故原转载已移入私有来源归档。本文是依据 PCL 官方教程重新编写的独立摘要;示例接口以 PCL 当前文档为准。PCL 项目使用 BSD 许可证。
算法适用条件
GreedyProjectionTriangulation(GP3)把点与法线投影到局部切平面,在邻域中逐步连接三角形。它适合局部平滑、采样较均匀且法线可靠的无组织点云。
它不是通用“点云一键变网格”方案。以下情况容易失败:
- 噪声和离群点较多;
- 法线方向不一致;
- 密度突变、大孔洞或遮挡严重;
- 薄壁两侧距离小于搜索尺度;
- 尖锐边缘被平滑或误连接。
基本流程
- 清理离群点,并视情况使用 MLS 平滑。
- 估计法线并统一方向。
- 将坐标与法线合并为
pcl::PointNormal。 - 配置搜索半径、邻居数量、角度约束和
mu。 - 生成
pcl::PolygonMesh并检查连通分量与点状态。
#include <pcl/point_types.h>
#include <pcl/search/kdtree.h>
#include <pcl/surface/gp3.h>
pcl::PointCloud<pcl::PointNormal>::Ptr cloud(
new pcl::PointCloud<pcl::PointNormal>);
pcl::search::KdTree<pcl::PointNormal>::Ptr tree(
new pcl::search::KdTree<pcl::PointNormal>);
tree->setInputCloud(cloud);
pcl::GreedyProjectionTriangulation<pcl::PointNormal> gp3;
gp3.setInputCloud(cloud);
gp3.setSearchMethod(tree);
gp3.setSearchRadius(0.03); // 按点间距与几何尺度确定
gp3.setMu(2.5); // 候选搜索半径的自适应系数
gp3.setMaximumNearestNeighbors(100);
gp3.setMaximumSurfaceAngle(M_PI / 4);
gp3.setMinimumAngle(M_PI / 18);
gp3.setMaximumAngle(2 * M_PI / 3);
gp3.setNormalConsistency(false); // 取决于法线方向是否已统一
pcl::PolygonMesh mesh;
gp3.reconstruct(mesh);
示例数值来自官方教程的演示配置,不是所有数据集的推荐值。
调参思路
- 先估计近邻距离分布,再设置
searchRadius,避免直接照搬绝对数值。 mu让搜索尺度随最近邻距离变化,但无法修复极端密度差异。- 邻居上限过低可能形成孔洞,过高会增加错误连接和计算量。
- 表面角与三角形最小/最大角约束用于抑制跨折角连接和瘦长三角形。
- 若法线方向已一致,可根据数据含义配置
normalConsistency;设置错误可能导致连接缺失或方向异常。
结果校验
- 可视化三角形法线、边长和最小角分布。
- 检查薄壁、边界、孔洞和不同连通分量。
- 比较网格到原始点云的距离,防止平滑后几何漂移。
- 对后续需要封闭流形的任务,额外执行拓扑修复;GP3 不保证自动得到水密网格。