PCL、halcon中的smooth_object_model_3d以及MLS

56 篇文章 17 订阅
48 篇文章 5 订阅
文章探讨了Halcon库中的`smooth_object_model_3d`函数和平面最小二乘法(MLS)在3D对象模型平滑中的应用,以及PCL库中对应的MLS平滑和上采样方法。通过不同参数设置展示了MLS如何改变点云数据,包括点位置的调整和法向量的计算。平滑处理用于减少噪声,而上采样用于增加点密度。
摘要由CSDN通过智能技术生成

一、halcon平滑

smooth_object_model_3d

smooth_object_model_3d( : : ObjectModel3D, Method, GenParamName, GenParamValue : SmoothObjectModel3D)

 halcon 代码:

dev_update_off ()
dev_close_window ()
HeightWindow := 400
WidthWindow := 400
dev_open_window (0, 0, HeightWindow, WidthWindow, 'black', WindowHandle1)
set_display_font (WindowHandle1, 16, 'mono', 'true', 'false')
Instructions := 'Rotate: Left button'
Instructions[1] := 'Zoom: Shift + left button'
Instructions[2] := 'Move: Ctrl + left button'
VisPose:=[-114.848, 90.4942, -245.079, 293.321, 348.313, 20.4772, 0]
read_object_model_3d ('test.ply', 'm', [], [], ObjectModel3D1, Status)
smooth_object_model_3d (ObjectModel3D1, 'mls', 'mls_kNN',60, SmoothObjectModel3D)
Title := 'Original'
visualize_object_model_3d (WindowHandle1, [ObjectModel3D1,SmoothObjectModel3D], [], VisPose, ['color', 'point_size'], ['white', 2], Title, [], Instructions, VisPose)

* 
smooth_object_model_3d (ObjectModel3D1, 'mls', 'mls_force_inwards','true', SmoothObjectModel3D2)
visualize_object_model_3d (WindowHandle1, [ObjectModel3D1,SmoothObjectModel3D2], [], VisPose, ['color', 'point_size','disp_normals'], ['white', 2, 'true' ], Title, [], Instructions, VisPose)

smooth_object_model_3d (ObjectModel3D1, 'mls', 'mls_force_inwards','false', SmoothObjectModel3D2_1)
visualize_object_model_3d (WindowHandle1, [ObjectModel3D1,SmoothObjectModel3D2_1], [], VisPose, ['color', 'point_size','disp_normals'], ['white', 2, 'false'], Title, [], Instructions, VisPose)



smooth_object_model_3d (ObjectModel3D1, 'mls', 'mls_abs_sigma',1.1, SmoothObjectModel3D3)
visualize_object_model_3d (WindowHandle1, [ObjectModel3D1,SmoothObjectModel3D3], [], VisPose, ['color', 'point_size'], ['white', 2], Title, [], Instructions, VisPose)


smooth_object_model_3d (ObjectModel3D1, 'mls', 'mls_abs_sigma',0.1, SmoothObjectModel3D4)
visualize_object_model_3d (WindowHandle1, [ObjectModel3D1,SmoothObjectModel3D4], [], VisPose, ['color', 'point_size'], ['white', 2], Title, [], Instructions, VisPose)



结论: 

smooth_object_model_3d 中点不会少,但是会改变一些点的位置

 二、MLS 移动最小二乘法 PCL

1、平滑

// mls 平滑
int  MLSsmooth(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_in, int PolynomialOrder, float Radius,pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr mls_cloud)
{
	if (cloud_in->size()<1 || Radius<0)
	{
		return  -1;
	}
	if (PolynomialOrder>3|| PolynomialOrder<1) 
	{
		PolynomialOrder = 2;
	}
	pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>);
	tree->setInputCloud(cloud_in);
	pcl::MovingLeastSquares < pcl::PointXYZRGB, pcl::PointXYZRGBNormal > mls;
	mls.setComputeNormals(true);  // 是否计算法向量
	mls.setInputCloud(cloud_in);
	//_________________________________
	//mls.setUpsamplingMethod(,); //  上采样的方法
	//mls.setUpsamplingRadius(0.1);  // 函数规定了点云增长的区域。可以这样理解:把整个点云按照此半径划分成若干个子点云,然后一一索引进行点云增长。
	//mls.setUpsamplingStepSize()//对于每个子点云处理时迭代的步长
	//_________________________________
	mls.setPolynomialFit(false);  // 是否使用多项式拟合
	mls.setPolynomialOrder(PolynomialOrder);// 默认是2
	mls.setSearchMethod(tree);
	mls.setSearchRadius(Radius);   // 搜到半径
	mls.process(*mls_cloud);
	return 0;
}

