C C++最全PCL——B样条曲线曲面拟合_b样条曲面拟合,C C++跨进程通信导论

img
img

既有适合小白学习的零基础资料,也有适合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行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

  • 11
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值