PCL曲面重建——移动最小二乘法

MovingLeastSquares

不同于传统的最小二乘法,使用结果在全局去拟合出一个最优解。MLS针对每个目标点,在其领域上去拟合得到一个最佳曲面。并且能够在拟合得到的平面上使用高阶多项式进行插值得到补全后的点云。

算法流程

  1. 对点云中的每一个点,在其周围查找一定范围内的邻域点集,邻域通常通过固定搜索半径或 K 近邻方式获得。
  2. 利用邻域点集计算一个局部参考平面,该平面用于表示当前点附近表面的整体趋势,并确定局部法线方向。
  3. 将邻域点投影到局部参考平面上,在平面内建立二维局部坐标系,把三维问题转化为二维问题。
  4. 在局部坐标系中,采用加权最小二乘方法拟合一个光滑的局部曲面,通常使用低阶或二次多项式来近似真实表面。
  5. 将当前点投影到拟合得到的局部曲面上,得到新的平滑点位置,必要时在曲面上进行重采样,生成更加均匀、连续的点云。
示例代码
int main()
{
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
  pcl::io::loadPCDFile("./cloud.pcd", *cloud);
  pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
  pcl::PointCloud<pcl::PointNormal> mls_points;
  // Init object (second point type is for the normals, even if unused)
  pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
  mls.setComputeNormals(true);
  //设置输入点云
  mls.setInputCloud(cloud);
  //使用几阶多项式去拟合平面
  mls.setPolynomialOrder(2);
  mls.setSearchMethod(tree);
  mls.setSearchRadius(0.03);
  mls.process(mls_points);
  pcl::io::savePCDFile("bun0-mls.pcd", mls_points);
}
posted @ 2025-12-20 19:39  Ytytyty  阅读(5)  评论(0)    收藏  举报