点云做 PCA 是理解 PCA 最直观的例子之一。
对于一个物体的点云,PCA 的核心目的就是:
把每个 3D 点看成一个样本,点的 (x,y,z) 坐标看成 3 个特征,通过分析点云在哪个方向分布最"长",提取物体的几何主轴。
1. 一个物体的点云如何表示成矩阵?

谁是样本?谁是特征?
这是最关键的。
样本 Sample
每一个点就是一个样本。

特征 Feature

| x | y | z | |
|---|---|---|---|
| 点1 | (x_1) | (y_1) | (z_1) |
| 点2 | (x_2) | (y_2) | (z_2) |
| ... | ... | ... | ... |
| 点N | (x_N) | (y_N) | (z_N) |
2. PCA 为什么能提取点云几何主轴?
假设你有一个"细长的杆状物体":
text
PC1 主轴
↗
● ● ● ● ● ●
● ● ● ● ● ●
● ● ● ● ●
点云在 PC1 方向上分布最长。
而在其他两个方向上的变化较小。
所以:
- PC1:最长方向 → 物体主轴
- PC2:次长方向 → 第二几何方向
- PC3:最短方向 → 厚度方向
例如:
text
PC2
↑
│
● ● ● │ ● ●
● ● ● ● ● ● ● ● ─────→ PC1
● ● ● │ ● ●
│
对于 3D 物体:

3. 第一步:计算点云中心

4. 第二步:点云中心化

5. 第三步:计算点云协方差矩阵


所有点在 x 方向上有多"分散"

x 和 y 是不是一起变化,以及怎么一起变化

6. 协方差矩阵为什么能够描述物体形状?
这是点云 PCA 最重要的一点。
假设物体沿某个斜方向延伸:
text
z
↑
│ ●
│ ●
│ ●
│ ●
│ ●
└────────────────→ x
你会发现:
当 (x) 增大时,(z) 也增大。
因此:
Cov(x,z)>0
协方差矩阵就能够记录:
点云在 XYZ 三个方向之间是如何共同变化的。
它不仅告诉你:Var(x),Var(y),Var(z)
还告诉你:Cov(x,y),Cov(x,z),Cov(y,z)
因此 PCA 可以找到:
真正的物体延伸方向,而不仅仅是世界坐标系的 X/Y/Z 方向。
7. 第四步:对协方差矩阵进行特征值分解

因此它们天然形成一个新的 3D 坐标系:
text
v3
↑
│
│
O────────→ v1
╱
╱
↙
v2
这个坐标系就是:

8. 特征值和物体形状有什么关系?

可以理解为:
text
长度 ───────────→ λ₁
宽度 ↑
│ λ₂
厚度 ⊙ λ₃
9. 一个具体的点云例子

计算质心

计算协方差矩阵

求特征值和特征向量

也就是说,PCA 自动发现:
这个物体主要沿 XY 平面的 45° 方向延伸。
虽然我们事先没有告诉 PCA:
"物体沿 45° 方向。"
它通过协方差矩阵自动找到了这个方向。
10. 在点云中,PCA 到底是谁对谁?
结合你前面问的"谁是样本、谁是特征、矩阵如何表示",可以总结成:
原始点云

| PCA 概念 | 点云中的含义 |
|---|---|
| 一个样本 | 一个 3D 点 Pi |
| 样本数 | N 个点 |
| 一个特征 | x、y、z 坐标 |
| 特征维度 | 3 |
| 原始数据矩阵 | N x 3 |
| 均值 | 点云质心 |
| 中心化 | 每个点减去质心 |
| 协方差矩阵 | (3 x 3) |
| 特征向量 | 点云几何主轴方向 |
| 特征值 | 点云沿该主轴的分散程度 |
11. 对点云提取主轴的完整代码逻辑
cpp
// 1. 输入 N 个 3D 点
N × 3 点云矩阵 X
// 2. 计算点云质心
mu = mean(X)
// 3. 中心化
Xc = X - mu
// 4. 计算 3×3 协方差矩阵
C = Xc.transpose() * Xc / (N - 1)
// 5. 特征值分解
C * v = lambda * v
// 6. 按特征值降序排列
lambda1 >= lambda2 >= lambda3
// 7. 提取主轴
v1 = 第一主轴,物体最长方向
v2 = 第二主轴,物体次长方向
v3 = 第三主轴,物体最小扩展方向
最终:

对于 SLAM、点云处理中的一个实际理解就是:PCA 不关心世界坐标轴原来是怎么定义的,而是根据点云自身的空间分布,自动找出它"最主要的延伸方向"。