pcl里面封装了强大的Ransac,里面有很多常规点云模型,比如直线模型、柱状模型等(具体去官网看吧)。本文就以最最常见的Ransac识别直线模型为例(亦可识别多条直线)。
//创建一个模型参数对象,用于记录结果
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_LINE);//SACMODEL_LINE SACMODEL_PLANE注:在这里面修改模型名称
//分割方法:随机采样法
seg.setMethodType(pcl::SAC_RANSAC);//SAC_RANSAC
//最大的迭代的次数
seg.setMaxIterations(100);
//设置误差容忍范围
seg.setDistanceThreshold(setDistanceThresholdDEMOkv);//注:填写具体数值
//输入点云
seg.setInputCloud(ptCloud2D);
//分割点云
seg.segment(*inliers, *coefficients);
//获取点和删除点2D
pcl::ExtractIndices<pcl::PointXYZ> extract2;
extract2.setInputCloud(ptCloud2D);
extract2.setIndices(inliers);
extract2.setNegative(false);
extract2.filter(*line2D);//line2D本次分割出的2D线--
//删除点(注:如果识别多条直线,则删除已经识别的电力线点云,然后循环)
extract2.setNegative(true);
extract2.filter(*cloud_f2D);
*ptCloud2D = *cloud_f2D;//ptCloud2D本次剩余的点云--