1. 算法原理
Fitting trimmed B-splines to unordered point clouds
2. 代码实现
main.cpp
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/surface/on_nurbs/fitting_surface_tdm.h>
#include <pcl/surface/on_nurbs/fitting_curve_2d_asdm.h>
#include <pcl/surface/on_nurbs/triangulation.h>
using Point = pcl::PointXYZ;
void
PointCloud2Vector3d(pcl::PointCloud<Point>::Ptr cloud, pcl::on_nurbs::vector_vec3d &data);
void
visualizeCurve(ON_NurbsCurve &curve,
ON_NurbsSurface &surface,
pcl::visualization::PCLVisualizer &viewer);
int
main() {
std::string pcd_file = "bunny.pcd";
std::string file_3dm = "bunny.ply";
pcl::visualization::PCLVisualizer viewer("B-spline surface fitting");
viewer.setSize(800, 600);
// ############################################################################
// load point cloud
printf(" loading %s\n", pcd_file.c_str());
pcl::PointCloud<Point>::Ptr cloud(new pcl::PointCloud<Point>);
pcl::PCLPointCloud2 cloud2;
pcl::on_nurbs::NurbsDataSurface data;
if (pcl::io::loadPCDFile(pcd_file, cloud2) == -1)
throw std::runtime_error(" PCD file not found.");
fromPCLPointCloud2(cloud2, *cloud);
PointCloud2Vector3d(cloud, data.interior);
pcl::visualization::PointCloudColorHandlerCustom<Point> handler(cloud, 0, 255, 0);
viewer.addPointCloud<Point>(cloud, handler, "cloud_cylinder");
printf(" %lu points in data set\n", cloud->size());
// ############################################################################
// fit B-spline surface
// parameters
unsigned order(3);
unsigned refinement(5);