1. はじめに
halcon と PCL で同じ点群をフィッティングするときのギャップはどれくらいですか? 設定したパラメータにもよりますが、できるだけここで設定するようにしています。
Matlab 最小二乗法フィッティング平面 (PCL PCA フィッティング平面)_matlab 平面フィッティング_Σίσυφος1900 のブログ - CSDN ブログ
Halcon は点を使用して plan_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)
3.PCL
PCL には 2 つの方法がリストされています。
1、PCA
2. ランサック
// 拟合平面
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];
}
第四に、法線ベクトルの計算
ハルコン面法線ベクトル 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)