PCL MLS计算法线并显示

一、移动最小二乘原理:

MLS

二、代码实现:

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/mls.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/visualization/pcl_visualizer.h> 
#include <boost/thread/thread.hpp>

int
main (int argc, char** argv)
{// 将一个适当类型的输入文件加载到对象PointCloud中
  pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
  pcl::io::loadPCDFile ("5m1z.pcd", *cloud);
  cout << "points size is:" << cloud->size() << endl;
  // 创建一个KD树
  pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
  // 输出文件中有PointNormal类型,用来存储移动最小二乘法算出的法线
  pcl::PointCloud<pcl::PointNormal> mls_points;
  // 定义对象 (第二种定义类型是为了存储法线, 即使用不到也需要定义出来)
  pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
  mls.setComputeNormals (true);//设置为ture则计算法线
  mls.setInputCloud (cloud);
  mls.setPolynomialFit(true); //设置为true则在平滑过程中采用多项式拟合来提高精度
  mls.setPolynomialOrder(2); //MLS拟合的阶数,默认是2
  mls.setSearchMethod (tree);
  mls.setSearchRadius (0.25);
  // 曲面重建
  mls.process (mls_points);
  cout << "mls poits size is: " << mls_points.size() << endl;

  // 保存结果
  //pcl::io::savePCDFile ("mls.pcd", mls_points);
  pcl::PointCloud<pcl::PointNormal>::Ptr mls_points_normal(new pcl::PointCloud<pcl::PointNormal>);
  mls_points_normal = mls_points.makeShared();
  pcl::PointCloud<pcl::PointXYZ>::Ptr mls_p(new pcl::PointCloud<pcl::PointXYZ>);
  //图形显示模块
  boost::shared_ptr<pcl::visualization::PCLVisualizer> view(new pcl::visualization::PCLVisualizer("CloudShow"));
  view->setBackgroundColor(0, 0, 0);
  pcl::visualization::PointCloudColorHandlerCustom<pcl::PointNormal> v(mls_points_normal, 0, 255, 0);
  view->addPointCloud<pcl::PointNormal>(mls_points_normal, v, "sample");
  view->addPointCloudNormals<pcl::PointNormal>(mls_points_normal, 10, 0.1, "normal");
   //pcl::visualization::PointCloudColorHandlerCustom<pcl::PointXYZ> single_color(cloud, 255, 0, 0);
   //view->addPointCloud<pcl::PointXYZ>(cloud, single_color, "sample cloud");
  while (!view->wasStopped())
  {
	  view->spinOnce(100);
	  boost::this_thread::sleep(boost::posix_time::microseconds(1000));
  }

  return 0;
}

三、结果展示:

在这里插入图片描述

四、官网链接:pcl::MovingLeastSquares

猜你喜欢

转载自blog.csdn.net/qq_36686437/article/details/106103599
pcl
今日推荐