mls算法本质上和最小二乘一样,是一种拟合数据的算法。区别在于mls是局部的,即通过系数向量和基函数分别对数据中不同位置的节点区域进行拟合,需要计算出全部节点域的拟合函数的参数。而传统的最小二乘是全局的,采用所有的数据进行最小化平方和,不能过滤掉噪声点。
对于二维数据点,其拟合公式如下:
其中:
w为权函数,一般采用三次样条曲线,如果权函数为常量,则为一般的加权最小二乘算法。
n表示为包含在权函数w支持域中的节点数。
p(x)表示基函数,对于不同的数据维度和需要拟合的目标可以选择不同阶数的基函数。
a(x)表示系数向量,我们最后就需要计算出a向量的值。
u表示在x处的取值。
J表示在节点x位置的模型函数。
计算流程可以分为三步:
pcl::search::KdTree<pcl::PointXYZ>::Ptr kd_tree(new pcl::search::KdTree<pcl::PointXYZ>);
//法线
pcl::PointCloud<pcl::PointNormal>::Ptr normal(new pcl::PointCloud<pcl::PointNormal>);
//实例化移动最小二乘类
pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
mls.setInputCloud(cloud);
mls.setComputeNormals(true);
mls.setPolynomialFit(true);
mls.setPolynomialOrder(2); //设置多项式阶数
mls.setSearchMethod(kd_tree);
mls.setSearchRadius(0.05); //设置kdtree搜索半径
mls.setNumberOfThreads(4);
mls.process(*normal); //使用mls方法计算法线并进行曲面重建
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree;
UpSample.setSearchMethod(tree);
UpSample.setSearchRadius(0.1);
//移动最小二乘
UpSample.setUpsamplingMethod(pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointXYZ>::SAMPLE_LOCAL_PLANE);
UpSample.setUpsamplingRadius(0.04);
UpSample.setUpsamplingStepSize(0.02);
UpSample.process(*CloudUp);