ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

点云数据入门:格式、获取方式与可视化工具全解析

点云数据入门:格式、获取方式与可视化工具全解析 点云这个东西这两年是真的火。干自动驾驶的要靠它感知路况做机器人的靠它避障抓取搞测绘的靠它建地形模型连玩AR、做文物保护的人也在用它。但对于第一次接触点云的人来说最容易困惑的就是点云到底是个什么数据它从哪儿来我拿到一份.pcd或者.ply文件又该怎么打开、怎么看这篇笔记就是点云入门的第一课把“点云数据本身”和“点云怎么获取”这两件事彻底讲清楚。我会尽量用大白话去拆把底层原理和实操工具都带上适合刚入门的学生、转行做3D视觉的工程师以及任何想搞清楚“3D数据是怎么进入电脑的”的朋友。不夸张地说点云是连接物理世界和数字世界最直接的一类数据。只有先把“数据从哪来、长什么样、存成什么格式”搞明白了后面才能谈配准、分割、语义识别这些进阶玩法。1. 点云数据到底是什么——从一组坐标说起1.1 点云的本质三维空间里的坐标集合点云的英文是Point Cloud字面意思就是“一堆点组成的云”。它的本质非常简单就是一大堆带有三维坐标的点每个点用(x, y, z)三个数字表示它在空间中的位置。成千上万个这样的点凑在一起就构成了物体表面的形状。你可以在脑子里这样理解拿一支记号笔在一颗足球上密密麻麻地点上几千个点再把这些点全部搬到电脑里每个点记录一个三维坐标电脑就能大体还原出这颗足球的形状。点越多、越均匀还原出来的形状就越精细。但这里有一个关键点需要明确点云记录的是“物体表面的点”而不是物体内部的信息。激光打不到物体内部相机也只能看到表面所以点云天生是“一张皮”而不是一个实心的模型。如果物体表面有遮挡、反光或者透明区域那一块就会缺数据表现为点云里的空洞或稀疏区域。这也是后面所有点云处理任务绕不开的痛点。1.2 一份点云数据里到底有什么常规的.xyz文件里每行就是“x y z”三个数字直观到你甚至可以用记事本打开。但实际项目中点云往往不止存三个坐标常见的字段还包括强度值Intensity激光雷达返回的反射信号强弱。强度值能反映物体表面的材质特性比如道路标线的强度通常远高于沥青路面这在点云分割和分类时非常有用。颜色RGB通过相机和雷达联合标定把相机拍到的颜色映射到每个点上。这让点云从“灰色雕塑”变成“彩色模型”视觉效果好得多也能辅助后续识别。时间戳Timestamp每帧点云的采集时间用于多帧拼接、运动补偿和动态目标分析。自动驾驶领域尤其依赖时间戳来做时序融合。法向量Normal每个点所在局部平面的朝向。法向量不是传感器直接给的而是通过邻域点计算出来的常用于平面分割、表面重建和特征提取。回波次数Return Number激光脉冲可能被多个物体反射比如穿透树冠打到地面系统会记录第几次回波。这个信息对植被分类、地形提取很有用是机载激光雷达的标配字段。实际存储时不同格式会保留不同的字段组合。这带来一个很实际的教训你在网上下载的点云数据很可能不是单纯的xyz坐标而是带着强度、颜色甚至回波信息的“富字段”数据。处理前先看清楚字段定义否则读进来之后傻傻分不清哪一列是强度哪一列是颜色容易出大问题。1.3 点云和网格模型、体素的区别很多新手会把点云和三维模型搞混这里把三者的区别一句话说清点云Point Cloud无序的离散点集合只有坐标和一些附加属性没有“面”的概念。数据获取简单但表达不连续。网格模型Mesh在点云基础上通过三角面片连接而成的连续表面有顶点、边、面的拓扑关系适合渲染和3D打印。体素Voxel像三维像素一样把空间切分成一个个小立方体每个体素占据或空闲适合深度学习卷积处理但分辨率一高内存就爆炸。打个比方点云是“沙盘上的钉子”网格是用线把这些钉子连起来的“网”体素则是把整个空间切成“乐高积木块”。初学者最容易踩的坑是拿到点云就想直接渲染成光滑曲面实际上中间必须经过表面重建这一步常见的算法有Poisson重建、Delaunay三角化、Marching Cubes等。这些后续笔记展开讲现在记住方向就行。2. 点云数据都存放在哪儿——格式与存储细节2.1 常见点云格式PCD、PLY、LAS、XYZ/TXT、BIN点云格式多到让人头大但大部分项目滚来滚去就那几种。我按使用场景把它们分成三类整理成一张表格式扩展名典型来源特点常见用途PCD.pcdPCL库头部灵活支持自定义字段PCL原生格式算法开发、PCL处理PLY.ply扫描仪、三维重建原生支持顶点面片也支持RGB模型重建、渲染LAS/LAZ.las/.laz机载/地面激光雷达工业级标准带强度、回波、分类信息测绘、林业、地形分析XYZ/TXT.xyz/.txt各种传感器导出纯文本简单通用但文件大算法验证、格式转换BIN.binKITTI数据集等二进制裸数据加载快自动驾驶、深度学习PCD格式是PCLPoint Cloud Library的主场你在跑点云配准、滤波、分割这些算法时代码里出现最多的大概率就是.pcd。它的文件结构不复杂前面是文本头部记录版本、字段、点数、尺寸类型等信息后面跟着的是二进制或ASCII排列的点数据。有一次我把PCD文件用记事本打开看到头部写着FIELDS x y z rgb一下就明白了这个文件存了哪些字段。所以遇到PCD文件打不开或者读取出错先不要慌打开头部看两行问题通常就破解了一半。PLY格式因为同时支持顶点和面片是三维重建任务里的老熟人。很多扫描软件直接导出PLY网格数据和点云数据能同时保留省去后续转换的麻烦。LAS格式则几乎是测绘行业的默认标准文件里不仅有点的坐标还带分类代码比如2表示地面点5表示植被用CloudCompare或LASlib处理非常方便。2.2 存储格式背后的两个关键差异文本和二进制新手最容易忽略的是“同一种格式也有不同编码方式”。以PCD为例既可以是ASCII文本也可以是二进制二进制编码同样的点云文本格式比二进制大好几倍但肉眼可读、排错方便。二进制格式加载速度快得多文件体积小处理大数据集时必须用二进制否则内存和磁盘都吃不消。我曾经在处理一份将近1000万点的点云时一开始因为偷懒导出了ASCII的PCD结果文件3个多GB读取一次要等老半天后来转成二进制版本体积降到600MB左右处理效率一下子上来了。所以我的建议是小数据量调试阶段用文本格式无所谓上了规模一定要切二进制这个习惯能帮你省下大把时间。2.3 快速打开点云文件的工具拿到一份点云文件想先看一眼长什么样有几种很成熟的工具CloudCompare开源、免费、夸平台速度飞快能开PCD、PLY、LAS、XYZ等几乎所有常见格式。我最常用的操作就是拖一个文件进去按下快捷键调整点大小和颜色渲染几秒钟就能判断数据质量。PCL自带的pcl_viewer命令行工具打开PCD非常方便。比如在终端输入pcl_viewer rabbit.pcd就能弹窗看到点云鼠标拖拽旋转缩放支持多窗口对比。RVizROS生态的可视化工具。跑ROS和机器人的朋友很熟悉订阅点云话题就能实时看到雷达数据对调试传感器驱动很有帮助。Python Open3D适合写脚本批量处理时顺手可视化。一行o3d.io.read_point_cloud()读入再用draw_geometries()弹窗显示代码量很小适合二次开发。MeshLab偏网格处理但也能打开点云做简单显示和重建。CloudCompare特别适合入门因为它几乎不用配置装完就能用。你可以把它理解成“点云界的PS”后续学点云配准、分割也经常会在它里面做预处理和可视化验证。3. 点云从哪来四条主流获取路径和原理3.1 激光雷达LiDAR用激光测距“打点”LiDARLight Detection and Ranging是目前最成熟、最精准的点云获取方式之一。它发射激光脉冲激光打到物体表面反射回来传感器记录从发出到接收的时间差光速乘以时间差再除以2就得到了到物体的距离。有了距离和已知的激光发射角度就能算出目标点的三维坐标。这个原理和蝙蝠靠回声定位差不多只不过蝙蝠用声波LiDAR用光波。一台激光雷达一边旋转一边打点一圈扫下来就能得到周围一圈的三维点。车载的64线、128线激光雷达就是并列多个激光头分层扫描进而得到足够密的点云来描述路面、车辆、行人。LiDAR的优势是精度高、受光照影响小晚上也能用缺点是设备贵而且在雨雪雾天气里激光会被散射点云质量会明显下降。机械式雷达还有寿命和维护成本的问题半固态和固态雷达正在慢慢改进这些短板。3.2 RGB-D相机像素自带深度值RGB-D相机跟激光雷达的测距方式不太一样它的核心是给每个像素额外附上一个深度值。常见的RGB-D相机主要有两种技术路线结构光Structured Light把特定的光斑图案投影到物体上通过观察图案的形变计算深度。就是一台微型投影仪加一台摄像头在配合工作。手机上的Face ID、早年的Kinect v1都用了这个原理。结构光在近距离精度很高但受环境光干扰严重阳光直射下基本失灵。ToFTime of Flight原理和LiDAR很像也是发射光脉冲测时间差只不过ToF相机是一整块感光芯片上同时测量所有像素的深度。Kinect v2、iPhone的激光雷达扫描仪、许多工业3D相机都属于ToF方案。ToF响应快、帧率高适合动态场景但分辨率通常比结构光低一些边缘细节容易糊。RGB-D相机的优势是便宜、体积小、能同时输出彩色图和深度图非常适合室内机器人和消费级应用。缺点是探测距离短一般几米到十几米受环境光和物体材质影响较大精度和激光雷达不是一个量级。3.3 摄影测量和多视角重建用普通照片“算”出点云摄影测量这条路更有意思它不需要任何主动测距设备只用普通相机从不同角度拍一堆照片通过特征点匹配和三角化就能算出空间点的位置。原理是同一个三维点在两张不同角度的照片里都有投影如果能在两幅图像中找到这个对应点再知道两台相机的位姿就能沿着两条视线反向延长交出一个三维点。一个点这样算出来成千上万个匹配点就能重建出稠密点云。SFM运动恢复结构和MVS多视角立体视觉就是这套流程的代表性技术开源工具像COLMAP、Meshroom就是干这个的。这种方法成本极低、场景颜色信息丰富很适合户外大场景建模和文化遗址保护。但缺点也很明显对物体表面的纹理要求高纯白墙壁、玻璃、镜面这些没有纹理或纹理重复的区域很难匹配出可靠点云而且整个重建过程计算量巨大照片多时跑一晚上都有可能。3.4 三种方式怎么选一张对比表获取方式原理精度成本适用场景短板激光雷达LiDAR激光飞行时间厘米级高自动驾驶、测绘、地形建模贵恶劣天气受影响RGB-D相机结构光/ToF毫米级近距离低室内机器人、AR、工业检测距离短受光影响大摄影测量/MVS被动视觉三角化中受数据集影响大低文物重建、大场景建模、影视资产纹理要求高计算慢还有个比较小众的途径是三维扫描仪比如工业级的Atos、EinScan这些精度能做到微米级但价格昂贵通常是特定工业场景才会用。对大多数入门学习者来说第一份点云完全不用自己买设备用公开数据集更省事。4. 自己动手获取一份点云从0到1实操4.1 用公开数据集先“白嫖”一份点云对于初学者我不建议一开始就折腾设备点云入门阶段先拿现成的数据练手识图更重要。这里推荐几个我常用的公开数据集斯坦福3D扫描数据集大名鼎鼎的Stanford Bunny斯坦福兔子、Armadillo就是从这里来的。PCD示例文件里经常出现适合练手配准和重采样。KITTI数据集自动驾驶领域的标杆数据集包含64线激光雷达采集的点云数据是.bin格式配套有标定文件、图像和GPS信息。想看“真实世界的大场景点云”KITTI是不二之选。ModelNet4040个类别的CAD模型采样点云常用于点云分类和识别研究文件格式是.off或手工转成.npy结构简单适合做深度学习训练。S3DIS室内场景点云数据集带语义标签做点云分割必用。nuScenes另一个自动驾驶大数据集点云加多相机图像格式和工具链比较现代。拿到数据后建议先别急着写代码丢进CloudCompare里看一看体会一下点云长什么样、稀疏程度如何、噪声在哪。我见过不少人一上手就调算法结果连点云都没打开过这其实是在给自己挖坑。4.2 用RGB-D相机扫一个物体如果你手边有Kinect、RealSense这类RGB-D相机自己采集一份点云其实非常快。大致流程是连接相机打开官方SDK或者用Open3D读取深度流和彩色流。对齐深度图和彩色图获得每个像素的(x, y, z)加(r, g, b)。把数据组成点云格式并保存成PLY或PCD文件。如果只扫一个面一次性拍摄就够了想要完整360度模型则需要旋转物体或相机多帧数据做完配准再融合。用RealSense配合pyrealsense2库几十行Python就能实现实时显示点云。我第一次上手时遇到的最大问题就是深度图和彩色图没对齐物体边缘出现红绿蓝三色的彩边后来开了SDK里的对齐选项才解决。如果你用的是Open3D它对RealSense和Kinect的集成做得比较友好直接提供现成接口省去不少麻烦。4.3 用手机拍摄生成点云从零成本到高逼格如果连RGB-D相机都没有还有一招用手机拍摄几张照片丢给COLMAP或者Meshroom做运动恢复结构重建一样能拿到点云。我在一个业余项目里用iPhone拍了大概80张杯子照片在COLMAP里跑了十几分钟重建出十几万点的稠密点云还带颜色。整个过程不需要任何专业设备让我对“点云可以从普通照片里长出来”这件事有了直观感受。具体步骤围绕目标物体拍摄大量照片保证相邻照片之间重叠率不低于60%-70%。把照片导入COLMAP依次执行特征提取、特征匹配、稀疏重建。执行稠密重建导出PLY格式的点云。用CloudCompare打开检查重建质量。这个方案对小物体、小场景非常管用。但要注意拍摄环境光线要均匀避免高光和玻璃面背景不要太杂乱否则特征匹配会混乱。另外照片数量少会导致重建出来的点云空洞很多质量惨不忍睹建议一次拍够100张以上。4.4 获取点云之后的第一件事预处理很多新手拿到点云就直接进算法这是个大忌。传感器直接输出的“原始点云”通常带着一堆问题离群噪点、重复点、密度不均匀、坐标系不明确。我至少会做这几步再往下走去噪用统计滤波或半径滤波去掉孤立噪点。统计滤波会计算每个点到邻域的距离分布把偏离均值太远的点剔掉效果比较稳定。下采样用体素滤波把空间网格化每个网格保留一个代表点。这样能把百万级的点云降到几十万甚至几万算法跑起来快很多而且点云整体形状几乎不变。移除地面或背景如果场景里有大片地面可以用RANSAC平面拟合或者直通滤波先把地面滤掉后续分割识别会轻松很多。坐标变换确认点云坐标是传感器坐标系还是世界坐标系需要的话乘以变换矩阵换到目标坐标系否则后续拼接会出大问题。这四步做完点云基本就是“干净可用”的状态了。哪怕后面只是做可视化预处理一下画面观感都会提升不少。5. 常见问题与排查技巧实录点云项目里翻车最多的场景其实是数据读取和显示环节。这里把我自己踩过且身边同事也经常踩的坑列出来直接对照排查就行。现象可能原因解决办法PCD文件读取报错文件头字段和实际数据不对应用文本编辑器打开头部检查FIELDS、POINTS、DATA是否匹配点云显示出来是倒着的坐标系定义不同左手系/右手系检查数据说明书必要时做镜像或旋转变换点云大量黑点强度值/颜色值范围不对或者深度值为0滤掉无效点重新拉伸显示范围点云稀疏有洞采集视角缺失、物体表面反光补拍更多视角或做上采样/表面重建文件太大打不开点数过多内存不够先做下采样或者用二进制格式读入不同帧点云位置乱跳缺少位姿信息无法拼接记录每帧传感器位姿或做配准对齐5.1 深度图变点云时出现“黑洞”用RGB-D相机时深度图里经常有一些像素没有值原因是物体太近、太远、表面太黑或者太过反光。这些无值像素在转成点云时会变成零点或NaN点显示出来就是黑洞。解决办法是在转点云前对深度图做填充或插值或者在转点云后直接把NaN点和零值点滤除。看起来很简单但很多入门者第一次遇到时都会以为是相机坏了。5.2 点云缩放与坐标尺度不统一不同的采集设备对尺寸的表示不一样。激光雷达常用米RGB-D相机常用毫米有些数据集则是厘米甚至任意单位。把不同来源的点云放在同一个场景里时尺寸差几个数量级非常常见。我自己踩过一坑有一次把一个upscaled到几十万倍的点云和另一个正常尺度的点云放在一起做配准花了半天才发现只是单位不一致。拿到任何数据第一件事就是看文档确认单位最好打印一下点云坐标的最大最小值和中心位置心里有数。5.3 电脑带不动超大点云怎么办动辄几千万上亿点的点云普通电脑内存是吃不消的。可以先用CloudCompare或PDAL做下采样减到几百万点再喂给算法。如果只是可视化查看还可以设置点云在渲染时以“抽取显示”的方式运行比如只显示10%的点画面流畅度会好很多。处理大型测区点云时我还会把数据先分块每块单独处理后再拼接这样内存占用能控制住。5.4 打开点云没有颜色全是灰的这个现象一般是文件本身不包含颜色字段或者查看工具没有正确映射颜色字段。用CloudCompare打开时如果数据里有RGB字段默认会按颜色显示如果没有可以在属性框里选其它标量场染色比如用高程、强度或法向量来着色。颜色信息对三维重建和识别的帮助很大有条件的话尽量用带RGB的点云。5.5 点云坐标偏移到不知道哪儿去了这是最诡异的一类问题点云数据明明有但坐标值大得离谱模型根本不在原点附近。通常原因是点云使用的是UTM投影坐标或大地坐标数值范围是几百万米这种量级。处理方法是减去一个参考点做中心化比如所有点坐标都减去点云质心这样后续算法计算会稳定很多也方便可视化。6. 关于格式兼容与坐标系的小心机点云处理领域最麻烦的事之一就是“格式地狱”。PCL喜欢的格式Open3D不一定完全兼容LAS格式读取要额外库KITTI的bin文件没有文件头信息全靠人工指定维度。我的经验是统一转换到一两个中间格式来使用算法处理阶段用PCD配合PCL或Open3D读写。可视化与手工编辑用PLY兼顾点和面CloudCompare和MeshLab都能很好支持。跨平台交换用LAS/LAZ工业界标准兼容性最强PDAL库能帮忙转。坐标系方面点云数据最怕的就是“左右手系混用”。RGB-D相机、LiDAR通常使用右手系但有些软件导出的点云是左手系或者Y轴朝下。如果你发现点云看起来像是镜像比如文字反转、左右颠倒多半就是坐标系的问题。解决的方法可以是翻转某一轴或者在可视化工具里手动调整视图方向。不过从根本上讲还是要确保你的程序在处理不同来源的数据时统一到一个约定好的坐标系下再计算。我目前在项目中约定所有感知数据先变换到世界坐标系统一单位米Y轴朝上右手系。这样不管后面接分割、配准还是深度学习模型都不用反复折腾坐标转换省心很多。7. 下一步点云处理技术地图点云入门笔记想做一个系列这篇先把“数据是什么、从哪来”讲透后面很多方向都可以顺着往下走滤波与预处理体素滤波、统计滤波、半径滤波、条件滤波这是基础功。配准ICP、NDT以及特征匹配方法解决“怎么把多帧点云拼起来”的问题。分割与聚类RANSAC平面分割、欧式聚类、区域生长用来把场景拆成不同的物体和区域。特征提取与描述FPFH、SHOT、PFH以及PointNet系列深度学习特征为识别和配准提供素材。表面重建从点云到网格模型Poisson重建、Delaunay三角化值得专研。语义分割与实例分割用深度学习给每个点打标签这已经是当前视觉领域的核心方向之一后面一定单独写几篇详谈。在学习路线上我的建议是先用CloudCompare把工具玩熟再到Open3D/PCL里写脚本跑流程最后再碰深度学习。顺序反了容易一头扎进网络结构里却连点云的基本思维都没有建立起来后面很容易误入歧途。我第一次接触点云的时候连怎么打开一个.pcd文件都折腾了不少时间更别提理解强度、回波、法向量这些概念了。但一步步走下来你会发现点云并没有想象中那么神秘。它不过是一堆带着三维坐标的点而已而我们要做的就是教会计算机理解这些点背后的世界。
返回列表