三维重建工具——pclpy教程之点云I/O
文章目录前言1. PCD文件格式2. 从PCD文件读取点云3. 本地保存PCD点云数据4. 连接两个点云5. 读取硬件前言自从上次写了三维重建工具——pclpy使用教程后,发现有很多使用python的小伙伴都想玩一玩点云,但是由于pclpy作者没有给出详细的教程和文档,对于没有c++下PCL开发经验的同学们来说,直接上手python版的pclpy可能会有一定难度。鉴于此,本人决定在学习PCL的基础
前言
自从上次写了三维重建工具——pclpy使用教程后,发现有很多使用python的小伙伴都想玩一玩点云,但是由于pclpy作者没有给出详细的教程和文档,对于没有c++下PCL开发经验的同学们来说,直接上手python版的pclpy可能会有一定难度。鉴于此,本人决定在学习PCL的基础上,计划参考PCL官方教程撰写一个pclpy的教程,共同学习!
python最大的优点就是简单易学,pclpy作为PCL的python绑定版,比C++版的PCL要简单不少。但是也需要提醒一下大家,相比于PCL,pclpy毕竟只是PCL的python绑定,在功能和稳定上肯定是不如PCL,pclpy玩一玩儿可以,但是学习点云还是老老实实的去学C++版的PCL吧
代码都在GitHub开源GitHub
本人技术尚浅,如有错误,望通知更正,共同学习!
1. PCD文件格式
PCL 中 I/O库提供了点云输入输出相关的操作类,并封装了OpenNI兼容的设备源数据获取接口,可直接从众多感知设备获取点云图像等数据。
PCD 文件格式并不是要重新发明轮子,而是为了补充由于某种原因不支持/不支持 PCL 为 nD 点云处理带来的某些扩展的现有文件格式。
PCD 不是第一种支持 3D 点云数据的文件类型。尤其是计算机图形学和计算几何学社区,已经创建了多种格式来描述使用激光扫描仪获取的任意多边形和点云。其中一些格式包括:
- PLY - 一种多边形文件格式,由 Turk 等人在斯坦福大学开发
- STL - 3D Systems 创建的立体光刻 CAD 软件的原生文件格式
- OBJ - 一种由 Wavefront Technologies 首次开发的几何定义文件格式
- X3D - 用于表示 3D 计算机图形数据的 ISO 标准基于 XML 的文件格式
- 其他格式
2. 从PCD文件读取点云
代码:
# 加载点云
cloud = pcl.PointCloud.PointXYZ()
reader = pcl.io.PCDReader()
reader.read("../../data/bunny.pcd", cloud)
3. 本地保存PCD点云数据
代码:
# 加载点云
a = np.random.ranf(300).reshape(-1, 3)
cloud = pcl.PointCloud.PointXYZ.from_array(a)
pcl.io.savePCDFileASCII("./save_pcd.pcd", cloud)
4. 连接两个点云
- 连接点:
在python里面连接两个点云方法非常多,下面介绍使用Numpy实现两个点云的连接。
# 加载点云
a = np.random.ranf(300).reshape(-1, 3)
cloud1 = pcl.PointCloud.PointXYZ.from_array(a)
b = np.random.ranf(210).reshape(-1, 3)
cloud2 = pcl.PointCloud.PointXYZ.from_array(b + 1)
# 拼接两个点云,这里使用Numpy进行拼接
c = np.vstack((cloud1.xyz, cloud2.xyz))
cloud = pcl.PointCloud.PointXYZ.from_array(c)
原理非常简单,点云数据实质上为矩阵数据(PointXYZ维度为为nx3,PointNormal维度为nx7),在点云拼接时保证两个点云的类型一致即可。
- 连接字段
需要用到PCL中的pcl::concatenateFields,但是pclpy似乎并未实现该函数。
这里要求连接的两个点云的个数一致。下面将PointXYZ的点云和Normal类型的法线组合成PointNormal类型的点云:
# 连接字段 pclpy似乎没有实现pcl::concatenateFields,这里使用Numpy进行拼接
a_n = np.random.ranf(size_a*4).reshape(-1, 4) # 随机生成一点法线
d = np.hstack((a, a_n)) # 拼接字段
cloud_dn = pcl.PointCloud.PointNormal.from_array(d)
为了便于观察,下面将PointXYZ和RGB拼接成PointXYZRGB
a_c = np.random.ranf(size_a*3).reshape(-1, 3)*255 # 随机生成颜色
cloud_dc = pcl.PointCloud.PointXYZRGB.from_array(a, a_c)
实际上,pclpy作者也提供了读取其他格式比如las等点云文件,有兴趣的可以参考
5. 读取硬件
这一块儿包括
遗憾的是,这些硬件我一个也没有,就先不做啦(贫穷限制了我o(╥﹏╥)o)
参考:https://pcl.readthedocs.io/projects/tutorials/en/latest/index.html#i-o

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)