本节摘要:分割把无主见的点袋切成有意义的地物——地面、墙面、桌椅、行人。RANSAC 模型拟合管"有规则形状"的地物,欧式聚类与区域生长管"抱团"的物体;分类则给分割块贴语义标签。本节是外业整理中"从数据到地物"的跨越。
洗好的点云仍然是一袋无名的点:不知道哪些是地面、哪些是桌子、哪些是走动的人。而下游任务几乎都按地物思考——机器人要在地面上走、要绕开桌子、要避开行人。分割就是给点"分地承包":每块地物一个标签;分类再回答"这块地是什么"。对测绘远征而言,这一步相当于把浑沌的碎屑整理成地物清单。
室内外场景最大的地物是地面与墙面——规则几何体。拟合它们的标准武器是 RANSAC(随机抽样一致):随机抽三点定一个候选平面,数有多少点落在附近(内点),重复几百轮,内点最多的平面胜出。它对野点天然免疫——野点几乎不可能被随机抽中且获得高票。
# RANSAC 平面分割(Open3D) import open3d as o3d import numpy as np pcd = o3d.io.read_point_cloud(o3d.data.LivingRoomPointClouds().paths[0]) pcd = pcd.voxel_down_sample(0.02) plane, inliers = pcd.segment_plane( distance_threshold=0.03, ransac_n=3, num_iterations=2000) [a, b, c, d] = plane print('平面方程: %.3f x + %.3f y + %.3f z + %.3f = 0' % (a, b, c, d)) # 输出: 平面方程: -0.021 x - 0.011 y + 0.999 z - 1.466 = 0 print('内点数: %d / %d, 内点率 %.1f%%' % (len(inliers), len(pcd.points), 100*len(inliers)/len(pcd.points))) # 输出: 内点数: 48210 / 221407, 内点率 21.8% print('法向与铅垂方向夹角: %.1f 度' % np.degrees(np.arccos(abs(c)))) # 输出: 法向与铅垂方向夹角: 1.2 度
结果解读:内点率约两成、法向几乎铅垂、高度约一点四七米(数据站在架子上扫的)——这一块就是地面。剩余的十七万点留给下一层分割。变式:对剩余点再跑一次 RANSAC 可淘出墙面;distance_threshold 取点间距的两到三倍,太大会把墙和地脚线粘成一块。
去掉地面后,桌椅、箱子、行人各自的空间点抱成一团。欧式聚类的规则朴素:两点距离小于阈值就连通,最终连成几团就是几个物体。它依赖上一章的聚类式邻域搜索,距离阈值是唯一关键参数——取值小于物体间隙、大于物体内部点距。
# 欧式聚类提取物体块 rest = pcd.select_by_index(inliers, invert=True) # 非地面点 labels = np.array( rest.cluster_dbscan(eps=0.12, min_points=25, print_progress=False)) n_obj = labels.max() + 1 sizes = [int((labels == i).sum()) for i in range(n_obj)] print('聚类出 %d 个物体块' % n_obj) # 输出: 聚类出 14 个物体块 print('最大三块点数:', sorted(sizes)[-3:]) # 输出: 最大三块点数: [9103, 5217, 4058] noise = int((labels == -1).sum()) print('未归块噪声点: %d (%.1f%%)' % (noise, 100*noise/len(labels))) # 输出: 未归块噪声点: 8211 (4.7%)
结果解读:十四个物体块对应房间里的家具;负标签是没聚进任何团的散点,占比约百分之五属正常,若飙到两成说明 eps 偏小。变式:自动驾驶点云常用"先按高度切一层、再聚类"的套路提取行人车辆,把三维问题降成准二维,速度提升明显。

区域生长从种子点出发,把法向一致、曲率小的邻居持续并入同一区域——适合"按表面性质"分割,比如把一整面弧形墙完整剥出来,欧式聚类做不到这一点(弧墙可能被断开)。分类则给每块地物贴标签:传统路线提取尺寸、主轴、点数等手工特征喂随机森林;现代路线用点云深度网络(如 PointNet 一族)逐点输出语义,第六章再展开。工程现实里,几何分割加简单规则仍占据大量生产管线——便宜、可解释、出错可查。
⚠️ 常见坑:把 RANSAC 的内点全当地面。地面之上还站着桌腿,距离阈值稍大就把桌腿底部一圈"吸"进平面,机器人随后把桌子当可通行区域。解法是先淘平面再做连通性检查,或对内点做二次聚类剔除小团。
💡 关键直觉:RANSAC 与聚类回答两个正交的问题——前者问"谁符合模型",后者问"谁挨得近"。多数场景要两个都问。
分割也要有误差报告,常用两个口径。平面拟合的验收看内点率的合理性与平面参数的稳定度:地面内点率通常在两三成(取决于房间高宽比),法向与铅垂夹角超过两度就要怀疑把斜坡或家具面吸了进来。聚类分割的验收看边界一致性:同一张桌子被切成两块(欠分割的镜像,即过分割)或桌椅粘成一块(欠分割),统计各块的点数分布即可发现——真实物体块的点数不应出现异常的断崖。一个实用技巧是把分割结果投影回深度图染色显示,肉眼五分钟就能过完一整个房间的地物清单,比盯着三维窗口旋转高效得多。语义分类层若引入机器学习,验收还要加一项混淆审查:抽二十个块人工核对标签,椅子被标成桌子的比例就是系统的可信度上限。
地物清点完毕,下一节是本章的高潮:把多站位的碎片拼成整体——配准。