既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
// parameters
unsigned order (3);
unsigned refinement (5);
unsigned iterations (10);
unsigned mesh_resolution (256);
pcl::on_nurbs::FittingSurface::Parameter params;
params.interior_smoothness = 0.2;
params.interior_weight = 1.0;
params.boundary_smoothness = 0.2;
params.boundary_weight = 0.0;
Order ——B样条曲面的多项式阶
Refinemen——是求精迭代的次数,其中每插入一个迭代控制点,b样条曲面的每个参数方向上的控制点大约翻倍。
Iterations——是优化完成后执行的迭代数量。
mesh_resolutio——每个参数方向上的顶点数,用于b样条曲面的三角剖分。
interior_smoothness——内部表面的光滑度
interior_weight——用于表面内部优化的权重。
boundary_smoothness——表面边界的平滑度
boundary_weight——表面边界优化的权重
B样条拟合曲面的相关参数解读:
pcl::on_nurbs::FittingCurve2dAPDM::FitParameter curve_params;
curve_params.addCPsAccuracy = 5e-2;//曲线的支持区域到最近数据点的距离必须低于该值,否则将插入控制点。
curve_params.addCPsIteration = 3;//内部迭代没有插入控制点。
curve_params.maxCPs = 200;//控制点的最大总数
curve_params.accuracy = 1e-3;//曲线的拟合精度
curve_params.iterations = 100;//迭代次数
curve_params.param.closest_point_resolution = 0;//每个支持区域内的控制点数量
curve_params.param.closest_point_weight = 1.0;//曲线拟合到最近点的权值
curve_params.param.closest_point_sigma2 = 0.1;//最近点的阈值
curve_params.param.interior_sigma2 = 0.00001;//内点的阈值
curve_params.param.smooth_concavity = 1.0;//导致曲线向内弯曲的值(0 =不弯曲;< 0向内弯曲;> 0向外弯曲)
curve_params.param.smoothness = 1.0;//平滑项的权值
拟合B样条曲面结果:
附上代码:
#include <pcl/point\_cloud.h>
#include <pcl/point\_types.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>
#include <pcl/console/parse.h>
using namespace pcl::console;
typedef pcl::PointXYZ Point;
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(int argc, char \*argv[])
{
std::string pcd_file, file_3dm;
if (argc < 2)
{
printf("\nUsage: pcl\_example\_nurbs\_fitting\_surface pcd<PointXYZ>-in-file -o 3 -rn 4 -in 10 -mr 128 -td 1\n\n");
exit(0);
}
pcd_file = argv[1];
//file\_3dm = argv[2];
pcl::visualization::PCLVisualizer viewer("点云库PCL学习教程第二版-B样条曲面拟合点云数据");
viewer.setBackgroundColor(255, 255, 255);
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(4);
unsigned iterations(10);
unsigned mesh\_resolution(128);
bool two_dim = true;
parse\_argument(argc, argv, "-o", order);
parse\_argument(argc, argv, "-rn", refinement);
parse\_argument(argc, argv, "-in", iterations);
parse\_argument(argc, argv, "-mr", mesh_resolution);
parse\_argument(argc, argv, "-td", two_dim);
pcl::on_nurbs::FittingSurface::Parameter params;
params.interior_smoothness = 0.2;
params.interior_weight = 1.0;
params.boundary_smoothness = 0.2;
params.boundary_weight = 0.0;
// initialize
printf(" surface fitting ...\n");
ON_NurbsSurface nurbs = pcl::on_nurbs::FittingSurface::initNurbsPCABoundingBox(order, &data);
pcl::on_nurbs::FittingSurface fit(&data, nurbs);
// fit.setQuiet (false); // enable/disable debug output
// mesh for visualization
pcl::PolygonMesh mesh;
pcl::PointCloud<pcl::PointXYZ>::Ptr mesh\_cloud(new pcl::PointCloud<pcl::PointXYZ>);
std::vector<pcl::Vertices> mesh_vertices;
std::string mesh_id = "mesh\_nurbs";
pcl::on_nurbs::Triangulation::convertSurface2PolygonMesh(fit.m_nurbs, mesh, mesh_resolution);
viewer.addPolygonMesh(mesh, mesh_id);
std::cout << "Before refine" << endl;
viewer.spinOnce(3000);
// surface refinement
for (unsigned i = 0; i < refinement; i++)
{
fit.refine(0);
if (two_dim)fit.refine(1);
fit.assemble(params);
fit.solve();
pcl::on_nurbs::Triangulation::convertSurface2Vertices(fit.m_nurbs, mesh_cloud, mesh_vertices, mesh_resolution);
viewer.updatePolygonMesh<pcl::PointXYZ>(mesh_cloud, mesh_vertices, mesh_id);
viewer.spinOnce(3000);
std::cout << "refine: " << i << endl;
}
// surface fitting with final refinement level
for (unsigned i = 0; i < iterations; i++)
{
fit.assemble(params);
fit.solve();
pcl::on_nurbs::Triangulation::convertSurface2Vertices(fit.m_nurbs, mesh_cloud, mesh_vertices, mesh_resolution);
viewer.updatePolygonMesh<pcl::PointXYZ>(mesh_cloud, mesh_vertices, mesh_id);
viewer.spinOnce(3000);
std::cout << "iterations: " << i << endl;
}
// ############################################################################
// fit B-spline curve
// parameters
pcl::on_nurbs::FittingCurve2dAPDM::FitParameter curve_params;
curve_params.addCPsAccuracy = 5e-2;
curve_params.addCPsIteration = 3;
curve_params.maxCPs = 200;
curve_params.accuracy = 1;
curve_params.iterations = 100;
curve_params.param.closest_point_resolution = 0;
curve_params.param.closest_point_weight = 1.0;
curve_params.param.closest_point_sigma2 = 0.1;
curve_params.param.interior_sigma2 = 0.00001;
curve_params.param.smooth_concavity = 1.0;
curve_params.param.smoothness = 1.0;
// initialisation (circular)
printf(" curve fitting ...\n");
pcl::on_nurbs::NurbsDataCurve2d curve_data;
curve_data.interior = data.interior_param;
curve_data.interior_weight_function.push\_back(true);
ON_NurbsCurve curve_nurbs = pcl::on_nurbs::FittingCurve2dAPDM::initNurbsCurve2D(order, curve_data.interior);
// curve fitting
pcl::on_nurbs::FittingCurve2dASDM curve\_fit(&curve_data, curve_nurbs);
// curve\_fit.setQuiet (false); // enable/disable debug output
curve_fit.fitting(curve_params);
visualizeCurve(curve_fit.m_nurbs, fit.m_nurbs, viewer);
// ############################################################################
// triangulation of trimmed surface
printf(" triangulate trimmed surface ...\n");
viewer.removePolygonMesh(mesh_id);
pcl::on_nurbs::Triangulation::convertTrimmedSurface2PolygonMesh(fit.m_nurbs, curve_fit.m_nurbs, mesh,
mesh_resolution);
viewer.addPolygonMesh(mesh, mesh_id);
// save trimmed B-spline surface
![img](https://img-blog.csdnimg.cn/img_convert/1e64eadb12b0f77304be25800c777d31.png)
![img](https://img-blog.csdnimg.cn/img_convert/ec45f3cf43edcb3b5080de8ffcce2f79.png)
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化的资料的朋友,可以添加戳这里获取](https://bbs.csdn.net/topics/618668825)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**