Surface-1 PCL学习记录-6 Moving Least Squares (MLS) ( 平滑处理-基于多项式拟合的法线估计+点云平滑和数据重采样)功能及用法解析

      曲面重建技术在逆向工程、数据可视化、机器视觉、虚拟现实、医疗技术等领域中得到了广泛的应用 。 例如,在汽车、航空等工业领域中,复杂外形产品的设计仍需要根据手工模型,采用逆向工程的手段建立产品的数字化模型,根据测量数据建立人体以及骨骼和器官的计算机模型,在医学、定制生产等方面都有重要意义 。

      除了上述传统的行业,随着新兴的廉价 RGBD 获取设备在数字娱乐行业的病毒式扩展,使得更多人开始使用点云来处理对象并进行工程应用 。 根据重建曲面和数据点云之间的关系,可将曲面重建分为两大类:插值法和逼近法。前者得到的重建曲面完全通过原始数据点,而后者则是用分片线性曲面或其他形式的曲面来逼近原始数据点,从而使得得到的重建曲面是原始点集的一个逼近曲面。

      关联知识:

      Search、KdTree、Octree 

      来源链接:http://robot.czxy.com/docs/pcl/chapter04/resampling/

 


一.基于移动最小二乘法(MLS)的平滑和法线估计

     问题来源:有时,测量较小的对象时会产生一些误差,这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使重建的曲面不光滑或者有漏洞。而且,这些不规则的缺陷很难用统计分析的方法进行消除,所以为了建立完整并且可用的点云模型,必须对表面进行平滑处理和漏洞修复。在不能进行额外扫描的情况下(也就是仅依靠已有数据的情况下),可以通过对数据进行重采样来解决这一个问题。重采样的算法通过对周围数据点进行高阶多项式的插值来重建表面缺少的部分。(主要功能是平滑表面,重建不光滑和漏洞,以便后边查找法向正常)

    除此之外,多个扫描点的扫描结果配准后得到的数据直接拿来进行曲面重建会产生“双墙”等人造伪数据,即某快区域会出现重叠的两个曲面,使用重采样的方法同样可以处理这个问题。

   实现例子:可以看到以下两个图片,分别表示的是两组点云数据配准后得到的数据集的表面法向估计的结果,由于配准造成的误差,可以看到左侧图片的发想值有非常严重噪声。右图是经过MLS点云平滑之后所得到的结果,明显比左侧图片准确很多。对比重采样前后的曲率特征方差很大,平滑后的方差相对较小。

                      

二.使用体素网格进行降采样代码

 

//#include <ros/ros.h>
#include <iostream>
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/mls.h>
#include <pcl/io/io.h>
#include <pcl/visualization/cloud_viewer.h>

int main(int argc,char ** argv){
    //MLS:MoveingLeastSquares(动态最小二乘法,后续查看API得知底层算法)
    //Step1:首先创建点云对象,并将PCD文件加载到点云文件中
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    pcl::io::loadPCDFile("bun0.pcd",*cloud); //注意,cloud是指针类型变量,要向指针内地址存数据,需要用*

    //Step2:由于MLS算法是基于KDTree实现的,所以需要创建KDTree对象
    pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
 
    //Step3: 由于MLS功能包会同时计算点云的法向,因此创建一个用来存储包含法向信息的点云对象
    pcl::PointCloud<pcl::PointNormal> mls_points;

    //Step4:创建MLS对象
    /*
      注意! MovingLeastSquares模板类的第一个参数:将要被处理的点云类型,在输出这个模板类的时候,点云XYZ内容将被平滑;
                                     第二个参数:输出只包含法线的点云。
    */
    pcl::MovingLeastSquares<pcl::PointXYZ,pcl::PointNormal> mls;

    //Step5:设置是否使用多项式拟合提高精度
    mls.setPolynomialFit(true);

    //Step6: 使用MLS进行平顺
    mls.setInputCloud(cloud);
    mls.setPolynomialOrder(2);  //设置多项式的最高阶数为2阶?
    mls.setSearchMethod(tree);  
    mls.setSearchRadius(0.03);  //设置在进行Kdtree中K邻域,的查找半径

    mls.process(mls_points);

    //Step7:存储点云到PCD文件
    pcl::io::savePCDFile("bun0_mls.pcd",mls_points);

    std::cerr <<" MLS completed, please check the viewer and PCD file for detail." <<std::endl;

    //Step:Extra 显示点云
    pcl::visualization::CloudViewer viewer("Cloud Viewer");
    //这里会一直阻塞直到点云被渲染
    viewer.showCloud(cloud);

        // 循环判断是否退出
    while (!viewer.wasStopped()) {
        // 你可以在这里对点云做很多处理
    }

return 0;
}

注意!以上例程输入的点云数据是pcl::PointXYZ格式的点云,而输出的是带有法向信息的pcl::PointNormal

效果如下(由于点云输入文件问题,处理后效果不是很明显,勉强能看到右侧的点云相较于左侧点云,略微平顺)

 

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
点云数据平滑拟合是一种重要的点云处理方法,可以减少噪声和不规则形状的影响,提取出点云数据中的主要特征。而基于b样条曲线的方法就是其中一种常用的平滑拟合方法。 在点云数据平滑拟合中,基于b样条曲线的方法通过将点云数据分段连接,使用多个b样条曲线来逼近原始数据点的形状。首先,需要将点云数据按照一定的规则划分为多个小段,每个小段内的点云数据数量不宜过多。接下来,通过在每个小段上建立b样条曲线,并拟合该部分点云数据。 基于b样条曲线的方法在点云数据平滑拟合中的优势主要体现在以下几个方面: 1. 高度拟合精度:b样条曲线是一种高阶曲线拟合方法,可以更好地逼近原始数据。通过调整b样条的控制点和权重,可以使得曲线更贴近点云数据的实际形状。 2. 平滑性:b样条曲线对于原始数据中的噪声和不规则形状具有较好的平滑性。拟合后的曲线能够保持原始数据的主要特征,并抑制孤立的噪声点。 3. 参数化表示:b样条曲线具有参数化的特点,可以通过调整参数控制整个曲线的形状。这使得在处理点云数据时可以对曲线进行灵活的调整,以获取更好的平滑效果。 需要注意的是,基于b样条曲线的点云数据平滑拟合方法虽然具有较好的效果,但也存在一定的局限性。例如,在处理大规模点云数据时可能会遇到较大的计算量和内存占用问题。此外,需要对b样条曲线的参数进行合理选择和调整,以获得更好的拟合结果。因此,在应用该方法时需要综合考虑实际需求和计算资源的限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值