PCL教程-点云表面重建之使用移动最小二乘法(MLS)

本文介绍了如何使用移动最小二乘法(MLS)对点云数据进行平滑和重采样,以消除噪声和不规则性。通过在点云数据上应用MLS算法,可以创建更平滑的表面模型,并减少距离测量误差。提供的代码示例展示了如何使用PCL库实现这一过程,包括加载点云数据、设置参数和保存处理结果。实验结果显示,处理后的点云更加平滑,噪点显著减少。

原文链接:

Smoothing and normal estimation based on polynomial reconstruction — Point Cloud Library 0.0 documentationhttps://pcl.readthedocs.io/projects/tutorials/en/latest/resampling.html#moving-least-squares

在本篇教程中,将使用移动最小二乘法(MLS)表面重建的方式对噪点数据进行平滑和重采样。

使用统计分析很难消除某些数据不规则性(由较小的距离测量误差引起)。要创建完整的模型,必须考虑光滑的表面以及数据中的遮挡。在无法获取其他扫描的情况下,一种解决方案是使用重采样算法,该算法尝试通过周围数据点之间的高阶多项式插值来重新创建表面的缺失部分。通过执行重采样,可以纠正这些小的错误,并且可以将多个扫描记录在一起执行平滑操作合并成同一个点云。

在上图的左侧,我们在包含两个配准点云的数据集中看到了配准后的效果及表面法线估计。由于对齐错误,所产生的法线有噪声。在右侧,使用移动最小二乘法对表面法线估计进行平滑处理后,在同一数据集中看到了该效果。绘制每个点的曲率,作为重新采样前后特征值关系的度量,我们得到: 

为了逼近由点p1, p2 pk在点q处的局部邻域定义的曲面,我们使用了一个二元多项式高度函数,定义在一个稳健计算的参考平面上。

实验结果

原始点云:

经过MLS表面重建后的点云: 

 可以看到处理后的点云更加平滑,噪点也更少了。

程序代码

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/mls.h>
#include<pcl/visualization/cloud_viewer.h>
int
main (int argc, char** argv)
{// 将一个适当类型的输入文件加载到对象PointCloud中
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
  
  // 加载bun0.pcd文件,加载的文件在 PCL的测试数据中是存在的 
  pcl::io::loadPCDFile ("D://PCLProject//pcl-project//cloud_sampling//maize.pcd", *cloud);
  // 创建一个KD树
  pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
  // 输出文件中有PointNormal类型,用来存储移动最小二乘法算出的法线
  pcl::PointCloud<pcl::PointNormal> mls_points;
  // 定义对象 (第二种定义类型是为了存储法线, 即使用不到也需要定义出来)
  pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
  mls.setComputeNormals (true);
  //设置参数
  mls.setInputCloud (cloud);
  mls.setPolynomialFit (true);
  mls.setSearchMethod (tree);
  mls.setSearchRadius (0.03);
  // 曲面重建
  mls.process (mls_points);
  // 保存结果
  pcl::io::savePCDFile ("bun0-mls.pcd", mls_points);

  pcl::visualization::CloudViewer viewer("Cloud Viewer");;
  viewer.showCloud(cloud);
  while (!viewer.wasStopped()) {
  }
}	

关键代码

pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
  mls.setComputeNormals (true);
  //设置参数
  mls.setInputCloud (cloud);
  mls.setPolynomialFit (true);
  mls.setSearchMethod (tree);
  mls.setSearchRadius (0.03);
  // 曲面重建
  mls.process (mls_points);

MovingLeastSquares表示 MLS (Moving Least Squares) 算法的实现,用于数据平滑和改进的正态估计。它还包含基于参数拟合的对结果云进行上采样的方法。

参考论文: "Computing and Rendering Point Set Surfaces" by Marc Alexa, Johannes Behr,
 Daniel Cohen-Or, Shachar Fleishman, David Levin and Claudio T. Silval

链接:www.sci.utah.edu/~shachar/Publications/crpss.pdf

注意:

  • 处理步骤有一个并行版本,使用OpenMP标准。
  • 与标准版本相比,在运行时和内存使用方面产生了开销。
  • 上采样方法DISTINCT CLOUD和VOXEL GRID DILATION并非完全并行化,即部分算法仅在单个线程上运行。
     
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值