Open3d 常用数据格式说明:pcd, ply, stl等

文章目录

可读格式

Open3d支持的可以直接打开的点云格式如下

行格式说明
xyz[x,y,z]空间直角坐标
xyzn[x, y, z, nx, ny, nz]直角坐标和法线向量
xyzrgb[x, y, z, r, g, b]直角坐标和[0,1]区间的颜色
pts含头文件见详情
ply图形格式见详情
pcd点云数据PCL文件读写
stl三角面数据见详情

其中,pts的第一行是点数,其他行的格式可以为

  • [x, y, z, i, r, g, b],
  • [x, y, z, r, g, b]
  • [x, y, z, i]
  • [x, y, z]

其中,r,g,b格式为uint8。

ply

ply格式即Polygon File Format,又称斯坦福三角形文件,其内容分为文件头和数据,其中文件头通过ASCII编码,数据可以采取ASCII或者二进制的形式。

其文件头必以ply为首行,第二行为文件格式,一般来说有三种写法,分别表示ASCII,或者大小端序存放的二进制文件。

format ascii 1.0
format binary_little_endian 1.0
format binary_big_endian 1.0

ply文件支持注释,凡是以comment为首的行,都会被当作注释处理。

通过elementproperty关键字,可以描述元素属性,其中element表示元素,property表示属性,一个元素往往有多种属性,故而其写法类似下面这样

element <element name> <number in file>
 property <data_type> <property name 1>
 property <data_type> <property name 2>
 property <data_type> <property name 3>

data_type为数据类型,支持主要的C语言类型,包括两种写法,一种指定数据位数,包括int8 uint8 int16 uint16 int32 uint32 float32 float64,另一种不指定数据位数,包括char uchar short ushort int uint float double

以一个正方体为例,每个顶点需要3个小数表示坐标,另外需要3个无符号8位整数表示颜色,则其写法为

element vertex 8
property float x
property float y
property float z
property uchar blue
property uchar green
property uchar red

如果用面来描述这个正方体,则可写为

element face 6
property list uchar int vertex_indices

在规定了一系列的数据之后,最后文件头以end_header结尾。

stl

STL即StereoLithography,是立体激光雕刻的通用格式,存储的数据内容为三角面,数据格式分为ASCII和二进制两种。

其中,二进制STL的起始84个字节为文件头,用于描述3D模型的文件名(前80字节)和三角面个数(后4字节)。

在数据部分,以50个字节为一个三角面,逐个给出每个三角面片的几何信息。50个字节包括

  • 三角面片的法矢量 3x4
  • 三个顶点坐标 3x3x4
  • 三角面属性 2

ASCII格式则按行写入数据,每个三角面由7行数据构成,内容与二进制的50个字节相同,其书写结构大致为

solid filename stl          //自定义文件头 
   facet normal x y z       //法向量
       outer loop 
           vertex x y z     //第一个顶点坐标 
           vertex x y z     //第二个顶点坐标 
           vertex x y z     //第三个顶点坐标 
      endloop   
   endfacet         //完成一个三角面片定义 
   …… 
endsolid filename stl ∥整个STL文件定义结束

最后,STL对三角面的组织并非毫无规律的,其遵循下面几个原则

  • 共顶点:相邻三角面必须有两个共同顶点
  • 取向规则 单个面片法向量符合右手法则且指向实体外面
  • 充满规则 小三角面片必须布满三维模型的所有表面,不得遗漏
  • 取值规则 顶点坐标值必须非负,即STL实体在坐标系的第一象限

此外,还支持objglb等格式,由于二者相对来说比较复杂,故放在后续介绍。

### 将STL文件转换为PCD格式 为了确保从STL文件到PCD格式的高质量点云转换,可以采取多种方法来实现这一目标。由于直接使用MeshLab或其他在线工具可能会导致点云稀疏且不均匀[^1],建议采用编程方式利用PCL库来进行更精确的控制。 #### 方法一:基于PythonOpen3D库 这种方法适用于希望快速上手而不需要编译C++代码的情况: ```python import open3d as o3d # 加载 STL 文件 mesh = o3d.io.read_triangle_mesh("input.stl") # 使用 Poisson 表面重建算法生成密集点云 poisson_mesh, densities = mesh.compute_poisson_surface_reconstruction() points = poisson_mesh.vertices # 创建 PointCloud 对象并将顶点数据赋给它 pcd = o3d.geometry.PointCloud() pcd.points = o3d.utility.Vector3dVector(points) # 可选:下采样以减少点数 downsampled_pcd = pcd.voxel_down_sample(voxel_size=0.05) # 保存 PCD 文件 o3d.io.write_point_cloud("output.pcd", downsampled_pcd) ``` 此脚本通过读取STL模型并应用泊松表面重建技术创建了一个更加稠密和平滑的点云表示形式[^2]。之后可以通过体素网格滤波器调整最终输出中的点密度。 #### 方法二:基于C++与PCL库 对于熟悉C++开发环境的人来说,可以直接调用PCL函数完成相同的操作: ```cpp #include <pcl/io/ply_io.h> #include <pcl/conversions.h> #include <pcl/surface/vtk_smoothing/vtk_utils.h> int main(int argc, char** argv){ pcl::PolygonMesh mesh; // 从 STL 文件加载多边形网格 if (pcl::io::loadPolygonFileSTL ("input.stl", mesh) == -1) return (-1); // 转换为点云对象 pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>); pcl::fromPCLPointCloud2(mesh.cloud,*cloud); // 存储为 PCD 文件 pcl::io::savePCDFileASCII ("output.pcd", *cloud); } ``` 这段代码展示了如何先导入STL文件再将其转化为`PointCloudXYZ`类型的实例,最后导出成PCD格式供后续处理或可视化之用。 无论选择哪种途径,都应确保所使用的软件版本兼容以及安装必要的依赖项。上述两种方案均能有效地解决原始问题中提到的质量低下情况,并提供适合于CloudCompare平台操作的理想输入源。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微小冷

请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值