PCL 基于多项式拟合的法线估计、点云平滑和数据重采样

在使用Window VS2010为开发平台,学习PCL点云库的时候,学到曲面重建(Surface)。在测试下面的程序的时候,遇到了问题。

#include <pcl/point_types.h>
#include <pcl/io/pcd_io.h>
#include <pcl/io/io.h>
#include <pcl/io/ply_io.h>
#include <pcl/kdtree/kdtree_flann.h>
#include <pcl/surface/mls.h>
#include <iostream>
#include <pcl/visualization/cloud_viewer.h>

#include <pcl/console/print.h>
#include <pcl/console/parse.h>
#include <pcl/console/time.h>

using namespace std;
using namespace pcl;
using namespace pcl::io;
using namespace pcl::console;
int
main (int argc, char** argv)
{
  cout << "Project Begin: " << endl;
  // Load input file into a PointCloud<T> with an appropriate type
  pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA> ());
  // Load bun0.pcd -- should be available with the PCL archive in test
  pcl::io::loadPCDFile ("pcl_point_cloud/phase2d_1.pcd", *cloud);

  cout << "Read .pcd File Final. " << endl;
  cout << "This cloud Points number is :" << cloud->points.size() << endl;

  // Create a KD-Tree
  pcl::search::KdTree<pcl::PointXYZRGBA>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZRGBA>);

  // Output has the PointNormal type in order to store the normals calculated by MLS
  pcl::PointCloud<pcl::PointXYZRGBNormal> mls_points;

  // Init object (second point type is for the normals, even if unused)
  pcl::MovingLeastSquares<pcl::PointXYZRGBA, pcl::PointXYZRGBNormal> mls;

  mls.setComputeNormals (true);

  //Set parameters
  mls.setInputCloud(cloud);
  mls.setPolynomialFit(true);
  mls.setSearchMethod(tree);
  mls.setSearchRadius(.1);

  TicToc tt;
  tt.tic ();

  print_highlight ("Processing "); 
  // Reconstruct
  mls.process(mls_points);
  print_info ("[done, "); print_value ("%g", tt.toc ()); print_info (" ms]\n"); 

  cout << "Smoothing Processing cloud Points Final." << endl;

  std::cout << "After MLS , point cloud size is " << mls_points.size() << std::endl;

  // Save output
  pcl::io::savePCDFile ("phase2d-mls.pcd", mls_points);

  cout << "Save .PCD file Final !" << endl;
  cout << "New The New Cloud Points number is : " << mls_points.points.size() << endl;

  getchar();
  return 0;
}

VS2010编译这段程序的时候,出现了下面的链接错误:

1>Smoothing_Cloud.obj : error LNK2019: 无法解析的外部符号 "public: virtual void __thiscall pcl::MovingLeastSquares<struct pcl::PointXYZRGBA,struct pcl::PointXYZRGBNormal>::process(class pcl::PointCloud<struct pcl::PointXYZRGBNormal> &)" (?process@?$MovingLeastSquares@UPointXYZRGBA@pcl@@UPointXYZRGBNormal@2@@pcl@@UAEXAAV?$PointCloud@UPointXYZRGBNormal@pcl@@@2@@Z),该符号在函数 _main 中被引用
1>Smoothing_Cloud.obj : error LNK2001: 无法解析的外部符号 "private: virtual void __thiscall pcl::MovingLeastSquares<struct pcl::PointXYZRGBA,struct pcl::PointXYZRGBNormal>::performProcessing(class pcl::PointCloud<struct pcl::PointXYZRGBNormal> &)" (?performProcessing@?$MovingLeastSquares@UPointXYZRGBA@pcl@@UPointXYZRGBNormal@2@@pcl@@EAEXAAV?$PointCloud@UPointXYZRGBNormal@pcl@@@2@@Z)
1> fatal error LNK1120: 2 个无法解析的外部命令
1>
1>生成失败。

解决办法:
添加下面这个头文件:

#include <pcl/surface/impl/mls.hpp>

再次编译,问题解决。


参考网站:
http://docs.ros.org/hydro/api/pcl/html/mls_8hpp.html
http://d.hatena.ne.jp/takmin/comment?date=20130719