一、声明
- 本帖持续更新,如有问题,望指正!
二、简介
基于MLS(Moving Least Squares)的上采样是一种常用的点云处理方法,用于增加稀疏点云数据的密度和细节。MLS上采样通过对点云进行局部拟合,并使用拟合结果生成新的点,从而实现点云的平滑和细节恢复。
MLS上采样的工作流程如下:
- 针对每一个待上采样的点,选择其邻域内的一组最近邻点。
- 对于选定的邻域点集,通过拟合一个平滑的曲面来逼近这些点。常用的拟合方法包括欧式最小二乘法(OLS)和加权最小二乘法(WLS)。
- 根据拟合结果,生成新的采样点。通常是在拟合曲面上均匀采样一定数量的点。
- 重复以上步骤,直到所有待上采样的点都得到处理。
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
r1: mls.setSearchRadius(0.005);
r
2
r_2
r2:mls.setUpsamplingRadius(0.002);
r
3
r_3
r3:mls.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=r | c. 设置 r 1 = 1.5 r r_1=1.5r r1=1.5r |
---|---|---|
![]() | ![]() | ![]() |
c.设置 r 1 = 2 r r_1=2r r1=2r | d. 设置 r 1 = 2.5 r r_1=2.5r r1=2.5r | e. 设置 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.4r | b. 设置 r 2 = 0.8 r r_2=0.8r r2=0.8r | c. 设置 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.1r | b. 设置 r 3 = 0.25 r r_3=0.25r r3=0.25r | c. 设置 r 2 = 0.5 r r_2=0.5r r2=0.5r |
---|---|---|
![]() | ![]() | ![]() |