前言

有人会好奇,同样是点云,.pcd.ply 的处理能有啥大区别吗?

其实是有的,.pcd 文件的数据,是基于点的,也就是里面存储的内容全部都是和点相关的信息。

.ply 增加了关于面的信息,也就是有了 mesh。在介绍使用 MeshLab 进行点云表面重建的那篇 文章 中,已经提到过这点。几万个离散的点组成的点云,其中并没有面,除非通过表面重建(如 Delaunay 三角化、Ball Pivoting、Poisson Reconstruction 等)将点云网格化,构建由三角形面片(triangle faces)组成的网格。

处理 .ply 文件,建议使用 Matlab 的 Toolbox Graph 库:
https://uk.mathworks.com/matlabcentral/fileexchange/5355-toolbox-graph

库中相关函数

PLY文件的读取

[vertex,faces] = read_mesh(name);

输出的 vertex为所有点的坐标,这和 pcd.Location 一致。 而 faces 则为构成每个面的 vertex 的索引。 可视化 .ply 格式的点云,也可以用之前用的 pcshow 函数,但是 plot_mesh 函数更好,因为其内置了光照效果。注意 plot_mesh 函数的输入为 vertexfaces

% read ply
name = 'head1.ply';
options.name = name; 
[vertex,faces] = read_mesh(name);
% display the mesh
clf;
plot_mesh(vertex, faces);
shading interp;

ply1.png

Figure 1 plot_mesh函数显示效果

求法向量

在 toolbox 中也内置了为 .ply 点云求法向量的函数 compute_normal,此函数可以分别求出所有点,以及所有面的法向量。

[normal,normalface] = compute_normal(vertex,faces);
% display
options.normal = normal';
normal = normal';
normalface = normalface';
clf; 
plot_mesh(vertex,faces,options); 
shading interp; 
axis tight;
options.normal = [];

plynormalvec.png

Figure 2 法向量

求曲率

compute_curvature 可以用来求点云的曲率:

[Umin,Umax,Cmin,Cmax,Cmean,Cgauss,Normal] = compute_curvature(vertex,faces,options);

参考文章

[1] Toolbox Graph - File Exchange - MATLAB Central