1 介绍
基于多项式重建的平滑和法线估计(Smoothing and normal estimation based on polynomial reconstruction)是一种常用的点云处理方法,用于平滑点云数据并估计每个点的法线信息。
该方法基于Moving Least Squares(MLS)算法,通过拟合每个点的邻域数据来进行平滑处理。在平滑过程中,使用多项式函数来逼近邻域内的点,然后通过对多项式函数求导来估计每个点的法线。
具体步骤如下:
2 与普通法线估计的区别
与普通的法线估计相比,基于多项式重建的平滑和法线估计方法具有以下区别:
总的来说,基于多项式重建的平滑和法线估计方法在平滑效果和法线准确性方面具有优势,但计算复杂度较高。
3 什么时候用
通过使用基于多项式重建的平滑和法线估计方法,可以减少点云数据中的噪声,并提取出平滑的表面特征。这对于许多点云处理任务,如表面重建、物体识别和点云配准等都是非常有用的。
4 代码
#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/search/kdtree.h>
#include <pcl/surface/mls.h>
#include <pcl/visualization/cloud_viewer.h>
int main()
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ>());
pcl::io::loadPCDFile("/home/lrj/work/pointCloudData/raw.gitmirror.com_PointCloudLibrary_pcl_master_test_bun0.pcd", *cloud);
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZ>);
pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
mls.setComputeNormals(true);
mls.setInputCloud(cloud);
mls.setPolynomialOrder(2); // 多项式函数的阶数
mls.setSearchMethod(tree);
mls.setSearchRadius(0.03);
pcl::PointCloud<pcl::PointNormal> mls_points;
mls.process(mls_points);
pcl::visualization::CloudViewer vis("cloud viewer");
// vis.showCloud(cloud,"clou0");
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud2(new pcl::PointCloud<pcl::PointXYZ>());
cloud2->resize(mls_points.size());
for(size_t i=0; i < mls_points.size(); ++i)
{
cloud2->points[i].x = mls_points.points[i].x;
cloud2->points[i].y = mls_points.points[i].y;
cloud2->points[i].z = mls_points.points[i].z;
}
vis.showCloud(cloud2, "cloud2");
while(!vis.wasStopped())
{
}
return 0;
}
5 实际体会
基于多项式的平滑和法线估计,其实就是平滑点云去除噪声,并估计法线。