PCL中的SacModel类别常用参数含义
- 1、SACMODEL_PLANE
- 2、SACMODEL_LINE(三维直线)
- 3、SACMODEL_CIRCLE2D(二维圆)
- 4、SACMODEL_CIRCLE3D(三维圆)
- 5、SACMODEL_SPHERE(球)
- 6、SACMODEL_CYLINDER(圆柱)
1、SACMODEL_PLANE
该参数指的是点云平面拟合,拟合后得到的平面方程为:AX+BY+CZ+D=0。执行点云分割算法pcl::SACSegmentation后,输出的归一化向量是[A B C D]。
例如:
pcl::ModelCoefficients::Ptr coefficients;
pcl::SACSegmentation<pcl::PointXYZ> seg; //创建分割对象
seg.setOptimizeCoefficients(true); //设置对估计模型参数进行优化处理
seg.setModelType(pcl::SACMODEL_PLANE); //设置分割模型类别
seg.setMethodType(pcl::SAC_RANSAC); //设置用哪个随机参数估计方法
seg.setMaxIterations(1000); //设置最大迭代次数
seg.setDistanceThreshold(1.0); //判断是否为模型内点的距离阀值
seg.setInputCloud(cloudsource);
seg.segment(*inliers, *coefficients);
2、SACMODEL_LINE(三维直线)
点云三维直线拟合,获得的是三维直线上的一点以及其单位方向向量:
[point_on_line.x point_on_line.y point_on_line.z line_direction.x line_direction.y line_direction.z]
直线上一点:[point_on_line.x point_on_line.y point_on_line.z]
单位方向向量:[line_direction.x line_direction.y line_direction.z]
3、SACMODEL_CIRCLE2D(二维圆)
获得的是二维圆的中心以及半径: [center.x center.y radius]
center.x : the X coordinate of the circle’s center
center.y : the Y coordinate of the circle’s center
radius : the circle’s radius
#include <pcl/sample_consensus/sac_model_circle.h>
pcl::SampleConsensusModelCircle2D<pcl::PointXYZ>::Ptr
model_circle2D(new pcl::SampleConsensusModelCircle2D<pcl::PointXYZ>(cloud));
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_circle2D);
ransac.setDistanceThreshold(.01);
ransac.computeModel();
ransac.getInliers(inliers);
Eigen::VectorXf modelParas;
ransac.getModelCoefficients(modelParas);
//圆心坐标及半径
std::cout << modelParas<< "\n\n";
4、SACMODEL_CIRCLE3D(三维圆)
#include <pcl/sample_consensus/sac_model_circle3d.h>
pcl::SampleConsensusModelCircle3D<pcl::PointXYZ>::Ptr
model_circle3D(new pcl::SampleConsensusModelCircle3D<pcl::PointXYZ>(cloud));
pcl::RandomSampleConsensus<pcl::PointXYZ> ransac(model_circle3D);
ransac.setDistanceThreshold(.01);
ransac.computeModel();
ransac.getInliers(inliers);
Eigen::VectorXf modelParas;
ransac.getModelCoefficients(modelParas);
//所计算出的圆心坐标及半径如下,前三个数值为圆心坐标(x, y, z),第四个数值为计算出的圆形点云的半径,最后三个为圆形点云所在平面的法向量:
std::cout << modelParas<< "\n\n";
5、SACMODEL_SPHERE(球)
获得球心以及半径: [center.x center.y center.z radius]
center.x : the X coordinate of the sphere’s center
center.y : the Y coordinate of the sphere’s center
center.z : the Z coordinate of the sphere’s center
radius : the sphere’s radius
6、SACMODEL_CYLINDER(圆柱)
以下图片来源网上截图
圆柱方程的核心思想是:圆柱上的一点到圆柱轴线(单位方向向量)的距离为r。以下是圆柱拟合的代码示例:
// Create the segmentation object for cylinder segmentation and set all the parameters
seg.setOptimizeCoefficients(true);
//设置分割模型类别
seg.setModelType(pcl::SACMODEL_CYLINDER);
//设置使用那个随机参数估计方法为随机样本共识
seg.setMethodType(pcl::SAC_RANSAC);
//设置表面法线权重系数
seg.setNormalDistanceWeight(0.1);
//设置最大迭代数
seg.setMaxIterations(10000);
//设置是否为模型内点的距离阈值
seg.setDistanceThreshold(0.005);
//设置估计出的圆柱模型的半径的范围
seg.setRadiusLimits(0.01, 0.1);
seg.setInputCloud(cloud_filtered);
seg.setInputNormals(cloud_normals);
//最终获取内点以及模型系数
seg.segment(*inliers_cylinder, *coefficients_cylinder);
//Extract the cylinder inliers from the input cloud
extract.setInputCloud(cloud_filtered);
extract.setIndices(inliers_cylinder);
extract.setNegative(false);
extract.filter(*cloud_cylinder);
std::cout << "PointCloud representing the planar component: " << cloud_cylinder-> size() << "data points." << std::endl;
writer.write("cylinder_piece.pcd", *cloud_cylinder, false);
获得的参数为圆柱轴线上一点,以及圆柱的轴线单位方向向量,以及圆柱的半径: [point_on_axis.x point_on_axis.y point_on_axis.z]
[axis_direction.x axis_direction.y axis_direction.z]
[radius]