『表面』MLS(MovingLeastSquares)平滑点云

背景

在测量较小的对象时会产生一些误差,这误差所造成的不规则数据如果直接拿来进行曲面重建的话会使得重建的曲面不光滑或而有漏洞。

MLS算法原理

基于最小二乘法(Least Squares)将点云数据进行多项拟合,并使用拟合的结果对点云进行平滑处理。

MLS算法与高斯滤波在平滑点云方面的差别

高斯滤波基于高斯函数,它会给每个点的领域点分配一个权重。然后通过将邻域点的坐标进行加权平均来实现平滑。这种方法简单快速,并且可以减少点云中的噪声,但它对点云中的不规则处理不够好,边缘细节可能会模糊。

MLS算法则更加复杂一些。它通过对点云数据进行多项式拟合,找到一个适合该点云局部取于的函数曲线。然后通过这个曲线来重新计算每个点的坐标,从而实现点云的平滑处理。这种方法可以更好地处理点云中的不规则形和非均匀性,提供更准确的平滑结果。

总之,高斯滤波是一种简单而快速的方法,适合噪声较少的点云,金额一帮助平滑点云表面。而MLS算法更复杂,适用于更复杂的点云平滑任务,可以更好地处理不规则性和非均匀性,并提供准确的平滑结果。

代码:

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

// -----------------------------------------------------------
// 使用PCL库中的MovngLeastSquares算法对输入的点云数据进行平滑和法线估计
// ------------------------------------------------------------

int main(){
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);

    if (pcl::io::loadPCDFile("/home/jason/file/pcl-data/data/tutorials/ism_train_cat.pcd",
                             *cloud) < 0){
        std::cout << "cloud point read err!" << std::endl;
        return -1;
    }

//    pcl::search::Kdtree,<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);

    pcl::search::Search<pcl::PointXYZ>::Ptr tree = std::shared_ptr<pcl::search::Search<pcl::PointXYZ>>(new pcl::search::KdTree<pcl::PointXYZ>); // 新建KdTree搜索对象,用于后续最近邻搜索

    pcl::PointCloud<pcl::PointNormal> mls_points; // 用于存储经过MovingLeastSquares算法处理后点云及法线信息

    pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls; // 创建MovingLeastSquares对象,用于执行平滑和法线估计操作

    mls.setComputeNormals(true); // 设置进行法线估计

    mls.setInputCloud(cloud); // 输入点云
    mls.setPolynomialOrder(2); // 多项式的阶数为2
    mls.setSearchMethod(tree);// 设置最近邻搜索方法为之前创建的KdTree对象
    mls.setSearchRadius(0.03); // 设置i半径为0.03

    mls.process(mls_points); // 执行MovingLeatSqures算法

    // 保存处理后的点云数据和法线信息
    if(mls_points.size() > 0){
        pcl::io::savePCDFileASCII("/home/jason/file/pcl-learning/11surface表面/1基于多项式重构的平滑和法线估计/result.pcd", mls_points);
    }else {
        std::cout << "算法结果:" << mls_points.size() << std::endl;
        std::cout << "保存数据为空." << std::endl;
    }
    pcl::visualization::CloudViewer viewer("cloud Viewer");
    viewer.showCloud(cloud);


    while (!viewer.wasStopped()) {

    }
}

参考:

PCL学习笔记(三十二)-- 基于多项式平滑点云及法线估计的曲面重建_pcl::pointnormal的生成_看到我请叫我学C++的博客-CSDN博客

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
点云处理中,点云上采样是指通过添加额外的点来增加点云的密度。为了实现点云上采样,我们可以使用一种被称为最近邻搜索(Nearest Neighbor Search)的方法来估计新点的位置。 MLS(Moving Least Squares)是一种常用的点云上采样方法。它基于小领域内的点进行插值,并通过拟合一个局部曲面来估计插值点的位置。 具体步骤如下: 1. 选择一个点作为目标点,并确定其半径为$r$的领域。 2. 根据领域内的点进行最小二乘拟合,获得曲面(通常是一个平面)的法向量和拟合误差。 3. 将目标点的位置投影到曲面上,得到新的点位置。 4. 重复以上步骤,直到所有点都被处理。 MLS的优点在于能够保留原始点云的曲面特征,并且可以根据实际需求进行参数调整。此外,它还可以用于点云数据的平滑处理,在噪声较大的情况下有较好的效果。 然而,MLS也有一些限制。首先,它在进行最小二乘拟合时,假设曲面是局部线性的。因此,对于弯曲或高度变化较大的曲面,插值的效果可能不太理想。其次,MLS的计算复杂度较高,特别是处理大规模点云时,会消耗较多时间和计算资源。 综上所述,MLS是一种常用的点云上采样方法,通过拟合局部曲面来估计新点的位置。它能够较好地保留原始点云曲面特征,但对于弯曲或高度变化较大的面可能效果受限。此外,MLS的计算复杂度较高,需要较多时间和计算资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值