0 引言

最近项目中用到了基于PCL开发的基于平面的点云和CAD模型的配准算法,点云平面提取采用的算法如下。

1 基于PCL的点云平面分割拟合算法

2 参数及其意义介绍

(1)点云下采样

  1. 参数:leafsize

  2. 意义:Voxel Grid的leafsize参数,物理意义是下采样网格的大小,直接影响处理后点云密集程度,并对后期各种算法的处理速度产生直接影响。

  3. 值越大,点云密度越低,处理速度越快;值越小,点云密度越高,处理速度越慢。通常保持这个值,使得其他的与点数有关的参数可以比较稳定而不作大的改动。

  4. 对应的代码:

PointCloudPtr cloud(new pointCloud);
ParameterReader pd(ParameterFilePath);
double leafsize = stod(pd.getData("leafsize"));
pcl::VoxelGrid<PointT> sor;
sor.setInputCloud(CRTP::cloud_org);
sor.setLeafSize(leafsize, leafsize, leafsize);
sor.filter(*cloud);

(2)点云法线估计

  1. 参数:Ksearch

  2. 意义:估计法线时邻域内点的个数

  3. 值越小,对点云的轮廓描述越精细;值越大,对点云的轮廓描述越粗糙。

  4. 对应的代码:

ParameterReader pd(ParameterFilePath);
pcl::NormalEstimation<PointT, pcl::Normal> ne;
pcl::PointCloud<pcl::Normal>::Ptr mynormals(new pcl::PointCloud<pcl::Normal>);
pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);
tree->setInputCloud(cloud_filter);
ne.setInputCloud(cloud_filter);
ne.setSearchMethod(tree);
ne.setKSearch(stoi(pd.getData("Ksearch")));
ne.compute(*mynormals);

(3)RegionGrowing生长聚类算法对可能是平面的点云进行分割

 算法步骤:  

  1. 算法首先计算所有点的曲率值,并将曲率最小的点作为种子(seeds),开始进行生长

  2. 以法线夹角阈值(Angle threshold)作为判断标准,对邻域内的点进行遍历判断 ,符合条件则加入当前点集,不符合则reject,并加入reject点集

  3. 以曲率阈值(Curvature threshold)作为判断标准,将邻域内符合条件的点加入到种子队列中

  4. 移除当前种子

  5. 如果当前种子队列空了,表明当前子区域分割停止,遍历其他种子区域,直到停止整个点云均被遍历完为止生长

 参数分析:

  1. 参数:MinClusterSize(最小聚类点云数目),MaxClusterSize(最大聚类点云数据)

  NumberOfNeighbours(寻找种子seed点最近的点判断是否为同类),SmoothnessThreshold(聚类的法线夹角阈值)

CurvatureThreshold(聚类的曲率阈值,可以直观地将圆柱面等区别开)

  2. 对应的代码

ParameterReader pd(ParameterFilePath);
pcl::RegionGrowing<PointT, pcl::Normal> reg;
pcl::search::KdTree<PointT>::Ptr tree(new pcl::search::KdTree<PointT>);
reg.setMinClusterSize(stoi(pd.getData("MinClusterSize")));
reg.setMaxClusterSize(stoi(pd.getData("MaxClusterSize")));
reg.setSearchMethod(tree);
reg.setNumberOfNeighbours(stoi(pd.getData("NumberOfNeighbours")));
reg.setInputCloud(CloudFilter);
reg.setInputNormals(Normals);
reg.setSmoothnessThreshold(stod(pd.getData("SmoothnessThreshold")) / 180.0 * M_PI);
reg.setCurvatureThreshold(stod(pd.getData("CurvatureThreshold")));
std::vector <pcl::PointIndices> clusters;
reg.extract(clusters);
/* wk 添加: 可视化调试 */
pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud_segmented(new pcl::PointCloud<pcl::PointXYZRGB>());
cloud_segmented = reg.getColoredCloud();
pcl::visualization::CloudViewer viewer("Cluster viewer");
viewer.showCloud(cloud_segmented);
while (!viewer.wasStopped())
{
}
/* wk 添加: 可视化调试 */

(4)SACSegmentation 利用RANSAC算法对平面点云进行分割并拟合

  1. 参数:MaxIterations(最大迭代次数),threshold(距离阈值,判断点是否为当前拟合平面的内点,理论上该值越大平面越粗糙)

  2. 代码

/*RanSAC拟合平面,并将平面内点分割出来*/pcl::SACSegmentation<PointT> seg;
pcl::PointIndices::Ptr inliers(new pcl::PointIndices);
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
seg.setOptimizeCoefficients(true);
seg.setModelType(pcl::SACMODEL_PLANE);
seg.setMethodType(pcl::SAC_RANSAC);
seg.setMaxIterations(stoi(pd.getData("Maxci")));
seg.setDistanceThreshold(stod(pd.getData("threshold")));
seg.setInputCloud(cloud);
seg.segment(*inliers, *coefficients);// 分割内点,另存
pcl::ExtractIndices<PointT> extract;
PointCloudPtr cloud_plane(new pointCloud);
extract.setInputCloud(cloud);
extract.setIndices(inliers);
extract.setNegative(false);
extract.filter(*cloud_plane);

3 部分效果图展示

(1)原图

(2)RegionGrowing分割效果图

