原文链接:

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并非完全并行化,即部分算法仅在单个线程上运行。
     
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