点云分割(4)——基于平面模型分割和最小割分割

本文介绍了使用PCL库进行平面模型拟合来分割点云,该方法能有效过滤地面和墙壁等平面,便于后续分割。接着讲解了基于最小割的点云分割算法,该算法利用图论知识,通过构建点云间的图和权重,实现分割。最小割方法适用于水平排列的点云图像,但仅能在水平方向分割。文中分享了学习心得并鼓励读者交流讨论。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



平面模型拟合在PCL库中可以设置模型类别,这个算法并不是真正意义上的分割,他只能分割出平面上的点云,但是在“点云分割(3)”中涉及到该方法,目的是将地面,墙壁等这些平面过滤了,就可以更好地进行分割。这个方法很简单,只有一个参数需要调整。
如图所示为例程得到的结果:
在这里插入图片描述
具体过程为:随机产生15个点云数据,都在z=1的平面上,其中人为设置了3个错误点,通过该模型,可以得到平面的四个参数和正确点的个数(12个),并且将正确点的坐标输出。

接下来是基于最小割的算法,先上整理的PPT~

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
最小割是图论中的知识,目的是将点以最小的损失分割开,重点有两个:
一是获得点云间的图;二是获得点云连接边的权重。
对于权值,第一种是点云各点的边,是由点之间的欧式距离来构造的,距离越远,平滑

### 使用Open3D进行点云数据平面分割平面间距离测量 #### 平面分割方法概述 为了实现点云数据平面分割,通常采用RANSAC (Random Sample Consensus) 算法来拟合平面模型。该算法能够有效地从嘈杂的数据集中找到最佳拟合参数[^2]。 ```python import open3d as o3d import numpy as np # 加载点云文件 pcd = o3d.io.read_point_cloud("path_to_pcd_file.ply") # 初始化变量存储多个平面的结果 planes = [] inliers_all = [] for i in range(3): # 假设最多提取三个不同的平面 plane_model, inliers = pcd.segment_plane(distance_threshold=0.01, ransac_n=3, num_iterations=1000) planes.append(plane_model) # 创建一个新的点云集仅包含内点用于下一轮迭代 inlier_cloud = pcd.select_by_index(inliers) inliers_all.extend(inliers) # 移除已识别平面上的点以便继续寻找其他潜在平面 pcd = pcd.select_by_index(inliers, invert=True) print(f"Planes found: {len(planes)}") ``` 上述代码展示了如何通过循环调用`segment_plane()`函数多次执行分层式的平面检测过程。每次成功分离出一个平面之后都会更新原始点云集合,从而确保后续操作只针对剩余未分类的部分进行处理[^4]。 #### 计算两平面间的最短距离 一旦获得了两个独立的平面方程\[ax + by + cz + d = 0\],就可以利用向量代数原理求解它们之间最小垂直间距: 假设给定两个平面\(P_1\) \(P_2\) 的标准形式分别为 \((a_1,b_1,c_1,d_1)\),\((a_2,b_2,c_2,d_2)\): 如果这两个平面平行,则可以通过选取其中一个平面上任意一点并计算它到另一个平面的距离作为两者之间的距离;如果不平行则交集为空因此不存在实际意义下的“距离”。 对于非平行情况,这里提供一种简化方案——取第一个平面上任选的一组坐标(x,y,z),带入第二个平面表达式得到z值差绝对值得近似结果: ```python def distance_between_planes(plane1_coeffs, plane2_coeffs): a1, b1, c1, d1 = plane1_coeffs a2, b2, c2, d2 = plane2_coeffs if abs(a1*a2+b1*b2+c1*c2)/(np.sqrt(a1**2+b1**2+c1**2)*np.sqrt(a2**2+b2**2+c2**2)) >= 0.99: point_on_plane1 = [-b1*d1/(a1**2+b1**2), -a1*d1/(a1**2+b1**2), 0] dist = abs(a2*point_on_plane1[0]+b2*point_on_plane1[1]+c2*point_on_plane1[2]+d2)/np.sqrt(a2**2+b2**2+c2**2) else: dist = None return dist ``` 此部分逻辑实现了当且仅当所考虑的两个平面几乎完全平行时才返回有效数值的情况。否则认为二者相交而不具备定义上的固定间隔。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值