直接线性变换(DLT)算法
首先讨论由给定
2
D
2D
2D到
2
D
2D
2D的四组点对应
x
i
↔
x
i
′
x_{i}\leftrightarrow x'_i
xi↔xi′确定
H
H
H的一种简单的线性算法。变换由方程
x
i
′
=
H
x
i
x'_i = Hx_i
xi′=Hxi 给出。但因为这是一个齐次矢量方程; 因此 3 维矢量
x
i
′
x'_i
xi′和
H
x
i
Hx_i
Hxi不相等。可以用矢量叉乘:
x
i
′
×
H
x
i
=
0
x'_i\times Hx_i=0
xi′×Hxi=0表示。
如果将矩阵
H
H
H的第
j
j
j行记为
h
j
T
h^{jT}
hjT,
x
i
′
=
(
x
i
′
,
y
i
′
,
w
i
′
)
T
\boldsymbol{x'_i}=(x'_i,y'_i,w'_i)^T
xi′=(xi′,yi′,wi′)T,则
x
i
′
×
H
x
i
=
0
x'_i\times Hx_i=0
xi′×Hxi=0可以转换成:
[
0
T
−
w
i
′
x
i
T
y
i
′
x
i
T
w
i
′
x
i
T
0
T
−
x
i
′
x
i
T
−
y
i
′
x
i
T
x
i
′
x
i
T
0
T
]
(
h
1
h
2
h
3
)
=
0
\begin{bmatrix} \boldsymbol{0^{T}}&-w_{i}^{'}\boldsymbol{x_{i}^{T}} &y_{i}^{'}\boldsymbol{x_{i}^{T}} \\ w_{i}^{'}\boldsymbol{x_{i}^{T}}&\boldsymbol{0^{T}}& - x_{i}^{'}\boldsymbol{x_{i}^{T}}\\ -y_{i}^{'}\boldsymbol{x_{i}^{T}} & x_{i}^{'}\boldsymbol{x_{i}^{T}} & \boldsymbol{0^{T}} \end{bmatrix}\begin{pmatrix} \boldsymbol{h^{1}}\\ \boldsymbol{h^{2}}\\ \boldsymbol{h^{3}} \end{pmatrix}=\boldsymbol{0}
⎣⎡0Twi′xiT−yi′xiT−wi′xiT0Txi′xiTyi′xiT−xi′xiT0T⎦⎤⎝⎛h1h2h3⎠⎞=0
h
h
h是由矩阵
H
H
H的元素组成的 9 维矢量:
h
=
(
h
1
h
2
h
3
)
,
H
=
[
h
1
h
2
h
3
h
4
h
5
h
6
h
7
h
8
h
9
]
\boldsymbol{h}=\begin{pmatrix} \boldsymbol{h^{1}}\\ \boldsymbol{h^{2}}\\ \boldsymbol{h^{3}} \end{pmatrix},H=\begin{bmatrix} h_{1} & h_{2} &h_{3} \\ h_{4} & h_{5} & h_{6}\\ h_{7}&h_{8} & h_{9} \end{bmatrix}
h=⎝⎛h1h2h3⎠⎞,H=⎣⎡h1h4h7h2h5h8h3h6h9⎦⎤
- A i h = 0 A_i\boldsymbol{h} =\boldsymbol{0} Aih=0是未知矢量 h \boldsymbol{h} h 的线性方程.。矩阵 A i A_i Ai的元素是已知点的坐标的二次多项式。
- 虽然式中有三个方程,但仅有两个是线性独立的。在解 H H H时常省去第三个等式。
- 该方程组对 x i ′ \boldsymbol{x'_i} xi′的任何齐次坐标 ( x i ′ , y i ′ , w i ′ ) T ( x'_i,y'_i, w'_i )^ T (xi′,yi′,wi′)T成立。
求解 H H H
每组点对应给出关于 H H H元素的两个独立的方程。给定四组这样的点对应,便获得方程组 A h = 0 A\boldsymbol{h} =\boldsymbol{0} Ah=0。
超定解
如果给出的点对应 x i ↔ x i ′ x_{i}\leftrightarrow x'_i xi↔xi′多于四组,方程组 A h = 0 A\boldsymbol{h} =\boldsymbol{0} Ah=0是超定的。如果点的位置是精确的,那么 A A A的秩仍然为 8 并有一维零空间,并且存在精确解 h \boldsymbol{h} h。如果图像坐标的测量是不精确的,方程组将不存在精确解。我们需要求一个适当的代价函数取最小值的矢量 h \boldsymbol{h} h。通常附加范数条件,既然不存在 A h = 0 A\boldsymbol{h} =\boldsymbol{0} Ah=0的精确解,很自然会在通常约束 ∥ h ∥ = 1 \left \| \boldsymbol{h} \right \|=1 ∥h∥=1下最小化范数 ∥ A h ∥ \left \| A\boldsymbol{h} \right \| ∥Ah∥。这等价于求商 ∥ A h ∥ / ∥ h ∥ \left \| A\boldsymbol{h} \right \|/\left \| \boldsymbol{h} \right \| ∥Ah∥/∥h∥的最小值问题。该解是 A T A A^TA ATA的最小特征值的(单位)特征矢量。由此所得到的算法称为基本 DLT 算法。
非齐次解
另 一种方法是把等式转成非齐次线性方程组,即给矢量
h
\boldsymbol{h}
h中的某个元素强加上
h
i
=
1
h_i=1
hi=1的条件。
[
0
0
0
−
x
i
w
i
′
−
y
i
w
i
′
−
w
i
w
i
′
x
i
y
i
′
y
i
y
i
′
x
i
w
i
′
y
i
w
i
′
w
i
w
i
′
0
0
0
−
x
i
x
i
′
−
y
i
x
i
′
]
h
~
=
[
−
w
i
y
i
′
−
w
i
x
i
′
]
\begin{bmatrix} 0 & 0 & 0& -x_iw'_i & -y_iw'_i & -w_iw'_i &x_iy'_i & y_iy'_i\\ x_iw'_i& y_iw'_i&w_iw'_i & 0 & 0 & 0 &-x_ix'_i &-y_ix'_i \end{bmatrix}\tilde{\boldsymbol{h}}=\begin{bmatrix} -w_iy'_i\\ -w_ix'_i \end{bmatrix}
[0xiwi′0yiwi′0wiwi′−xiwi′0−yiwi′0−wiwi′0xiyi′−xixi′yiyi′−yixi′]h~=[−wiyi′−wixi′]
其中 h ~ \tilde{\boldsymbol{h}} h~是由 h \boldsymbol{h} h的前 8 个元素组成的 8 维矢量。
但是,如果事实上真正的解是 h i = 0 h_i = 0 hi=0,那么不存在一个因子 k k k使 k h i = 1 kh_i = 1 khi=1.。这意味着令 h i = 1 h_i = 1 hi=1得不到真解。
退化配置
出现某种配置不能确定唯一解的情形称为退化。注意退化的定义既涉及配置也涉及变换类型。而且退化问题不仅限于最小配置解。如果多出来的( 精确的,即无误差的)点对应也共线,那么退化问题仍没有解决。
由线和其他,实体求解
到目前为止以及本文的其余部分,都只讨论由点对应采计算单应。然而线对应和二次曲线的对应也可以来计算单应。于是就产生计算一个单应(或任何其他关系)需要多少组对应的问题。一般的原则是约束数必须等于或大于变换的自由度数。
但采用混合类型的对应来计算
H
H
H时必须谨慎。例如一个
2
D
2D
2D单应不能由两组点对应和两组线对应唯一确定,但能由三级点和一组线或一组点和三组线来唯一确定,即使每种配置都有 8 个自由度也是如此。