作者:PCIPG-zzl | 来源:计算机视觉工坊
添加微信:dddvisiona,备注:3D点云,拉你入群。文末附行业细分群。
1 什么是点云分割
点云分割的目标是将点云数据中的点分成不同的组或类别,使每个组中的点都属于同一种物体或区域。根据空间,几何和纹理等特征对点云进行划分,使同一划分内的点云拥有相似的特征。点云分割的目的是分块,从而便于单独处理。分割过程有助于从各个方面分析场景,例如定位和识别对象、分类和特征提取。
点云的有效分割是许多应用的前提:
-
工业测量/逆向工程:对零件表面提前进行分割,再进行后续重建、计算特征等操作。
-
遥感领域:对地物进行提前分割,再进行分类识别等工作
2 点云分割、分类和实例分割概念区分
点云分类(Point Cloud Classification):点云分类是将点云中的每个点分配到预定义的类别或标签中的任务。点云分类可用于识别点云中的不同物体或地物,例如识别建筑物、树木、汽车等。为每个点分配一个语义标记。点云的分类是将点云分类到不同的点云集。同一个点云集具有相似或相同的属性,例如地面、树木、人等。点云分类也叫做点云语义分割。实例分割(Instance Segmentation):实例分割是一种更高级的任务,它不仅要求识别点云中的不同物体或类别,还需要为每个物体中的每个点分配一个唯一的标识符,以区分不同实例。这使得实例分割能够精确地区分出多个相同类别的物体,例如在一个点云场景中区分出多辆汽车或多棵树。点云语义分割是指把一个大规模场景下的点云按照不同的类别给每个点云一个语义标签,比如城市高速公路,所有的路灯会有一个相同的语义标签,所有的路面会有 一个相同的语义标签,所有的树木会有同一个语义标签。点云实例分割是在语义分割的基础之上,把所有的路灯再一个一个分开,区别出来每一个路灯。这里也推荐「3D视觉工坊」新课程《三维点云处理:算法与实战汇总》。
3 常见的点云分割算法
3.1 RANSAC算法
(Random Sample Consensus)随机采样一致性算法,采用迭代的方式从一组包含离群的被观测数据中估算出数学模型的参数。RANSAC算法假设数据中包含正确数据和异常数据(或称为噪声),正确数据记为内点(inliers),异常数据记为外点(outliers)该算法核心思想就是随机性和假设性:随机性是根据正确数据出现概率去随机选取抽样数据,根据大数定律,随机性模拟可以近似得到正确结果。假设性是假设选取出的抽样数据都是正确数据,然后用这些正确数据通过问题满足的模型,去计算其他点 ,然后对这次结果进行一个评分。算法流程
-
要得到一个直线模型,需要两个点唯一确定一个直线方程。所以第一 步随机选择两个点。
-
通过这两个点,可以计算出这两个点所表示的模型方程y=ax+b。
-
将所有的数据点套到这个模型中计算误差。
-
找到所有满足误差阈值的点。
-
然后我们再重复1~4这个过程,直到达到一定迭代次数后,选出那个被 支持的最多的模型,作为问题的解。
RANSAC算法与最小二乘法区别RANSAC 算法:适用性:RANSAC主要用于处理包含噪音和异常值的数据集。它通过随机采样和迭代的方式来找到最佳拟合模型,忽略了外点的影响,因此在数据中含有大量噪音或少量异常值的情况下表现较好。步骤:RANSAC通过随机选择内点样本进行模型拟合,并通过计算内点和模型之间的误差来判断外点。它迭代地选择具有最大内点数的模型作为最终拟合模型。优点:鲁棒性较强,能够在存在噪音和异常值的情况下仍然得到合理的模型估计。最小二乘法:适用性:最小二乘法假设数据中的噪音较小,且异常值较少。它通过最小化数据点与模型之间的误差平方和来得到最佳拟合模型,适用于数据比较干净的情况。求解:最小二乘法可以直接求解或优化模型参数的解析解,对于线性问题尤其有效。然而,在存在较多噪音或异常值时,最小二乘法容易受到这些数据点的影响,导致估计结果不准确。优点:在数据相对干净,噪音较小的情况下,最小二乘法能够得到精确的模型估计。RANSAC算法被广泛应用在计算机视觉领域和数学领域,例如直线拟合、平面拟合、计算图像或点云间的变换矩阵、计算基础矩阵等方面,使用的非常多。总之,RANSAC和最小二乘法适用于不同类型的数据情况。RANSAC适用于含有噪音和异常值的数据,能够通过迭代的方式找到鲁棒性较强的模型。最小二乘法适用于相对干净的数据,能够得到精确的模型估计,但容易受到噪音和异常值的影响。在实际应用中,根据数据的特点选择合适的方法以获得准确的模型估计。
pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients);
pcl::PointIndices::Ptr inliers(new pcl::PointIndices); //inliers用来存储直线上点的索引
pcl::SACSegmentation<pcl::PointXYZ> seg;//创建一个分割器
seg.setOptimizeCoefficients(true); //可选择配置,设置模型系数需要优化
seg.setModelType(pcl::SACMODEL_LINE); //设置目标几何形状
seg.setMethodType(pcl::SAC_RANSAC); //拟合方法:随机采样法
seg.setDistanceThreshold(0.05); //设置误差容忍范围,也就是阈值
seg.setMaxIterations(500); //最大迭代次数,不设置的话默认迭代50次
seg.setInputCloud(cloud); //输入点云
seg.segment(*inliers, *coefficients); //拟合点云
3.2 欧式聚类算法
欧式聚类算法(Euclidean Clustering)是一种将点云数据分割成不同聚类(簇)的算法。它是点云分割中的一种常用方法,旨在将距离比较近的点分为同一簇,从而识别出不同的物体或结构。这个算法主要适用于包含较小噪音和具有一定距离差异的点云数据。基本思想:
-
选择一个种子点(Seed Point)作为当前簇的起始点。
-
遍历所有未分类的点,计算它们与种子点的距离。如果距离小于设定的阈值,将其归为同一簇。
-
对于同一簇中的点,重复步骤2,将与当前簇内任一点距离小于阈值的点加入簇。
-
切换到下一个未分类的点,作为新的种子点,继续重复步骤2和3。
-
当所有点都被分类为某个簇,聚类过程结束。
pcl::search::KdTree<pcl::PointXYZ>::Ptr tree (new pcl::search::KdTree<pcl::PointXYZ>);
tree->setInputCloud (cloud_filtered);
std::vector<pcl::PointIndices> cluster_indices;
pcl::EuclideanClusterExtraction<pcl::PointXYZ> ec;
ec.setClusterTolerance (0.02); // 2cm
ec.setMinClusterSize (100);
ec.setMaxClusterSize (25000);
ec.setSearchMethod (tree);
ec.setInputCloud (cloud_filtered);
ec.extract (cluster_indices);
一个桌子的场景图经过欧式聚类算法效果如下图所示。
3.3 区域增长算法
区域生长算法(Region Growing)是一种用于图像处理和分割的算法,主要用于将点云中的点分成不同的区域,从而识别出具有相似特性的区域。区域生长算法基于相似性原则,将相似度高的点聚集在一起,形成连续的区域。算法步骤:1.初始化:选择一个种子点,并将其标记为“已访问”。2.根据设定的相似性准则,计算当前点与种子的相似度。3.如果当前点与种子相似度超过设定阈值,则将其标记为当前区域的一部分,并将其加入当前区域。4.遍历当前点的邻居(相邻点),对每个邻居执行以下步骤:如果邻居未被访问过且与当前区域的相似度超过设定阈值,则将其标记为“已访问”并添加到当前区域。递归地对邻居的邻居进行相似性判断,将相似的像素或点添加到当前区域。5.重复步骤4,直到当前区域不能再生长为止。6.如果还存在未访问的点,选择一个未访问的点作为新的种子,重复上述步骤。7.当所有点都被分配到区域后,分割过程结束。这里也推荐「3D视觉工坊」新课程《三维点云处理:算法与实战汇总》。
pcl::RegionGrowing<pcl::PointXYZ, pcl::Normal> reg;
reg.setMinClusterSize (50);
reg.setMaxClusterSize (1000000);
reg.setSearchMethod (tree);
reg.setNumberOfNeighbours (30);
reg.setInputCloud (cloud);
reg.setIndices (indices);
reg.setInputNormals (normals);
reg.setSmoothnessThreshold (3.0 / 180.0 * M_PI);
reg.setCurvatureThreshold (1.0);
算法是针对小曲率变化面设计的,尤其适合对连续阶梯平面进行分割
4 参考资料
https://blog.csdn.net/luolaihua2018/article/details/120113848https://pcl.readthedocs.io/projects/tutorials/en/master/index.html#sample-consensus
—END—
高效学习3D视觉三部曲
第一步 加入行业交流群,保持技术的先进性
目前工坊已经建立了3D视觉方向多个社群,包括SLAM、工业3D视觉、自动驾驶方向,细分群包括:[工业方向]三维点云、结构光、机械臂、缺陷检测、三维测量、TOF、相机标定、综合群;[SLAM方向]多传感器融合、ORB-SLAM、激光SLAM、机器人导航、RTK|GPS|UWB等传感器交流群、SLAM综合讨论群;[自动驾驶方向]深度估计、Transformer、毫米波|激光雷达|视觉摄像头传感器讨论群、多传感器标定、自动驾驶综合群等。[三维重建方向]NeRF、colmap、OpenMVS等。除了这些,还有求职、硬件选型、视觉产品落地等交流群。大家可以添加小助理微信: dddvisiona,备注:加群+方向+学校|公司, 小助理会拉你入群。
第二步 加入知识星球,问题及时得到解答
针对3D视觉领域的视频课程(三维重建、三维点云、结构光、手眼标定、相机标定、激光/视觉SLAM、自动驾驶等)、源码分享、知识点汇总、入门进阶学习路线、最新paper分享、疑问解答等进行深耕,更有各类大厂的算法工程人员进行技术指导。与此同时,星球将联合知名企业发布3D视觉相关算法开发岗位以及项目对接信息,打造成集技术与就业、项目对接为一体的铁杆粉丝聚集区,6000+星球成员为创造更好的AI世界共同进步,知识星球入口:「3D视觉从入门到精通」
学习3D视觉核心技术,扫描查看,3天内无条件退款
第三步 系统学习3D视觉,对模块知识体系,深刻理解并运行
如果大家对3D视觉某一个细分方向想系统学习[从理论、代码到实战],推荐3D视觉精品课程学习网址:www.3dcver.com
科研论文写作:
[1]国内首个面向三维视觉的科研方法与学术论文写作教程
基础课程:
[1]面向三维视觉算法的C++重要模块精讲:从零基础入门到进阶
[2]面向三维视觉的Linux嵌入式系统教程[理论+代码+实战]
[3]如何学习相机模型与标定?(代码+实战)
[4]ROS2从入门到精通:理论与实战
[5]彻底理解dToF雷达系统设计[理论+代码+实战]
工业3D视觉方向课程:
[1](第二期)从零搭建一套结构光3D重建系统[理论+源码+实践]
[2]保姆级线结构光(单目&双目)三维重建系统教程
[3]机械臂抓取从入门到实战课程(理论+源码)
[4]三维点云处理:算法与实战汇总
[5]彻底搞懂基于Open3D的点云处理教程!
[6]3D视觉缺陷检测教程:理论与实战!
SLAM方向课程:
[1]深度剖析面向机器人领域的3D激光SLAM技术原理、代码与实战
[1]彻底剖析激光-视觉-IMU-GPS融合SLAM算法:理论推导、代码讲解和实战
[2](第二期)彻底搞懂基于LOAM框架的3D激光SLAM:源码剖析到算法优化
[3]彻底搞懂视觉-惯性SLAM:VINS-Fusion原理精讲与源码剖析
[4]彻底剖析室内、室外激光SLAM关键算法和实战(cartographer+LOAM+LIO-SAM)
[5](第二期)ORB-SLAM3理论讲解与代码精析
视觉三维重建
[1]彻底搞透视觉三维重建:原理剖析、代码讲解、及优化改进)
自动驾驶方向课程:
[1] 深度剖析面向自动驾驶领域的车载传感器空间同步(标定)
[2] 国内首个面向自动驾驶目标检测领域的Transformer原理与实战课程
[3]单目深度估计方法:算法梳理与代码实现
[4]面向自动驾驶领域的3D点云目标检测全栈学习路线!(单模态+多模态/数据+代码)
[5]如何将深度学习模型部署到实际工程中?(分类+检测+分割)
最后
1、3D视觉文章投稿作者招募
2、3D视觉课程(自动驾驶、SLAM和工业3D视觉)主讲老师招募文章来源:https://www.toymoban.com/news/detail-761997.html
3、顶会论文分享与3D视觉传感器行业直播邀请文章来源地址https://www.toymoban.com/news/detail-761997.html
到了这里,关于大盘点!汇总点云分割算法,涉及RANSAC、欧式聚类、区域增长等的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!