概念
直接线性变换(DLT)是建立图像点坐标和相应物点物方空间坐标之间直接的线性关系的算法。
功能
已知一组3D空间点坐标信息和其在图像中的投影坐标信息,计算图像相对的位姿变换信息。如果把3D点的空间坐标信息转换为另一个相机坐标下即可求解的来个相机坐标之间的位姿变换信息。
步骤
已知相机2坐标系下的一组3D点坐标为
P
c
2
=
(
x
c
2
,
y
c
2
,
z
c
2
)
P_{c2}=(x_{c2},y_{c2},z_{c2})
P
c
2
=
(
x
c
2
,
y
c
2
,
z
c
2
)
,该点在相机1的投影坐标为
(
u
c
1
,
v
c
1
)
(u_{c1},v_{c1})
(
u
c
1
,
v
c
1
)
,相机1对应的内参矩阵为
K
K
K
,根据上述信息有
(
u
c
1
v
c
1
1
)
=
K
(
R
12
(
x
c
2
y
c
2
z
c
2
)
+
t
12
)
⟹
(
x
c
1
y
c
1
z
c
1
)
=
[
R
12
∣
t
12
]
(
x
c
2
y
c
2
z
c
2
1
)
⟹
s
(
u
c
1
v
c
1
1
)
=
[
t
1
t
2
t
3
t
4
t
5
t
6
t
7
t
8
t
9
t
10
t
11
t
12
]
(
x
c
2
y
c
2
z
c
2
1
)
\begin{pmatrix} u_{c1} \\ v_{c1}\\ 1 \end{pmatrix}=K(R_{12}\begin{pmatrix} x_{c2} \\ y_{c2}\\ z_{c2} \end{pmatrix}+t_{12})\\ \implies\begin{pmatrix} x_{c1} \\ y_{c1}\\ z_{c1} \end{pmatrix}=[R_{12}|t_{12}]\begin{pmatrix} x_{c2} \\ y_{c2}\\ z_{c2}\\ 1 \end{pmatrix}\\\implies s\begin{pmatrix} u_{c1} \\ v_{c1}\\ 1 \end{pmatrix}=\begin{bmatrix}t_1&t_2&t_3&t_4\\t_5&t_6&t_7&t_8\\t_9&t_{10}&t_{11}&t_{12}\\\end{bmatrix}\begin{pmatrix} x_{c2} \\ y_{c2}\\ z_{c2}\\ 1 \end{pmatrix}
⎝
⎛
u
c
1
v
c
1
1
⎠
⎞
=
K
(
R
1
2
⎝
⎛
x
c
2
y
c
2
z
c
2
⎠
⎞
+
t
1
2
)
⟹
⎝
⎛
x
c
1
y
c
1
z
c
1
⎠
⎞
=
[
R
1
2
∣
t
1
2
]
⎝
⎜
⎜
⎛
x
c
2
y
c
2
z
c
2
1
⎠
⎟
⎟
⎞
⟹
s
⎝
⎛
u
c
1
v
c
1
1
⎠
⎞
=
⎣
⎡
t
1
t
5
t
9
t
2
t
6
t
1
0
t
3
t
7
t
1
1
t
4
t
8
t
1
2
⎦
⎤
⎝
⎜
⎜
⎛
x
c
2
y
c
2
z
c
2
1
⎠
⎟
⎟
⎞
上述矩阵方程可以写成来个线性方程的形式
u
c
1
=
t
1
x
c
2
+
t
2
y
c
2
+
t
3
z
c
2
+
t
4
t
9
x
c
2
+
t
10
y
c
2
+
t
11
z
c
2
+
t
12
v
c
1
=
t
5
x
c
2
+
t
6
y
c
2
+
t
7
z
c
2
+
t
8
t
9
x
c
2
+
t
10
y
c
2
+
t
11
z
c
2
+
t
12
u_{c1}=\frac{t_1x_{c2}+t_2y_{c2}+t_3z_{c2}+t_4}{t_9x_{c2}+t_{10}y_{c2}+t_{11}z_{c2}+t_{12}}\\v_{c1}=\frac{t_5x_{c2}+t_6y_{c2}+t_7z_{c2}+t_8}{t_9x_{c2}+t_{10}y_{c2}+t_{11}z_{c2}+t_{12}}
u
c
1
=
t
9
x
c
2
+
t
1
0
y
c
2
+
t
1
1
z
c
2
+
t
1
2
t
1
x
c
2
+
t
2
y
c
2
+
t
3
z
c
2
+
t
4
v
c
1
=
t
9
x
c
2
+
t
1
0
y
c
2
+
t
1
1
z
c
2
+
t
1
2
t
5
x
c
2
+
t
6
y
c
2
+
t
7
z
c
2
+
t
8
我们的目的就是求解
t
1
⋯
t
12
t_1\cdots t_{12}
t
1
⋯
t
1
2
,通过多组匹配的2D-3D点可以构建线性方程组
(
x
c
2
1
y
c
2
1
z
c
2
1
1
0
0
0
0
−
u
1
x
c
2
1
−
u
1
y
c
2
1
−
u
1
z
c
2
1
1
0
0
0
0
x
c
2
1
y
c
2
1
z
c
2
1
1
−
v
1
x
c
2
1
−
v
1
y
c
2
1
−
v
1
z
c
2
1
1
⋮
⋮
⋮
⋮
⋮
⋮
⋮
⋮
⋮
⋮
⋮
⋮
x
c
2
n
y
c
2
n
z
c
2
n
1
0
0
0
0
−
u
n
x
c
2
n
−
u
n
y
c
2
n
−
u
n
z
c
2
n
1
0
0
0
0
x
c
2
n
y
c
2
n
z
c
2
n
1
−
v
n
x
c
2
n
−
v
n
y
c
2
n
−
v
n
z
c
2
n
1
)
(
t
1
t
2
t
3
t
4
t
5
t
6
t
7
t
8
t
9
t
10
t
11
t
12
)
=
0
\begin{pmatrix} x^1_{c2}&y^1_{c2}&z^1_{c2}&1&0&0&0&0&-u_1x^1_{c2}&-u_1y^1_{c2}&-u_1z^1_{c2}&1\\ 0&0&0&0&x^1_{c2}&y^1_{c2}&z^1_{c2}&1&-v_1x^1_{c2}&-v_1y^1_{c2}&-v_1z^1_{c2}&1\\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots\\ x^n_{c2}&y^n_{c2}&z^n_{c2}&1&0&0&0&0&-u_nx^n_{c2}&-u_ny^n_{c2}&-u_nz^n_{c2}&1\\ 0&0&0&0&x^n_{c2}&y^n_{c2}&z^n_{c2}&1&-v_nx^n_{c2}&-v_ny^n_{c2}&-v_nz^n_{c2}&1\\ \end{pmatrix} \begin{pmatrix}t_1\\t_2\\t_3\\t_4\\t_5\\t_6\\t_7\\t_8\\t_9\\t_{10}\\t_{11}\\t_{12}\end{pmatrix}=0
⎝
⎜
⎜
⎜
⎜
⎜
⎛
x
c
2
1
0
⋮
x
c
2
n
0
y
c
2
1
0
⋮
y
c
2
n
0
z
c
2
1
0
⋮
z
c
2
n
0
1
0
⋮
1
0
0
x
c
2
1
⋮
0
x
c
2
n
0
y
c
2
1
⋮
0
y
c
2
n
0
z
c
2
1
⋮
0
z
c
2
n
0
1
⋮
0
1
−
u
1
x
c
2
1
−
v
1
x
c
2
1
⋮
−
u
n
x
c
2
n
−
v
n
x
c
2
n
−
u
1
y
c
2
1
−
v
1
y
c
2
1
⋮
−
u
n
y
c
2
n
−
v
n
y
c
2
n
−
u
1
z
c
2
1
−
v
1
z
c
2
1
⋮
−
u
n
z
c
2
n
−
v
n
z
c
2
n
1
1
⋮
1
1
⎠
⎟
⎟
⎟
⎟
⎟
⎞
⎝
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎜
⎛
t
1
t
2
t
3
t
4
t
5
t
6
t
7
t
8
t
9
t
1
0
t
1
1
t
1
2
⎠
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎟
⎞
=
0
如果一共有6对匹配的2D-3D点我们可以通过线性求解的形式获得
t
1
⋯
t
12
t_1\cdots t_{12}
t
1
⋯
t
1
2
,如果大于6对点我们可以通过SVD分解求最小二乘解获得
t
1
⋯
t
12
t_1\cdots t_{12}
t
1
⋯
t
1
2
。其中
R
=
[
t
1
t
2
t
3
t
5
t
6
t
7
t
9
t
10
t
11
]
t
=
[
t
4
t
8
t
12
]
R=\begin{bmatrix}t_1&t_2&t_3\\t_5&t_6&t_7\\t_9&t_{10}&t_{11}\\\end{bmatrix}\\t=\begin{bmatrix}t_4\\t_8\\t_{12}\end{bmatrix}
R
=
⎣
⎡
t
1
t
5
t
9
t
2
t
6
t
1
0
t
3
t
7
t
1
1
⎦
⎤
t
=
⎣
⎡
t
4
t
8
t
1
2
⎦
⎤
由于在整个求解的过程中没有考虑到旋转矩阵的单位正交性,可以将上述求的旋转矩阵进行
Q
R
QR
Q
R
分解求得或者
R
=
(
R
R
T
)
−
1
2
R
R=(RR^T)^{-\frac1 2 }R
R
=
(
R
R
T
)
−
2
1
R
链接
[PnP问题之DLT解法](https://zhuanlan.z hihu.com/p/58648937)
补充