Plücker 射线表示 是计算机视觉里一个很重要的几何表示方法,尤其适合表示三维空间中的一条直线,在新视角合成、匹配、重建里经常会用到。
先说直观:Plücker 射线到底在表示什么?
一条三维直线,除了要知道它朝哪个方向走 ,还要知道它在空间里的位置
比如两条平行线:
- 方向一样
- 但位置不同
所以只用一个方向向量是不够的。
Plücker 表示就是用 6 个数 来描述一条空间直线:
L=(d,m)\mathbf{L} = (\mathbf{d}, \mathbf{m})L=(d,m)
其中:
d∈R3\mathbf{d} \in \mathbb{R}^3d∈R3:方向向量
表示直线的方向。
m∈R3\mathbf{m} \in \mathbb{R}^3m∈R3:矩向量
表示这条线相对于原点的位置关系。如果你把一条直线看成"一个方向的作用线",那它绕原点产生的"偏移效应"就可以通过叉乘来描述。
所以一条线用 6 维表示
Plücker 坐标的构造方式
如果一条直线经过两点:
p,q∈R3\mathbf{p}, \mathbf{q} \in \mathbb{R}^3p,q∈R3
那么它的 Plücker 表示可以写成:
m=p×q\mathbf{m} = \mathbf{p} \times \mathbf{q}m=p×q
于是整条直线表示为:
L=(d,m)\mathbf{L} = (\mathbf{d}, \mathbf{m})L=(d,m)
相机射线是什么?
在针孔相机模型里,一个像素点 ((u,v)) 对应空间中的一条射线:
- 起点:相机中心
- 方向:从相机中心穿过该像素在成像平面上的点
也就是说,一个像素不对应一个 3D 点,而是对应一条 3D 射线
普通相机射线怎么表示?
假设:
- 相机中心为 (\mathbf{o})
- 射线方向为 (\mathbf{d})
那么这条射线可以写成:
r(t)=o+td,t≥0\mathbf{r}(t) = \mathbf{o} + t\mathbf{d}, \quad t \ge 0r(t)=o+td,t≥0
其中:
- o\mathbf{o}o:射线起点
- d\mathbf{d}d:单位方向向量
- ttt:沿着射线前进的距离
Plücker 射线为什么适合视觉任务?
因为它非常适合表达"某个像素对应空间中的一条线"这种关系。
在多视图几何和新视角合成中,你经常需要回答:
- 这个像素对应空间中的哪条射线?
- 不同图像中的这些射线是否来自同一个 3D 点?
- 目标视角的某条射线应该从输入图像中取哪些信息?
Plücker 表示把这些关系变成了统一的向量形式,方便神经网络处理。
为什么比"只用方向向量"更好?
如果只用方向向量:
d\mathbf{d}d
那么两条平行射线会完全一样。
但在视觉里,平行并不代表同一条射线,因为它们的空间位置不同。
Plücker 表示加入了:
m=o×d\mathbf{m} = \mathbf{o} \times \mathbf{d}m=o×d
这样就能区分"方向一样但位置不同"的线。
m为什么编码了这条直线相对原点的"偏移量"?
为什么它和"离原点多远"有关?
因为叉乘的模长是:
∥m∥=∥p×d∥=∥p∥ ∥d∥sinθ\|\mathbf{m}\| = \|\mathbf{p} \times \mathbf{d}\| = \|\mathbf{p}\| \, \|\mathbf{d}\| \sin\theta∥m∥=∥p×d∥=∥p∥∥d∥sinθ
其中θ\thetaθ是p\mathbf{p}p和d\mathbf{d}d的夹角。
如果 d\mathbf{d}d是单位向量,那么:
∥m∥=∥p∥sinθ\|\mathbf{m}\| = \|\mathbf{p}\| \sin\theta∥m∥=∥p∥sinθ
而∥p∥sinθ\|\mathbf{p}\| \sin\theta∥p∥sinθ正好就是:
原点到这条直线的垂直距离
所以当方向向量归一化时:
∥m∥=原点到直线的距离\boxed{\|\mathbf{m}\| = \text{原点到直线的距离}}∥m∥=原点到直线的距离
这就是它"表示偏了多远"的原因。
m如何表示方向
m\mathbf{m}m 告诉你:
- 这条线在原点的哪一边,通过它和原点构成的平面朝向哪里进行判断
因为m=p×d\mathbf{m}=\mathbf{p}\times\mathbf{d}m=p×d是有方向的,直线在原点的哪一边叉乘指向的方向是不一致。