【点云上采样】基于移动最小二乘(MLS)的上采样

本文介绍了基于MLS的点云上采样技术,如何通过PCL库进行操作,重点讨论了searchRadius,upsamplingRadius和upsamplingStepSize三个参数对点云密度、平滑度和细节恢复的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、声明

  • 本帖持续更新,如有问题,望指正!

二、简介

基于MLS(Moving Least Squares)的上采样是一种常用的点云处理方法,用于增加稀疏点云数据的密度和细节。MLS上采样通过对点云进行局部拟合,并使用拟合结果生成新的点,从而实现点云的平滑和细节恢复。

MLS上采样的工作流程如下:

  1. 针对每一个待上采样的点,选择其邻域内的一组最近邻点。
  2. 对于选定的邻域点集,通过拟合一个平滑的曲面来逼近这些点。常用的拟合方法包括欧式最小二乘法(OLS)和加权最小二乘法(WLS)。
  3. 根据拟合结果,生成新的采样点。通常是在拟合曲面上均匀采样一定数量的点。
  4. 重复以上步骤,直到所有待上采样的点都得到处理。

MLS上采样的结果具有以下特点:

  • 增加点云的密度:通过生成额外的采样点,将原始稀疏点云的密度增加到更高的水平。
  • 平滑点云的表面:由于对每个点进行了局部曲面拟合,MLS上采样可以实现平滑点云的表面,减少形状的噪声和不规则性。
  • 恢复细节:通过在拟合曲面上均匀采样新的点,MLS上采样可以恢复原始点云中的细节信息。

下图所示是使用PCL实现的基于MLS上采样的结果图。

(a)原始点云(b)PCL中基于MLS上采样结果

三、代码

// Create a KD-Tree
pcl::search::KdTree<PointType>::Ptr tree(new pcl::search::KdTree<PointType>);

// Init object (second point type is for the normals, even if unused)
pcl::MovingLeastSquares<PointType, PointType> mls;
mls.setComputeNormals (true);

// Set parameters
mls.setInputCloud(cp_.cloud_);
mls.setPolynomialOrder(3);
mls.setSearchMethod(tree);
mls.setSearchRadius(0.005); // r1

//Upsampling 采样的方法还有 DISTINCT_CLOUD, RANDOM_UNIFORM_DENSITY
mls.setUpsamplingMethod(pcl::MovingLeastSquares<PointType, PointType>::SAMPLE_LOCAL_PLANE); //对点云进行上采样
mls.setUpsamplingRadius(0.002);    // r2
mls.setUpsamplingStepSize(0.0001);  // r3
mls.process(*ocloud_);      //执行采样操作

四、参数理解和讨论

在上述代码中标记了三个半径:
r 1 r_1 r1mls.setSearchRadius(0.005);
r 2 r_2 r2mls.setUpsamplingRadius(0.002);
r 3 r_3 r3mls.setUpsamplingStepSize(0.0001);
下面展示一下这三个参数的效果。请注意下面展示效果的时候 r r r只是参考半径,例如你可以设为点云中最近邻距离最大值等。

r 1 r_1 r1效果

从下面效果图中可以看出 r 1 r_1 r1越大,用于MLS曲面的点越多,从而得到的点云表面越平滑。

a.原始点云b. 设置 r 1 = r r_1=r r1=rc. 设置 r 1 = 1.5 r r_1=1.5r r1=1.5r
c.设置 r 1 = 2 r r_1=2r r1=2rd. 设置 r 1 = 2.5 r r_1=2.5r r1=2.5re. 设置 r 1 = 3 r r_1=3r r1=3r

r 2 r_2 r2效果

从下面效果图中可以看出 r 2 r_2 r2越大,从原始点云的每个点扩展出去的范围越大

a. 设置 r 2 = 0.4 r r_2=0.4r r2=0.4rb. 设置 r 2 = 0.8 r r_2=0.8r r2=0.8rc. 设置 r 2 = 1.5 r r_2=1.5r r2=1.5r

r 3 r_3 r3效果

从下面效果图中可以看出 r 3 r_3 r3越大,采样的步长也越大。

a. 设置 r 3 = 0.1 r r_3=0.1r r3=0.1rb. 设置 r 3 = 0.25 r r_3=0.25r r3=0.25rc. 设置 r 2 = 0.5 r r_2=0.5r r2=0.5r

五、参考

[1] https://blog.51cto.com/u_13157605/6038637

### 如何使用最小二乘法进行点云上采样 #### 移动最小二乘法(MLS)简介 移动最小二乘法(Moving Least Squares, MLS)是一种用于拟合点云表面的技术,通过局部多项式拟合来提高点云的质量和密度。该方法能够生成更均匀和平滑的点云数据,从而为后续处理提供更好的基础[^1]。 #### PCL库中的MLS实现 Point Cloud Library (PCL) 提供了一个名为 `pcl::MovingLeastSquares` 的类,专门用于实施MLS算法。下面是一个完整的代码示例,展示如何利用此功能对点云进行上采样: ```cpp #include <pcl/io/pcd_io.h> #include <pcl/point_types.h> #include <pcl/filters/filter.h> #include <pcl/surface/mls.h> int main(int argc, char** argv) { // 创建并加载原始点云 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); if (pcl::io::loadPCDFile<pcl::PointXYZ>("input.pcd", *cloud) == -1) { PCL_ERROR("Couldn't read file input.pcd \n"); return (-1); } // 创建目标容器存储处理后的点云 pcl::PointCloud<pcl::PointXYZ> mls_points; // 初始化 MovingLeastSquares 对象 pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointXYZ> mls; // 设置输入点云 mls.setInputCloud(cloud); // 设定搜索半径,在这个范围内寻找邻近点来进行曲面重建 mls.setSearchRadius(0.03); // 启用计算法线向量 mls.setComputeNormals(true); // 执行 MLS 处理并将结果保存到 mls_points 中 mls.process(mls_points); // 将处理过的点云保存至文件 pcl::io::savePCDFileASCII("mls_output.pcd", mls_points); std::cout << "Saved " << mls_points.size() << " data points to mls_output.pcd." << std::endl; return 0; } ``` 这段程序首先读取一个`.pcd`格式的点云文件作为输入源,接着配置了MLS处理器的各项参数,最后执行处理操作,并把最终的结果写入新的`.pcd`文件中[^2]。 #### 参数说明 - **setInputCloud**: 指定点云数据集。 - **setSearchRadius**: 定义邻居查找范围内的最大距离;较小值会使得输出更加精细但可能增加噪声敏感度。 - **setComputeNormals**: 是否开启法线估算选项,默认关闭。 - **process**: 应用指定配置运行MLS算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坚果仙人

谢谢!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值