4 算法的局限性

  区域生长算法分割平面步骤及问题分析:针对分辨率低、扫描质量比较差的点云,如图所示,算法无法将破碎、扭曲的大块区域识别为平面区域,只能将这部分点判断为非平面点集舍弃掉。

        

  区域生长算法通常在分割细节处比较平滑的平面点云时,具有相当的优势。但是在处理“波纹”状点云时,就没什么优势了。而实际扫描点云的细节部位很多时候是如上图所示的,为了将曲率较小的曲面区别开,而调低平滑及曲率阈值时,这类从大视角上看明显是平面的点云会被rejected,从而导致分割失效。如下图所示,RegionGrowing更适合处理接近理想点云的这类点云,而不适合处理波动起伏状的、扫描精度较差的点云。

         

转载于:https://www.cnblogs.com/ghjnwk/p/10178975.html

29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)相关推荐

  1. Open3d之点云平面分割

    Open3D还支持使用RANSAC从点云中分割几何图元. 要查找点云中最有可能存在的平面,我们使用segement_plane函数. 该方法具有三个参数:destance_threshold定义了一个 ...

  2. PCL下使用区域增长算法进行点云平面分割的实现

    首先求解三维点云的法线和曲率 这里要注意要让法线朝向一致,运用的是视点与法线夹角是锐角的方法 可以看见算法很好的分离了桌面,因为桌面的法线一致性很好,但地面的噪点就比较多了,划分的效果也是不太好 查看 ...

  3. [CVPR 2020] RandLA-Net:大场景三维点云语义分割新框架(已开源)

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文由知乎作者Qingyong Hu授权转载,不得擅自二次转载.原文链接:https://zhuanl ...

  4. 点云的密度 曝光时间_200倍的提速!华人博士生提出大场景三维点云语义分割新框架...

    [新智元导读]今天分享一篇被今年CVPR接收的论文.该文提出的算法可以高效处理百万量级的点组成的大场景3D点云,同时计算效率高.内存占用少,能直接处理大规模点云,不需要复杂的预处理/后处理,比基于图的 ...

  5. 三维点云语义分割模型介绍

    三维点云语义分割模型介绍 1 三维深度学习简介 1.1 三维数据表达方式 2 PointNet 2.1 点云的属性 2.1.1 无序性 2.1.2 关联性 2.1.3 不变性 2.2 key modu ...

  6. 《云原生入门级开发者认证》学习笔记之云原生基础设施之容器技术

    写在前面 嗯,报了考试,整理课堂笔记记忆 学习的原因: 虽然考了CKA,了解了一些K8s相关的知识 但是对云原生整个体系一直都很模糊 希望对云原生有一个基本的认识 通过学习实现云原生相关入门 博文主要 ...

  7. 信创云底座主流技术路线与厂商评估

    策略:IT 基础架构如何信创转型 1.虚拟化与存储等核心组件转型是重点 经过国家政策机构.行业侧和产业侧近年来的持续努力,信创转型在金融等关键行业已经取得初步成效,在机具.办公等场景的部分应用已可全信 ...

  8. DL:基于sklearn的加利福尼亚房价数据集实现GD算法

    DL:基于sklearn的加利福尼亚房价数据集实现GD算法 目录 输出结果 代码设计 输出结果 该数据包含9个变量的20640个观测值,该数据集包含平均房屋价值作为目标变量和以下输入变量(特征):平均 ...

  9. 一种基于贝塞尔曲线的终端定位轨迹拟合方法

    一种基于贝塞尔曲线的终端定位轨迹拟合方法 专利名称一种基于贝塞尔曲线的终端定位轨迹拟合方法 技术领域本发明属于卫星导航领域,具体涉及一种基于贝塞尔曲线的终端定位轨迹拟合方法. 背景技术目前有很多设备( ...

最新文章

  1. java echo程序,java网络编程 echo
  2. Cell Research丨潘涛/骆观正合作团队揭示肠道菌群调控宿主RNA甲基化和基因表达新机制...
  3. UVA11997求前k个和,多路归并问题
  4. Oracle函数的定义
  5. 在使用chrome调试angular2的时候出现下面问题
  6. 卡号身份证过期的影响
  7. MATLAB中,信号的频谱图该怎么绘制?横坐标如何标注出频率值?
  8. neon浮点运算_ARM 浮点运算详解
  9. 【电子签章】HTML格式合同转化成PDF文件 已下载
  10. HDU 1698 Just a Hook 线段树
  11. 1小时搞懂设计模式之原型模式
  12. python中文分词统计_python 实现中文分词统计
  13. C++day08 学习笔记
  14. 转载:数据库索引的底层原理
  15. 7.通过scp命令从linux服务器下载文件夹
  16. 2022跨年烟花代码(五)HTML5全屏烟花特效
  17. Python使用Reportlab处理PDF数据 - 页面布局
  18. JavaScript 全栈工程师培训教程
  19. 新买的电脑 Windows10/Windows11即将过期怎么办
  20. 北漂小斌和你分享古建筑斗拱木构件大样拆分图画法

热门文章

  1. 项目经理面试中可能遇到的问题
  2. win 7 DHCP获取不到ip的解决办法
  3. Elasticsearch1.x 基于lc-pinyin和ik分词实现 中文、拼音、同义词搜索
  4. Linux 第五天: (08月01日) Linux用户组管理
  5. 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析
  6. mybatis学习笔记(3)-入门程序一
  7. PEP 0498 -- Literal String Interpolation 翻译(未完待续)
  8. 玩转Python大数据分析 《Python for Data Analysis》的读书笔记-第05页
  9. 关于微软研究院(谢幸、郑宇研究员主导的)“智能城市”“智能生活”研究的一个归纳...
  10. JSP复习(二):EL表达式