pcl之MLS算法计算并统一法向量

利用MLS算法计算法向量,并统一法向。MLS其他说明

该算法比直接基于SVD的算法慢,但是对法向进行了统一。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include  //包含基本可视化类
#include 
#include 
using namespace std;
typedef pcl::PointXYZ point;
typedef pcl::PointCloud pointcloud;


int main (int argc,char **argv)
{
        pointcloud::Ptr cloud (new pointcloud);
        pcl::io::loadPCDFile(argv[1],*cloud);
        cout<<"points size is:"<size()<::Ptr tree (new pcl::search::KdTree);

        //创建存储的mls对象
        pcl::PointCloud mls_points;
        //   pcl::PointCloud mls_points;

        //创建mls对象
        pcl::MovingLeastSquares mls;
        
        //   pcl::MovingLeastSquares mls;

        mls.setComputeNormals(true);
        mls.setInputCloud(cloud);
        mls.setPolynomialFit(true); //设置为true则在平滑过程中采用多项式拟合来提高精度
        mls.setPolynomialOrder(2); //MLS拟合的阶数,默认是2
        mls.setSearchMethod(tree);
        mls.setSearchRadius(5.1);  //搜索半径
        
        mls.process(mls_points);
        pcl::PointCloud::Ptr mls_points_normal (new pcl::PointCloud);
        mls_points_normal = mls_points.makeShared();
        
        cout<<"mls poits size is: "< view(new pcl::visualization::PCLVisualizer ("test"));
        view->setBackgroundColor(0.0,0,0);
        pcl::visualization::PointCloudColorHandlerCustom v(mls_points_normal,0,250,0);
        view->addPointCloud(mls_points_normal,v,"sample");
        view->addPointCloudNormals(mls_points_normal,10,10,"normal");
        view->addCoordinateSystem(1.0); //建立空间直角坐标系
        view->spin();
        
        
        // Save output
        pcl::io::savePCDFile ("mid-mls.pcd", mls_points);

}

第一幅图片为基于MLS计算的法向,并进行了统一。
第二幅图片为SVD计算,法向具有二异性。
pcl之MLS算法计算并统一法向量_第1张图片pcl之MLS算法计算并统一法向量_第2张图片

你可能感兴趣的:(c++)