//---头文件---
#include <pcl/ModelCoefficients.h>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/sample_consensus/method_types.h> //随机参数估计方法头文件
#include <pcl/sample_consensus/model_types.h> //模型定义头文件
#include <pcl/segmentation/sac_segmentation.h> //基于采样一致性分割的类的头文件
pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_new_build(new pcl::PointCloud<pcl::PointXYZ>);
cloud_new_build->width = scene_xyz.size();
cloud_new_build->height = 1;
cloud_new_build->is_dense = false;
cloud_new_build->resize(cloud_new_build->width * cloud_new_build->height);
// 生成平面点云数据
size_t num = cloud_new_build->size();
for (size_t i = 0 ; i < num ; ++i)
{
cloud_new_build->points[i].x = scene_xyz[i].x();
cloud_new_build->points[i].y = scene_xyz[i].y();
cloud_new_build->points[i].z = scene_xyz[i].z();
}
//创建一个模型参数对象,用于记录结果
pcl::ModelCoefficients::Ptr coef (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 (0.01);
//输入点云
seg.setInputCloud (cloud_new_build);
//分割点云
seg.segment (*inliers, *coef);
//显示模型的系数
std::cerr << "Model coefficients: " << coef->values[0] << " "
<<coef->values[1] << " "
<<coef->values[2] << " "
<<coef->values[3] <<std::endl;
//--需要对坐标值进行矫正--
三维实际点到点云,最后ransac拟合平面
于 2020-11-21 09:38:39 首次发布