什么是点云(Point Cloud)

直观地讲,点云文件就是坐标系中大量的点组成的数据集。

PCD.jpg

除了 PCD 格式以外,PLY,OBJ,X3D 等格式也支持点云数据。

程序如何识别PCD文件

在每个点云文件的开头,都包含一个 header。

在 header 中声明了该点云数据的属性,如果缺少 header 或者缺少了部分属性的声明,这个点云文件可能不能被正确识别。

比如 TU Wien 提供的由佛头雕像碎片扫描得来的PCD格式文件,直接导入Matlab中就不能被正确识别:

ptCloud = pcread('head_part01.pcd');
pcshow(ptCloud);

出错 pcread (第 99 行)
properties = visionPcdRead(filename,requiredProperties,optionalProperties);
出错 reconstruction (第 1 行)
ptCloud = pcread('gargoyle_part01.pcd');

点云文件中的header

为了让 Matlab 能读取上述的点云文件,需要手动在文件中添加 header。header 包含以下内容,且它们的顺序不能变

# .PCD v.7 - Point Cloud Data file format
VERSION .7
FIELDS x y z nx ny nz
SIZE 4 4 4 4 4 4
TYPE F F F F F F
COUNT 1 1 1 1 1 1
WIDTH 299266
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 299266
DATA ascii

  1. VERSION:描述的是 PCD 文件的版本

  2. FIELDS:声明每个维度的数据所代表的信息

  3. SIZE:以字节 Byte 为单位,每个维度的每个数据的大小

数据类型

SIZE

unsigned char/char

1 byte

unsigned short/short

2 bytes

unsigned int/int/float

4 bytes

double

8 bytes

  1. TYPE:每个维度中,数据的类型

数据类型

精度

TYPE

signed types

int8 (char), int16 (short), and int32 (int)

I

unsigned types

uint8 (unsigned char), uint16 (unsigned short), uint32 (unsigned int)

U

float types

F

  1. COUNT:每个维度的数据中,包含几个元素。比如在上述中 Filed x 的数据中,该维度只包含1个元素,即 x 坐标。但是某些特征会有更多元素。如未声明,Count 默认为 1

  2. WIDTH:对于无组织的数据集,width 指的是点云的总点数,(同 Points)。对于有组织的数据集,width 指的是每行中点云的数量

  3. HEIGHT:对于无组织的数据集,为 1。可以用来判断数据集是有组织/无组织的。对于有组织的数据集,height 指的是行的数量

何为有组织?

有组织一般是矩阵结构,被清晰的分成行和列。
你可能会想,所有的 PCD 文件都是矩阵,如果只有 1 列,那也不能描述一个图像。这个也是我的疑问。
根据 Zhaokai Huang 的解释,Width 和 Height 的单位,是点的数量。尽管 FIELDS x y z 的数据有 3 列,但是每行仅代表一个点。

  1. VIEWPOINT:可以用于不同坐标系之间的转换,也可以用于获取其他特征translation(tx, ty, tz) + Quaternion(qw, qx, qy, qz)。默认值为 0 0 0 1 0 0 0

  2. POINTS:点的总数Points = Height x Width

  3. DATA:数据的存储格式,有 ascii, binary 和 binary_compressed 三种格式

下面的例子是手动为 TU Wien 的 PCD 文件添加的 header:

# .PCD v.7 - Point Cloud Data file format
VERSION .7
FIELDS x y z nx ny nz
SIZE 4 4 4 4 4 4
TYPE F F F F F F
COUNT 1 1 1 1 1 1
WIDTH 102938
HEIGHT 1
VIEWPOINT 0 0 0 1 0 0 0
POINTS 102938
DATA ascii

