Reference
Plucker Coordinates for Lines in the Space.
Structure-From-Motion Using Lines: Representation, Triangulation and Bundle Adjustment. 本文深度参考这篇论文
多视图几何.
https://zhuanlan.zhihu.com/p/65674067 关于线特征很好的解读.
直线的自由度
3D空间中的直线有4个自由度,通常认为一条线由两个点或者面组成,所以自由度有2x3=6个,但是由于直线绕着自身的方向轴旋转和移动的话,直线还是这个直线,所以真实自由度为6-2=4个。
Plucker坐标系
Plucker坐标系是一种比较重要的表示方法,后面很多的表示方法也能和该方法进行互换
Plucker坐标系使用两个向量表示,
L
:
=
(
l
^
,
m
)
L:=(\hat{l},m)
L : = ( l ^ , m ) ,其中:
l
^
\hat{l}
l ^ 表示直线的方向向量,模长为1;
m
=
l
×
p
m=l\times p
m = l × p ,
p
p
p 为直线上的一点,可以看到这部分也表示线与原点组成平面的法线;
∥
m
∥
∥
l
∥
\frac{\|m\|}{\|l\|}
∥ l ∥ ∥ m ∥ 表示原点到直线的距离;
所以,这个直线的表示形式基本上是方向向量和法向量的表示方法,如下图:
另一点,
m
m
m 表示了原点到直线的距离,公式推导如下:
p
⊥
=
p
−
(
l
^
⋅
p
)
l
^
=
(
l
^
⋅
l
^
)
p
−
(
l
^
⋅
p
)
l
^
=
l
^
×
(
p
×
l
^
)
=
l
^
×
m
(1)
\begin{aligned} \boldsymbol{p}_{\perp} &=\boldsymbol{p}-(\hat{\boldsymbol{l}} \cdot \boldsymbol{p}) \hat{\boldsymbol{l}} \\ &=(\hat{\boldsymbol{l}} \cdot \hat{\boldsymbol{l}}) \boldsymbol{p}-(\hat{\boldsymbol{l}} \cdot \boldsymbol{p}) \hat{l} \\ &=\hat{\boldsymbol{l}} \times(\boldsymbol{p} \times \hat{\boldsymbol{l}}) \\ &=\hat{\boldsymbol{l}} \times \boldsymbol{m} \end{aligned} \tag{1}
p ⊥ = p − ( l ^ ⋅ p ) l ^ = ( l ^ ⋅ l ^ ) p − ( l ^ ⋅ p ) l ^ = l ^ × ( p × l ^ ) = l ^ × m ( 1 )
l
^
⋅
p
\hat{l}\cdot p
l ^ ⋅ p 表示把
p
p
p 向量映射到直线方向上的长度,也就是上图看到的
p
⊥
−
p
p_{\perp}-p
p ⊥ − p 的长度;所以
p
⊥
\boldsymbol{p}_{\perp}
p ⊥ 的模长就是远点到直线的最短距离,因为
l
^
\hat{l}
l ^ 与
m
m
m 垂直,因此:
∣
∣
p
⊥
∣
∣
=
∣
∣
l
^
∣
∣
⋅
∣
∣
m
∣
∣
s
i
n
(
90
)
=
∣
∣
m
∣
∣
(2)
||p_{\perp}||=||\hat{l}|| \cdot ||m||sin(90)=||m|| \tag{2}
∣ ∣ p ⊥ ∣ ∣ = ∣ ∣ l ^ ∣ ∣ ⋅ ∣ ∣ m ∣ ∣ s i n ( 9 0 ) = ∣ ∣ m ∣ ∣ ( 2 )
两种特殊的情况
自然而然的想到,如果直线过原点怎么表示?如果直线是无穷远点怎么表示?
过原点的直线
因为直线过原点,那么就把p设为原点,则
m
=
0
→
×
l
=
0
→
m=\overrightarrow{0}\times l=\overrightarrow{0}
m = 0
× l = 0
,跟它的实际意义也相符;
过无穷远点的直线
直线过无穷点时,那么就把p设为无穷远点,有
p
=
t
p
‾
p=t\overline{p}
p = t p ,则坐标可以写作:
L
:
=
(
l
,
t
p
‾
×
l
)
:
=
(
l
t
,
p
‾
×
l
)
=
(
0
,
m
)
(3)
L:=(l, t\overline{p}\times l):=(\frac{l}{t}, \overline{p}\times l)=(0, m) \tag{3}
L : = ( l , t p × l ) : = ( t l , p × l ) = ( 0 , m ) ( 3 )
在空间中的表示方法
使用两个点进行表示
给定两个3D空间中的点,有:
M
T
=
(
M
‾
,
m
)
T
,
N
T
=
(
N
‾
,
n
)
T
M^T=(\overline{M}, m)^T, N^T=(\overline{N}, n)^T
M T = ( M , m ) T , N T = ( N , n ) T ,其中
m
,
n
m,n
m , n 一方面使得直线变为其次坐标的表示,另一方面表示该点的逆深度,所以根据上面的Plucker坐标的表示,有:
L
=
(
l
‾
m
)
=
(
M
‾
m
−
N
‾
n
M
‾
×
N
‾
)
=
(
n
M
‾
−
m
N
‾
M
‾
×
N
‾
)
=
(
a
b
)
(4)
L=\left(\begin{array}{c}\overline{l} \\ m\end{array}\right)=\left(\begin{array}{c} \frac{\overline{M}}{m}-\frac{\overline{N}}{n} \\ \overline{M}\times \overline{N} \end{array} \right) = \left(\begin{array}{c} n\overline{M}-m\overline{N} \\ \overline{M}\times \overline{N} \end{array} \right) = \left(\begin{array}{c} a \\ b \end{array} \right) \tag{4}
L = ( l m ) = ( m M − n N M × N ) = ( n M − m N M × N ) = ( a b ) ( 4 ) 这里简单分析一下自由度,由上可知,Plucker的表示下一条直线有6个参数表示,是5维齐次坐标系下的齐次表示,同时,因为Plucker坐标中的
a
,
b
a, b
a , b 分别表示线的方向以及线和原点组成的法向量,因此有约束
a
T
b
=
0
a^Tb=0
a T b = 0 的约束,所以最终Plucker表示下的直线就有4个自由度,和空间直线的自由度一致。
使用两个平面的交表示
这部分属于空间中点和线的对偶形式,给定3D空间中的两个平面,有:
M
T
=
(
M
‾
,
m
)
T
,
N
T
=
(
N
‾
,
n
)
T
M^T=(\overline{M}, m)^T, N^T=(\overline{N}, n)^T
M T = ( M , m ) T , N T = ( N , n ) T ,这里
m
,
n
m, n
m , n 就不表示逆深度了,而是表示截距,同样按照Plucker坐标的表示,有:
L
=
(
l
‾
m
)
=
(
M
‾
×
N
‾
M
‾
m
−
N
‾
n
)
=
(
M
‾
×
N
‾
n
M
‾
−
m
N
‾
)
=
(
a
b
)
(5)
L=\left(\begin{array}{c}\overline{l} \\ m \end{array}\right)=\left(\begin{array}{c} \overline{M}\times \overline{N} \\ \frac{\overline{M}}{m}-\frac{\overline{N}}{n} \end{array} \right) = \left(\begin{array}{c} \overline{M}\times \overline{N} \\ n\overline{M}-m\overline{N} \end{array} \right) = \left(\begin{array}{c} a \\ b \end{array} \right) \tag{5}
L = ( l m ) = ( M × N m M − n N ) = ( M × N n M − m N ) = ( a b ) ( 5 )
简单的说一下上个公式中的b是怎么得来的,假设点
X
X
X 在直线上,则有:
{
M
‾
X
+
m
=
0
N
‾
X
+
n
=
0
→
(
n
M
‾
−
m
N
‾
)
X
=
0
\begin{aligned} \begin{cases} \overline{M}X+m=0 \\ \overline{N}X+n=0 \end{cases} \rightarrow (n\overline{M}-m\overline{N})X=0 \end{aligned}
{ M X + m = 0 N X + n = 0 → ( n M − m N ) X = 0 所以可以看到
b
=
(
n
M
‾
−
m
N
‾
)
b=(n\overline{M}-m\overline{N})
b = ( n M − m N ) 垂直于直线上一点,同时
b
b
b 也垂直于直线的方向向量
(
M
‾
×
N
‾
)
(\overline{M}\times \overline{N})
( M × N ) ,因此
b
b
b 就是直线与原点构成平面的法向量。
投影模型
对于投影矩阵
P
=
[
P
‾
,
p
]
3
×
4
P=[\overline{P}, p]_{3\times4}
P = [ P , p ] 3 × 4 ,那么经过投影之后的点而言,有:
l
i
m
a
g
e
=
m
i
m
a
g
e
×
n
i
m
a
g
e
=
(
P
M
w
)
×
(
P
N
w
)
=
(
P
‾
M
‾
+
p
m
)
×
(
P
‾
N
‾
+
p
n
)
=
P
‾
M
‾
×
P
‾
N
‾
+
p
m
×
P
‾
N
‾
+
P
‾
M
‾
×
p
n
+
p
m
×
p
n
=
d
e
t
(
P
‾
)
P
‾
−
T
(
M
‾
×
N
‾
)
+
[
p
]
×
P
‾
(
m
N
‾
−
n
M
‾
)
=
[
d
e
t
(
P
‾
)
P
‾
−
T
,
[
p
]
×
P
‾
]
[
M
‾
×
N
‾
m
N
‾
−
n
M
‾
]
=
P
~
3
×
6
L
6
×
1
(6)
\begin{aligned} l_{image}&=m_{image}\times n_{image} \\ &=(PM^w) \times (PN^w) \\ &=(\overline{P}\overline{M}+pm) \times (\overline{P}\overline{N}+pn) \\ &=\overline{P}\overline{M} \times \overline{P}\overline{N}+pm \times \overline{P}\overline{N}+\overline{P}\overline{M} \times pn+ pm \times pn \\ &=det(\overline{P})\overline{P}^{-T}(\overline{M} \times \overline{N})+[p]_{\times}\overline{P}(m\overline{N}-n\overline{M}) \\ &=[det(\overline{P})\overline{P}^{-T}, [p]_{\times}\overline{P}] \begin{bmatrix} \overline{M} \times \overline{N} \\ m\overline{N}-n\overline{M} \end{bmatrix} \\ &=\tilde{P}_{3\times 6}\mathbf{L}_{6\times1} \end{aligned} \tag{6}
l i m a g e = m i m a g e × n i m a g e = ( P M w ) × ( P N w ) = ( P M + p m ) × ( P N + p n ) = P M × P N + p m × P N + P M × p n + p m × p n = d e t ( P ) P − T ( M × N ) + [ p ] × P ( m N − n M ) = [ d e t ( P ) P − T , [ p ] × P ] [ M × N m N − n M ] = P ~ 3 × 6 L 6 × 1 ( 6 ) 对于由两个面相交而得到的直线表示来说,把直线表示替换掉为面表示就可以了(对偶赛高)。
根据上面的推导很容易扩展出世界坐标系到相机坐标系的转移矩阵有:
[
n
c
b
c
]
=
[
R
c
w
[
t
c
w
]
×
R
c
w
0
R
c
w
]
[
n
w
b
w
]
=
[
R
w
c
T
[
−
R
w
c
T
t
w
c
]
×
R
w
c
T
0
R
w
c
T
]
[
n
w
b
w
]
=
[
R
w
c
T
R
w
c
T
[
t
w
c
]
×
0
R
w
c
T
]
[
n
w
b
w
]
(7)
\left[\begin{array}{c} \mathbf{n}_{c} \\ \mathbf{b}_{c} \end{array}\right]= \left[\begin{array}{cc} \mathrm{R}_{cw} & {\left[\mathbf{t}_{cw}\right]_{\times} \mathrm{R}_{cw}} \\ \mathbf{0} & \mathrm{R}_{cw} \end{array}\right]\left[\begin{array}{c} \mathbf{n}_{w} \\ \mathbf{b}_{w} \end{array}\right]= \left[\begin{array}{cc} \mathrm{R}_{wc}^{T} & {\left[-\mathrm{R}_{wc}^{T}\mathbf{t}_{wc}\right]_{\times} \mathrm{R}_{wc}^T} \\ \mathbf{0} & \mathrm{R}_{wc}^T \end{array}\right]\left[\begin{array}{c} \mathbf{n}_{w} \\ \mathbf{b}_{w} \end{array}\right]= \left[\begin{array}{cc} \mathrm{R}_{wc}^{T} & {\mathrm{R}_{wc}^{T}\left[\mathbf{t}_{wc}\right]_{\times} } \\ \mathbf{0} & \mathrm{R}_{wc}^T \end{array}\right]\left[\begin{array}{c} \mathbf{n}_{w} \\ \mathbf{b}_{w} \end{array}\right] \tag{7}
[ n c b c ] = [ R c w 0 [ t c w ] × R c w R c w ] [ n w b w ] = [ R w c T 0 [ − R w c T t w c ] × R w c T R w c T ] [ n w b w ] = [ R w c T 0 R w c T [ t w c ] × R w c T ] [ n w b w ] ( 7 ) 简单说一下上述公式:第一行由公式(6)得到,把其中的
P
P
P 用
R
,
t
R,t
R , t 替换就可以了;第二行也很好理解,就是简单的把直线的方向进行了旋转。后面之所以把整个公式变换为camera->world主要是因为这是位姿的表示方法。其中的一步推导用到了一个性质,该性质在李群中比较常见,即:当
M
∈
S
O
(
3
)
M\in\mathbf{SO(3)}
M ∈ S O ( 3 ) 时,有
[
M
u
]
×
=
M
[
u
]
×
M
T
[Mu]_{\times}=M[u]_{\times}M^T
[ M u ] × = M [ u ] × M T 。
三角化
这里主要涉及两个方法:第一个方法是解耦的方法,即先获取表达式的初值,再对初值进行正交补偿;第二个方法是耦合的来解,即使用迭代的方法得到一个即满足优化函数,又能满足正交要求的解 。下面简单的说明一下这两个方法。
获取直线表示的初值
这部分比较简单,优化的目标函数就是投影误差。假设直线
L
\mathbf{L}
L 被相机
P
i
,
i
=
1...
n
P_i,i=1...n
P i , i = 1 . . . n 观测到,那么对于每一次的观测,可以定义误差:
E
=
(
x
i
⊤
P
~
i
L
)
2
+
(
y
i
⊤
P
~
i
L
)
2
(8)
E=\left(\mathbf{x}^{i \top} \widetilde{\mathbf{P}}^{i} \mathbf{L}\right)^{2}+\left(\mathbf{y}^{i^{\top}} \widetilde{\mathbf{P}}^{i} \mathbf{L}\right)^{2} \tag{8}
E = ( x i ⊤ P
i L ) 2 + ( y i ⊤ P
i L ) 2 ( 8 ) 可以看到基本上就是在第 i 帧上的图像上的两个对应点到投影直线的距离。所以所有的观测都考虑之后有:
B
(
L
,
M
)
=
∑
i
=
1
n
(
(
x
i
⊤
P
~
i
L
(
l
1
)
2
+
(
l
2
)
2
)
2
+
(
y
i
⊤
P
~
i
L
(
l
1
)
2
+
(
l
2
)
2
)
2
)
=
∥
A
(
2
n
×
6
)
L
∥
2
with
A
=
(
⋯
x
i
⊤
P
~
i
y
i
⊤
P
~
i
…
)
(9)
\begin{aligned} \mathcal{B}(\mathbf{L}, \mathcal{M}) &=\sum_{i=1}^{n}\left(\left(\frac{\mathbf{x}^{i \top} \widetilde{\mathbf{P}}^{i} \mathbf{L}}{\sqrt{(l_1)^2+(l_2)^2}}\right)^{2}+\left(\frac{\mathbf{y}^{i^{\top}} \widetilde{\mathbf{P}}^{i} \mathbf{L}}{\sqrt{(l_1)^2+(l_2)^2}}\right)^{2}\right) \\ &=\left\|A_{(2 n \times 6)} \mathbf{L}\right\|^{2} \quad \text { with } \quad \mathrm{A}=\left(\begin{array}{c} \cdots \\ \mathbf{x}^{i^{\top}} \widetilde{\mathbf{P}}^{i} \\ \mathbf{y}^{i^{\top}} \widetilde{\mathbf{P}}^{i} \\ \ldots \end{array}\right) \end{aligned} \tag{9}
B ( L , M ) = i = 1 ∑ n ⎝ ⎛ ( ( l 1 ) 2 + ( l 2 ) 2
x i ⊤ P
i L ) 2 + ( ( l 1 ) 2 + ( l 2 ) 2
y i ⊤ P
i L ) 2 ⎠ ⎞ = ∥ ∥ A ( 2 n × 6 ) L ∥ ∥ 2 with A = ⎝ ⎜ ⎜ ⎛ ⋯ x i ⊤ P
i y i ⊤ P
i … ⎠ ⎟ ⎟ ⎞ ( 9 ) 其中:
设
l
3
×
1
=
P
~
i
L
l_{3\times 1}=\widetilde{\mathbf{P}}^{i} \mathbf{L}
l 3 × 1 = P
i L ,那么
l
1
=
l
(
1
)
,
l
2
=
l
(
2
)
l_1=l(1), l_2=l(2)
l 1 = l ( 1 ) , l 2 = l ( 2 ) ;
该方程有很多的解法,这里就不赘述了。需要注意的是这个部分只是求解了方程,并没有考虑Plucker约束,即
a
T
b
=
0
\mathbf{a}^T\mathbf{b}=0
a T b = 0 。
对Plucker约束进行补偿
这部分可以着重参考论文【2】,基本思路是把这个问题当做纯数学问题进行求解,获取与初值最接近且正交的向量,但是这个解就不一定满足公式(9)的最优解了。
类线性算法(Quasi-linear algorithm)
这个算法主要是使用迭代的思路使得解既能满足公式(9)的优化函数,又能满足Plucker正交关系的解,主要的思路如下:
先按照公式(9)求得一个初始
L
0
L_0
L 0 ;
构建一个迭代公式:
C
k
(
L
k
+
1
)
=
L
k
T
[
0
I
3
×
3
I
3
×
3
0
]
⏟
G
L
k
+
1
=
b
k
T
a
k
+
1
+
a
k
T
b
k
+
1
=
0
C_k(L_{k+1})=L_k^T\underbrace{\begin{bmatrix}0 & I_{3\times3} \\ I_{3\times3} & 0\end{bmatrix}}_{G}L_{k+1}=b_k^Ta_{k+1}+a^T_kb_{k+1}=0
C k ( L k + 1 ) = L k T G
[ 0 I 3 × 3 I 3 × 3 0 ] L k + 1 = b k T a k + 1 + a k T b k + 1 = 0 可以看到这个思路主要想使得迭代前后两次的方向向量和法向量是正交的 ;
为了求解上述公式,显然可以得到最优的
L
k
+
1
L_{k+1}
L k + 1 是在
L
k
T
G
L_{k}^TG
L k T k T G
[ 0 I 3 × 3 I 3 × 3 0 ] L k + 1 = b k T a k + 1 + a k T b k + 1 = 0 可以看到这个思路主要想使得迭代前后两次的方向向量和法向量是正交的 ;
为了求解上述公式,显然可以得到最优的
L
k
+
1
L_{k+1}
L k + 1 是在
L
k
T
G
L_{k}^TG
L k T G 的零空间中,所以对
L
k
T
G
L_{k}^TG