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

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

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

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/features/normal_3d.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/mls.h>
#include <pcl/console/time.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h> //包含基本可视化类
#include <boost/thread/thread.hpp>
#include <pcl/point_cloud.h>
using namespace std;
typedef pcl::PointXYZ point;
typedef pcl::PointCloud<point> pointcloud;


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

        //创建存储的mls对象
        pcl::PointCloud<pcl::PointNormal> mls_points;
        //   pcl::PointCloud<point> mls_points;

        //创建mls对象
        pcl::MovingLeastSquares<point,pcl::PointNormal> mls;
        
        //   pcl::MovingLeastSquares<point,point> 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<pcl::PointNormal>::Ptr mls_points_normal (new pcl::PointCloud<pcl::PointNormal>);
        mls_points_normal = mls_points.makeShared();
        
        cout<<"mls poits size is: "<<mls_points.size()<<endl;


        boost::shared_ptr<pcl::visualization::PCLVisualizer> view(new pcl::visualization::PCLVisualizer ("test"));
        view->setBackgroundColor(0.0,0,0);
        pcl::visualization::PointCloudColorHandlerCustom<pcl::PointNormal> v(mls_points_normal,0,250,0);
        view->addPointCloud<pcl::PointNormal>(mls_points_normal,v,"sample");
        view->addPointCloudNormals<pcl::PointNormal>(mls_points_normal,10,10,"normal");
        view->addCoordinateSystem(1.0); //建立空间直角坐标系
        view->spin();
        
        
        // Save output
        pcl::io::savePCDFile ("mid-mls.pcd", mls_points);

}

第一幅图片为基于MLS计算的法向,并进行了统一。
第二幅图片为SVD计算,法向具有二异性。
图片描述图片描述

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值