一、移动最小二乘原理:
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)
{
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZ> ());
pcl::io::loadPCDFile ("5m1z.pcd", *cloud);
cout << "points size is:" << cloud->size() << endl;
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
pcl::PointCloud<pcl::PointNormal> mls_points;
pcl::MovingLeastSquares<pcl::PointXYZ, pcl::PointNormal> mls;
mls.setComputeNormals (true);
mls.setInputCloud (cloud);
mls.setPolynomialFit(true);
mls.setPolynomialOrder(2);
mls.setSearchMethod (tree);
mls.setSearchRadius (0.25);
mls.process (mls_points);
cout << "mls poits size is: " << mls_points.size() << endl;
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");
while (!view->wasStopped())
{
view->spinOnce(100);
boost::this_thread::sleep(boost::posix_time::microseconds(1000));
}
return 0;
}
三、结果展示: