29 基于PCL的点云平面分割拟合算法技术路线(针对有噪声的点云数据)
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的点云平面分割拟合算法技术路线(针对有噪声的点云数据)相关推荐
- Open3d之点云平面分割
Open3D还支持使用RANSAC从点云中分割几何图元. 要查找点云中最有可能存在的平面,我们使用segement_plane函数. 该方法具有三个参数:destance_threshold定义了一个 ...
- PCL下使用区域增长算法进行点云平面分割的实现
首先求解三维点云的法线和曲率 这里要注意要让法线朝向一致,运用的是视点与法线夹角是锐角的方法 可以看见算法很好的分离了桌面,因为桌面的法线一致性很好,但地面的噪点就比较多了,划分的效果也是不太好 查看 ...
- [CVPR 2020] RandLA-Net:大场景三维点云语义分割新框架(已开源)
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文由知乎作者Qingyong Hu授权转载,不得擅自二次转载.原文链接:https://zhuanl ...
- 点云的密度 曝光时间_200倍的提速!华人博士生提出大场景三维点云语义分割新框架...
[新智元导读]今天分享一篇被今年CVPR接收的论文.该文提出的算法可以高效处理百万量级的点组成的大场景3D点云,同时计算效率高.内存占用少,能直接处理大规模点云,不需要复杂的预处理/后处理,比基于图的 ...
- 三维点云语义分割模型介绍
三维点云语义分割模型介绍 1 三维深度学习简介 1.1 三维数据表达方式 2 PointNet 2.1 点云的属性 2.1.1 无序性 2.1.2 关联性 2.1.3 不变性 2.2 key modu ...
- 《云原生入门级开发者认证》学习笔记之云原生基础设施之容器技术
写在前面 嗯,报了考试,整理课堂笔记记忆 学习的原因: 虽然考了CKA,了解了一些K8s相关的知识 但是对云原生整个体系一直都很模糊 希望对云原生有一个基本的认识 通过学习实现云原生相关入门 博文主要 ...
- 信创云底座主流技术路线与厂商评估
策略:IT 基础架构如何信创转型 1.虚拟化与存储等核心组件转型是重点 经过国家政策机构.行业侧和产业侧近年来的持续努力,信创转型在金融等关键行业已经取得初步成效,在机具.办公等场景的部分应用已可全信 ...
- DL:基于sklearn的加利福尼亚房价数据集实现GD算法
DL:基于sklearn的加利福尼亚房价数据集实现GD算法 目录 输出结果 代码设计 输出结果 该数据包含9个变量的20640个观测值,该数据集包含平均房屋价值作为目标变量和以下输入变量(特征):平均 ...
- 一种基于贝塞尔曲线的终端定位轨迹拟合方法
一种基于贝塞尔曲线的终端定位轨迹拟合方法 专利名称一种基于贝塞尔曲线的终端定位轨迹拟合方法 技术领域本发明属于卫星导航领域,具体涉及一种基于贝塞尔曲线的终端定位轨迹拟合方法. 背景技术目前有很多设备( ...
最新文章
- java echo程序,java网络编程 echo
- Cell Research丨潘涛/骆观正合作团队揭示肠道菌群调控宿主RNA甲基化和基因表达新机制...
- UVA11997求前k个和,多路归并问题
- Oracle函数的定义
- 在使用chrome调试angular2的时候出现下面问题
- 卡号身份证过期的影响
- MATLAB中,信号的频谱图该怎么绘制?横坐标如何标注出频率值?
- neon浮点运算_ARM 浮点运算详解
- 【电子签章】HTML格式合同转化成PDF文件 已下载
- HDU 1698 Just a Hook 线段树
- 1小时搞懂设计模式之原型模式
- python中文分词统计_python 实现中文分词统计
- C++day08 学习笔记
- 转载:数据库索引的底层原理
- 7.通过scp命令从linux服务器下载文件夹
- 2022跨年烟花代码(五)HTML5全屏烟花特效
- Python使用Reportlab处理PDF数据 - 页面布局
- JavaScript 全栈工程师培训教程
- 新买的电脑 Windows10/Windows11即将过期怎么办
- 北漂小斌和你分享古建筑斗拱木构件大样拆分图画法
热门文章
- 项目经理面试中可能遇到的问题
- win 7 DHCP获取不到ip的解决办法
- Elasticsearch1.x 基于lc-pinyin和ik分词实现 中文、拼音、同义词搜索
- Linux 第五天: (08月01日) Linux用户组管理
- 多线程间通信之AutoResetEvent和ManualResetEvent的原理分析
- mybatis学习笔记(3)-入门程序一
- PEP 0498 -- Literal String Interpolation 翻译(未完待续)
- 玩转Python大数据分析 《Python for Data Analysis》的读书笔记-第05页
- 关于微软研究院(谢幸、郑宇研究员主导的)“智能城市”“智能生活”研究的一个归纳...
- JSP复习(二):EL表达式