当前位置:   article > 正文

【PCL-4】点云平滑处理--移动最小二乘算法(MLS)

点云平滑

在测量较小的数据时会产生一些误差,这些误差所造成的不规则数据如果直接拿来曲面重建的话,会使得重建的曲面不光滑或者有漏洞,可以采用对数据重采样来解决这样问题,通过对周围的数据点进行高阶多项式插值来重建表面缺少的部分。

示例代码:

  1. #include <pcl/point_types.h>
  2. #include <pcl/io/pcd_io.h>
  3. #include <pcl/kdtree/kdtree_flann.h> //kd-tree搜索对象的类定义的头文件
  4. #include <pcl/surface/mls.h> //最小二乘法平滑处理类定义头文件
  5. int main(int argc, char** argv)
  6. {
  7. pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>());
  8. pcl::io::loadPCDFile("E://TY//camport3-master//cylinder.pcd", *cloud);
  9. // 创建 KD-Tree
  10. pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
  11. // Output has the PointNormal type in order to store the normals calculated by MLS
  12. pcl::PointCloud<pcl::PointNormal> mls_points;
  13. // 定义最小二乘实现的对象mls
  14. pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
  15. mls.setComputeNormals(true); //设置在最小二乘计算中需要进行法线估计
  16. // Set parameters
  17. mls.setInputCloud(cloud);
  18. mls.setPolynomialFit(true); //设置false,可以加速平滑
  19. mls.setSearchMethod(tree);
  20. mls.setSearchRadius(35.0); //单位m,设置用于拟合的K近邻半径
  21. // Reconstruct
  22. mls.process(mls_points); //输出
  23. // Save output
  24. pcl::io::savePCDFile("E://TY//camport3-master//bun0-mls2.pcd", mls_points);
  25. }

注:调整etSearchRadius(35.0)参数值,确定搜索半径,在此半径里进行表面映射和曲面拟合,半径越小拟合后曲面的失真度越小,反之可能出现过拟合的现象。

参考链接 PCL: Surface模块之Moving Least Squares(移动最小二乘法)_movingleastsquares_云初的博客-CSDN博客

总结:

点云数据模型构建处理流程:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/267981
推荐阅读
相关标签
  

闽ICP备14008679号