移动最小二乘法MLS(Moving Lest Squares)简要介绍_Figure 09的博客-CSDN博客

 https://www.cnblogs.com/zzk0/p/10468502.html

2、上采样 

// mls 上采样
int  MLS_Upsampling(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_in, int PolynomialOrder,
	float searchRadius, float upsamping_radius, float step_size,pcl::PointCloud<pcl::PointXYZRGB>::Ptr mls_cloud)
{
	if (cloud_in->size()<1 )
	{
		return  -1;
	}
	pcl::MovingLeastSquares<pcl::PointXYZRGB, pcl::PointXYZRGB> mls;
	mls.setInputCloud(cloud_in);
	// 搜索树
	pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>);
	tree->setInputCloud(cloud_in);
	mls.setSearchMethod(tree);
	mls.setUpsamplingMethod(pcl::MovingLeastSquares<pcl::PointXYZRGB,pcl::PointXYZRGB>::SAMPLE_LOCAL_PLANE);
	mls.setSearchRadius(searchRadius);
	// 设置上采用的半径
	mls.setUpsamplingRadius(upsamping_radius);
	// 设置步长的大小
	mls.setUpsamplingStepSize(step_size);

	mls.process(*mls_cloud);

	return 0;
}

 上采用并计算法向量:


// mls 上采样并计算法向量
int  MLS_UpsamplingWithNormal(pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_in, int PolynomialOrder,int tPointDensity,
	float searchRadius, float upsamping_radius, float step_size,pcl::PointCloud<pcl::PointXYZRGBNormal>::Ptr mls_cloud)
{
	if (cloud_in->size()<1)
	{
		
		return  -1;
	}

	if (cloud_in->size()<1)
	{
		return  -1;
	}
	pcl::MovingLeastSquares<pcl::PointXYZRGB, pcl::PointXYZRGBNormal> mls;
	mls.setInputCloud(cloud_in);
	// 搜索树
	pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>);
	tree->setInputCloud(cloud_in);
	mls.setSearchMethod(tree);
	mls.setComputeNormals(true);  // 计算法向量
	mls.setPolynomialFit(true);   // 拟合
	mls.setPolynomialOrder(PolynomialOrder); // 设置阶数
	mls.setPointDensity(tPointDensity);
	mls.setUpsamplingMethod(pcl::MovingLeastSquares<pcl::PointXYZRGB, pcl::PointXYZRGBNormal>::SAMPLE_LOCAL_PLANE);
	mls.setSearchRadius(searchRadius);
	// 设置上采用的半径
	mls.setUpsamplingRadius(upsamping_radius);
	// 设置步长的大小
	mls.setUpsamplingStepSize(step_size);
	mls.process(*mls_cloud);

	return  0;
}

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
`pcl::SACMODEL_CIRCLE3D`是[PCL库](https://pcl.readthedocs.io/projects/tutorials/en/latest/)的一个模型,用于拟合3D点云的圆。该模型可以在噪声和异常值存在的情况下,从三维空间的点云计算出一个最优拟合圆,以及圆上的内外点。 以下是使用`pcl::SACMODEL_CIRCLE3D`模型拟合点云的步骤: 1. 加载点云数据,将其转换为`pcl::PointCloud<pcl::PointXYZ>`格式; 2. 创建一个`pcl::SACSegmentation<pcl::PointXYZ>`对象; 3. 设置模型类型为`pcl::SACMODEL_CIRCLE3D`; 4. 设置其他参数,例如最小拟合点数、迭代次数和距离阈值等; 5. 使用`pcl::ModelCoefficients`和`pcl::PointIndices`存储拟合结果; 6. 调用`pcl::SACSegmentation`对象的`segment`方法进行拟合; 7. 从结果提取拟合的圆心和半径; 以下是代码示例: ```cpp pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::io::loadPCDFile<pcl::PointXYZ>("cloud.pcd", *cloud); pcl::SACSegmentation<pcl::PointXYZ> seg; seg.setOptimizeCoefficients(true); seg.setModelType(pcl::SACMODEL_CIRCLE3D); seg.setMethodType(pcl::SAC_RANSAC); seg.setDistanceThreshold(0.01); seg.setInputCloud(cloud); seg.setRadiusLimits(0, 0.1); pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients); pcl::PointIndices::Ptr inliers(new pcl::PointIndices); seg.segment(*inliers, *coefficients); Eigen::Vector3f center(coefficients->values, coefficients->values, coefficients->values); float radius = coefficients->values; std::cout << "Fitted circle center: " << center << std::endl; std::cout << "Fitted circle radius: " << radius << std::endl; ``` 其,`cloud.pcd`是一个点云文件,包含需要拟合的点云数据。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值