PCL halcon 拟合平面与法向量计算比较

56 篇文章 17 订阅
48 篇文章 5 订阅

一、简介

在halcon 和PCL 中拟合同一片点云的差距有多大,和设置的参数有管,但是我这里尽量设置的差不多

Matlab 最小二乘法 拟合平面 (PCL PCA拟合平面)_matlab平面拟合_Σίσυφος1900的博客-CSDN博客

Halcon 用点来拟合平面_fit_primitives_object_model_3d_Σίσυφος1900的博客-CSDN博客

这个是原始点云,并且在cc 中做的测试: 

 二、Halcon 

*   点云拟合平面
read_object_model_3d ('C:/Users/Albert/Desktop/Halcon2PCL/plane_test.ply', 'm', [], [], ObjectModel3D, Status1)

fit_primitives_object_model_3d (ObjectModel3D, ['primitive_type','fitting_algorithm'], ['plane','least_squares_tukey'], ObjectModel3DOut)

get_object_model_3d_params (ObjectModel3DOut, 'primitive_parameter', Normals)

 三、PCL

pcl 中这里列出了两中方法

1、PCA

2、RANSAC

//  拟合平面
int  FitPlaneByPCA(pcl::PointCloud<pcl::PointXYZ>::Ptr in, CG_Plane  & plane)
{
	if (in->size()<3)
	{
		return -1;
	}
	pcl::PCA<pcl::PointXYZ> pca;
	pca.setInputCloud(in);
	Eigen::Matrix3f  ve = pca.getEigenVectors();
	cout << "矩阵:" << endl;
	cout << ve << endl;

	
	plane.A = ve.col(2).row(0).value();
	plane.B = ve.col(2).row(1).value();
	plane.C = ve.col(2).row(2).value();

	//cout << "平面参数:    " << endl;
	//cout << "  A:" << A << endl;
	//cout << "  B:" << B << endl;
	//cout << "  C:" << C << endl;


	//计算点云的质心
	Eigen::Vector4d centroid;
	pcl::compute3DCentroid(*in, centroid);

	plane.D = -(plane.A * centroid[0] + plane.B * centroid[1] + plane.C * centroid[2]);
}

int  FitPlaneByRANSAC(pcl::PointCloud<pcl::PointXYZ>::Ptr in, float distance, int Maxnumber, CG_Plane  & plane)
{
	if (in->size()<3)
	{
		return -1;
	}
	//创建一个模型参数对象,用于记录结果
	pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
	//inliers表示误差能容忍的点,记录点云序号
	pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
	//创建一个分割器
	pcl::SACSegmentation<pcl::PointXYZ> seg;
	//Optional,设置结果平面展示的点是分割掉的点还是分割剩下的点
	seg.setOptimizeCoefficients(true);
	//Mandatory-设置目标几何形状
	seg.setModelType(pcl::SACMODEL_PLANE);
	//分割方法:随机采样法
	seg.setMethodType(pcl::SAC_RANSAC);
	//设置误差容忍范围,也就是阈值
	seg.setDistanceThreshold(distance);

	// 设置最大迭代次数
	seg.setMaxIterations(Maxnumber);
	//输入点云
	seg.setInputCloud(in);
	//分割点云
	seg.segment(*inliers, *coefficients);

	plane.A = coefficients->values[0];
	plane.B = coefficients->values[1];
	plane.C = coefficients->values[2];
	plane.D = coefficients->values[3];
}

四、法向量的计算

Halcon 表面法向量 pcl_Σίσυφος1900的博客-CSDN博客


	 pcl::PointCloud<pcl::Normal>::Ptr  normal_cloud(new pcl::PointCloud<pcl::Normal>);
	 // 计算法向量
	 pcl::search::KdTree<pcl::PointXYZ> ::Ptr  tree(new pcl::search::KdTree<pcl::PointXYZ>);
	 pcl::NormalEstimationOMP<pcl::PointXYZ, pcl::Normal> normalomp;
	 normalomp.setInputCloud(cloud_src);
	 normalomp.setNumberOfThreads(10);  //	设置加速线程书
	 normalomp.setSearchMethod(tree);
	 normalomp.setRadiusSearch(distance);
	 normalomp.compute(*normal_cloud);
*   点云拟合平面
read_object_model_3d ('C:/Users/Albert/Desktop/Halcon2PCL/plane_test.ply', 'm', [], [], newObjectModel3D, Status1)
fit_primitives_object_model_3d (newObjectModel3D, ['primitive_type','fitting_algorithm'], ['plane','least_squares_tukey'], ObjectModel3DOut)
get_object_model_3d_params (ObjectModel3DOut, 'primitive_parameter', Normals)
surface_normals_object_model_3d (newObjectModel3D, 'mls', 'mls_kNN', 100, new3Dnormals)
get_object_model_3d_params (new3Dnormals, 'point_normal_x', px)
get_object_model_3d_params (new3Dnormals, 'point_normal_y', py)
get_object_model_3d_params (new3Dnormals, 'point_normal_z', pz)

 法向量的定向:

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hi~ 可私信我了解后再进行下载~ 1.基于halcon算法平台; 2.提供深度图源文件以及解压密码; 3.代码预览: */********************************* * @文档名称: 基于点云的平面拟合。 * @作者: hugo * @版本: 1.1 * @日期: 2021-6-16 * @描述: 该方支持点云平面拟合以及深度图平面拟合。 **********************************/* read_image (imageReal, './replay_38893_2021-6-7.tif') xResolution:=0.06 yResolution:=0.06 zResolution:=0.001 ScaleFactor:=[xResolution,yResolution,zResolution] rateLowRemove:=0.1 rateHighRemove:=0.1 dev_get_window (WindowHandle) *采样区域1 create_drawing_object_rectangle2 (300, 120, rad(90), 30, 20, DrawID) set_drawing_object_params (DrawID, 'color', 'red') set_drawing_object_params (DrawID, 'line_width', 1) attach_drawing_object_to_window (WindowHandle, DrawID) ......... TransPose := [0,0,d,0,0,0,0] rigid_trans_object_model_3d (SampledObjectModel3D1, TransPose, _SampledObjectModel3D1) rigid_trans_object_model_3d (ObjectModelPlane1, TransPose, _ObjectModelPlane1) create_pose (0, 0, Mean/2, 180, 0, 0, 'Rp+T', 'gba', 'point', Pose1) *visualize_object_model_3d (WindowHandle, [_ObjectModelPlane1,_SampledObjectModel3D1,SampledObjectModel3D2], [], [Pose1], [], ['intensity','lut','lut'], ['&amplitude','sqrt','sqrt'], '', 'Edited by AmazingRobot+ ' , PoseOut) visParamName := ['intensity_1','color_0','color_2','alpha_0'] visParamValue := ['coord_z','red','yellow',0.5] visualize_object_model_3d (WindowHandle, [_SampledObjectModel3D1,SampledObjectModel3D2,_ObjectModelPlane1], [], [], visParamName, visParamValue, 'Edited by AmazingRobot+', [], '', PoseOut) stop () 谢谢您的信任~
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值