102938
1.011964 0.361297 0.685791 0.345835 0.656790 0.670093
1.023398 0.327738 0.684021 0.711937 0.049566 0.700492
1.030203 0.338442 0.676021 0.759381 0.142571 0.634834
1.035776 0.347701 0.666306 0.775289 0.410973 0.479612
1.038322 0.353410 0.652387 0.672118 0.662722 0.330237
1.007311 0.328270 0.696681 0.386798 0.088136 0.917943
1.015605 0.340721 0.690751 0.591992 0.094817 0.800347
1.022397 0.351409 0.682731 0.727027 0.359505 0.584968
1.018546 0.356378 0.684908 0.615437 0.451608 0.645977
1.026427 0.358859 0.670873 0.662852 0.673819 0.326489
1.026488 0.361653 0.653498 0.593205 0.795269 0.125118
0.995876 0.336982 0.698348 -0.046741 0.321698 0.945688
1.005216 0.350660 0.693871 0.150240 0.386989 0.909762
1.010517 0.358848 0.688599 0.093089 0.633670 0.767982
1.011428 0.361500 0.685706 -0.051091 0.800765 0.596795
1.012907 0.362980 0.683394 0.344692 0.844429 0.410032
1.014405 0.366882 0.671723 0.301833 0.889688 0.342566
1.050411 0.320620 0.651526 0.818362 0.061351 0.571418
1.056186 0.330115 0.642094 0.840398 0.251403 0.480133
1.059744 0.337011 0.629580 0.788652 0.477697 0.387084
1.030111 0.313488 0.675790 0.732464 -0.036297 0.679837
1.023415 0.327707 0.684004 0.720720 -0.026997 0.692700
1.037215 0.324543 0.668206 0.769673 -0.008567 0.638380
1.033512 0.332423 0.672761 0.764597 0.048633 0.642672
1.043732 0.334909 0.659804 0.814237 0.129242 0.565963
1.041905 0.338366 0.661710 0.799961 0.249749 0.545607
1.048278 0.342963 0.648664 0.808180 0.517638 0.280886
1.041505 0.350636 0.651646 0.765379 0.573880 0.291302
1.049364 0.346961 0.632714 0.695640 0.688046 0.206584
1.015291 0.315507 0.690212 0.623701 -0.075095 0.778048
1.008936 0.326144 0.695739 0.530107 -0.042689 0.846855
1.023367 0.327690 0.684053 0.681226 -0.026203 0.731604
1.038327 0.353561 0.651464 0.635710 0.771927 0.001101
1.037443 0.355102 0.633704 0.569775 0.820953 0.037321
0.997210 0.313701 0.700100 0.257353 -0.006301 0.966297
1.006258 0.326730 0.697170 0.307550 0.027328 0.951139
1.024709 0.362723 0.653531 0.480678 0.875884 0.042136
1.026458 0.361664 0.653166 0.531235 0.847208 -0.005295
1.024737 0.362322 0.633603 0.481632 0.876157 -0.019484
0.984768 0.321232 0.700367 -0.188216 0.270342 0.944188
0.994462 0.334961 0.698712 -0.167593 0.223623 0.960159
0.993535 0.337227 0.697467 -0.413795 0.422269 0.806513
0.992373 0.350045 0.687488 -0.500029 0.577478 0.645361
0.994005 0.360854 0.677195 -0.331955 0.782894 0.526197
0.999034 0.369217 0.666521 -0.032753 0.971199 0.236009
1.013574 0.368010 0.657080 0.344987 0.936461 0.063438
1.013246 0.368246 0.652653 0.305482 0.951901 0.023769
0.982903 0.346613 0.680415 -0.649269 0.573639 0.499388
0.992291 0.360346 0.676005 -0.576426 0.664634 0.475389
0.997454 0.369124 0.665721 -0.222296 0.925662 0.306163
0.998333 0.372878 0.649484 0.194059 0.971738 0.134408
1.056026 0.305082 0.641769 0.823855 -0.063948 0.563182

参考文章

  1. Point Cloud Library

  2. 3D点云基础知识

  3. Can anyone explain the difference between organized and unorganized point cloud?