PCL学习笔记(三十二)-- 基于多项式平滑点云及法线估计的曲面重建

一、简介

    在测量较小的对象时会产生一些误差,这些误差所造成的不规则数据如果直接拿来进行曲面重建的话会使重建的曲面不光滑或者而有漏洞。这些不规则很难用统计分析消除,所以为了建立完整的模型必须对表面进行平滑处理和漏洞修复。在不能进行额外扫描的情况下,可以通过对数据重采样来解决这一问题,重采样算法通过对周围数据点进行高阶多项式插值来重建表面缺少的部分。此外,由多个扫描点扫描结果配准后得到的数据直接拿来曲面重建的话会产生“双墙”等人造伪数据,即某块区域会出现重叠的两个曲面。重采样算法也可以对这个问题进行处理

二、代码分析

    1)进行法线估计,如果不需要法线估计,就跳过这一步:

  mls.setComputeNormals (true);

    2)定义最小二乘实现的对象mls:

  pcl::MovingLeastSquares mls;

    3)可以通过不需要多项式拟合来加快平滑速度,设置为ture时则整个算法运行时采用多项式拟合来提高精度(最新的pcl已不再支持setPolynomialOrder):

  //mls.setPolynomialOrder(true);

    4)整体代码如下:

#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char** argv)
{
	pcl::PointCloud::Ptr cloud(new pcl::PointCloud());
	pcl::io::loadPCDFile("bun0.pcd", *cloud);
	pcl::search::Search::Ptr tree = std::shared_ptr>(new pcl::search::KdTree);
	pcl::PointCloud mls_points;
	pcl::MovingLeastSquares mls;			//利用移动最小二乘法完成滤波
	mls.setComputeNormals(true);											//设置是否计算法线
	mls.setInputCloud(cloud);												//设置输入的点云
	mls.setSearchMethod(tree);												//设置搜索方式
	mls.setSearchRadius(0.06);												//设置搜索的半径
	mls.process(mls_points);												//进行曲面重建
	pcl::io::savePCDFile("bun0-mls.pcd", mls_points);
}

三、编译结果

    1)编译前可视化效果:

PCL学习笔记(三十二)-- 基于多项式平滑点云及法线估计的曲面重建_第1张图片

    2)编译后可视化效果:

PCL学习笔记(三十二)-- 基于多项式平滑点云及法线估计的曲面重建_第2张图片

你可能感兴趣的:(PCL学习笔记,PCL)