单张影像外定向的线性方法-Direct Linear Transformation
1.模型
DLT方法基于共线方程,利用图像坐标系下的放射变换进行延展,不需要固定的图像坐标系。也就是说处于一种不固定的状态下。
x
=
L
1
X
+
L
2
Y
+
L
3
Z
+
L
4
L
9
X
+
L
10
+
L
11
Z
+
1
y
=
L
5
X
+
L
6
Y
+
L
7
Z
+
L
8
L
9
X
+
L
10
+
L
11
Z
+
1
x=\frac{L_1X+L_2Y+L_3Z+L_4}{L_9X+L_{10}+L_{11}Z+1}\\ y=\frac{L_5X+L_6Y+L_7Z+L_8}{L_9X+L_{10}+L_{11}Z+1}\\
x=L9X+L10+L11Z+1L1X+L2Y+L3Z+L4y=L9X+L10+L11Z+1L5X+L6Y+L7Z+L8
其中
x
x
x和
y
y
y分别为图像坐标系下的点位坐标;
X
,
Y
,
Z
X,Y,Z
X,Y,Z则是对应点在三维空间坐标系下的坐标。
L
1
−
L
11
L_1-L_{11}
L1−L11是DLT方法的参数,需要被最小二乘法进行确定。利用这11个参数可以确定3个内方位元素(
x
0
x_0
x0,
y
0
y_0
y0,
c
c
c)和6个外方位元素(
X
0
X_0
X0,
Y
0
Y_0
Y0,
Z
0
Z_0
Z0,
ϕ
\phi
ϕ,
ω
\omega
ω,
κ
\kappa
κ)。
将上方公式变形为线性形式,则有:
L
1
X
+
L
2
Y
+
L
3
Z
+
L
4
−
x
L
9
X
−
x
L
10
Y
−
x
L
11
Z
−
x
=
0
L
5
X
+
L
6
Y
+
L
7
Z
+
L
8
−
y
L
9
X
−
y
L
10
Y
−
y
L
11
Z
−
y
=
0
L_1X+L_2Y+L_3Z+L_4-xL_9X-xL_{10}Y-xL_{11}Z-x=0\\ L_5X+L_6Y+L_7Z+L_8-yL_9X-yL_{10}Y-yL_{11}Z-y=0\\
L1X+L2Y+L3Z+L4−xL9X−xL10Y−xL11Z−x=0L5X+L6Y+L7Z+L8−yL9X−yL10Y−yL11Z−y=0
采用最基础的间接平差方式进行计算,平差模型为:
v
=
A
⋅
x
^
−
l
A
=
[
X
1
Y
1
Z
1
1
0
0
0
0
−
x
1
X
1
−
x
1
Y
1
−
x
1
Z
1
0
0
0
0
X
1
Y
1
Z
1
1
−
y
1
X
1
−
y
1
Y
1
−
y
1
Z
1
X
2
Y
2
Z
2
1
0
0
0
0
−
x
2
X
2
−
x
2
Y
2
−
x
2
Z
2
0
0
0
0
X
2
Y
2
Z
2
1
−
y
2
X
2
−
y
2
Y
2
−
y
2
Z
2
⋮
⋮
⋮
⋮
⋮
⋮
⋮
⋮
⋮
]
v=A·\hat x-l \\ A = \left[\begin{matrix}X_1\quad Y_1\quad Z_1\quad 1\quad0\quad0\quad0\quad0\quad -x_1X_1\quad -x_1Y_1 \quad -x_1Z_1 \\ 0\quad0\quad0\quad0\quad X_1\quad Y_1\quad Z_1\quad 1\quad -y_1X_1\quad -y_1Y_1 \quad -y_1Z_1 \\ X_2\quad Y_2\quad Z_2\quad 1\quad0\quad0\quad0\quad0\quad -x_2X_2\quad -x_2Y_2 \quad -x_2Z_2 \\ 0\quad0\quad0\quad0\quad X_2\quad Y_2\quad Z_2\quad 1\quad -y_2X_2\quad -y_2Y_2 \quad -y_2Z_2 \\ \vdots \quad\vdots \quad\vdots \quad\vdots \quad\vdots \quad\vdots \quad\vdots \quad\vdots \quad\vdots \end{matrix}\right]
v=A⋅x^−lA=
X1Y1Z110000−x1X1−x1Y1−x1Z10000X1Y1Z11−y1X1−y1Y1−y1Z1X2Y2Z210000−x2X2−x2Y2−x2Z20000X2Y2Z21−y2X2−y2Y2−y2Z2⋮⋮⋮⋮⋮⋮⋮⋮⋮
此方法最小需要6组同名点。
2.参数 L 1 − L 11 L_1-L_{11} L1−L11与内外方位元素之间的转换关系
令
L
=
−
1
L
9
2
+
L
10
2
+
L
11
2
主点坐标(投影重心在图像上的坐标位置):
x
0
′
=
−
L
2
⋅
(
L
1
⋅
L
9
+
L
2
⋅
L
10
+
L
3
⋅
L
11
)
y
0
′
=
−
L
2
⋅
(
L
5
⋅
L
9
+
L
6
⋅
L
10
+
L
7
⋅
L
11
)
令L=\frac{-1}{\sqrt{L_9^2+L_{10}^2+L_{11}^2}}\\ 主点坐标(投影重心在图像上的坐标位置):\\ x_0^{'} = -L^2·(L_1·L_9+L_2·L_{10}+L_3·L_{11})\\ y_0^{'} = -L^2·(L_5·L_9+L_6·L_{10}+L_7·L_{11})\\
令L=L92+L102+L112−1主点坐标(投影重心在图像上的坐标位置):x0′=−L2⋅(L1⋅L9+L2⋅L10+L3⋅L11)y0′=−L2⋅(L5⋅L9+L6⋅L10+L7⋅L11)
主距:
c
x
=
−
L
2
⋅
(
L
1
2
+
L
2
2
+
L
3
2
)
−
x
0
′
2
c
y
=
−
L
2
⋅
(
L
5
2
+
L
6
2
+
L
7
2
)
−
y
0
′
2
旋转矩阵
R
上各个位置的值:
r
11
=
L
⋅
(
x
0
′
⋅
L
9
−
L
1
)
c
x
r
12
=
L
⋅
(
y
0
′
⋅
L
9
−
L
5
)
c
y
r
13
=
L
⋅
L
9
r
21
=
L
⋅
(
x
0
′
⋅
L
10
−
L
2
)
c
x
r
22
=
L
⋅
(
y
0
′
⋅
L
10
−
L
6
)
c
y
r
23
=
L
⋅
L
10
r
31
=
L
⋅
(
x
0
′
⋅
L
11
−
L
3
)
c
x
r
32
=
L
⋅
(
y
0
′
⋅
L
11
−
L
7
)
c
y
r
33
=
L
⋅
L
11
主距:\\ c_x=-\sqrt{L^2·(L_1^2+L_2^2+L_3^2)-x_0^{'2}}\\ c_y=-\sqrt{L^2·(L_5^2+L_6^2+L_7^2)-y_0^{'2}}\\ 旋转矩阵R上各个位置的值:\\ r_{11}=\frac{L·(x_0^{'}·L_9-L_1)}{c_x} \qquad r_{12}=\frac{L·(y_0^{'}·L_9-L_5)}{c_y} \qquad r_{13}=L·L_9 \qquad \\ r_{21}=\frac{L·(x_0^{'}·L_{10}-L_2)}{c_x} \qquad r_{22}=\frac{L·(y_0^{'}·L_{10}-L_6)}{c_y} \qquad r_{23}=L·L_{10} \qquad \\ r_{31}=\frac{L·(x_0^{'}·L_{11}-L_3)}{c_x} \qquad r_{32}=\frac{L·(y_0^{'}·L_{11}-L_7)}{c_y} \qquad r_{33}=L·L_{11} \qquad
主距:cx=−L2⋅(L12+L22+L32)−x0′2cy=−L2⋅(L52+L62+L72)−y0′2旋转矩阵R上各个位置的值:r11=cxL⋅(x0′⋅L9−L1)r12=cyL⋅(y0′⋅L9−L5)r13=L⋅L9r21=cxL⋅(x0′⋅L10−L2)r22=cyL⋅(y0′⋅L10−L6)r23=L⋅L10r31=cxL⋅(x0′⋅L11−L3)r32=cyL⋅(y0′⋅L11−L7)r33=L⋅L11
在计算R矩阵的过程中,可能会导致R的行列式为负数的情况,必须进行检查,如果为负,则要乘上一个-1,然后还要进行正交标准化。
平移参数的确定
:
[
X
0
Y
0
Z
0
]
=
[
L
1
L
2
L
3
L
4
L
5
L
6
L
7
L
8
L
9
]
−
1
⋅
[
L
4
L
8
1
]
平移参数的确定:\\ \left[\begin{matrix}X_0\\Y_0\\Z_0\end{matrix}\right]= \left[\begin{matrix}L_1\quad L_2\quad L_3\\ L_4\quad L_5\quad L_6\\L_7 \quad L_8 \quad L_9 \end{matrix}\right]^{-1}·\left[\begin{matrix}L_4\\L_8\\1\end{matrix}\right]
平移参数的确定:
X0Y0Z0
=
L1L2L3L4L5L6L7L8L9
−1⋅
L4L81
3.DLT方法的缺点
如果内方位元素未知,则DLT模型将会增加很多参数;
如果参考点位位于一个近似平面上,则最上方共线方程的分母接近于0;
DLT方法无法探测到点位的相坐标和对应地面坐标的测量误差,所以可能得到错误的结果。
需要同名点的点数要大于6,有些苛刻。
4.注意事项
由共线方程到线性方程的过程一定要自己推导一边,将里面的细节弄清楚。
这里面的 x 0 , y 0 , z 0 x_0,y_0,z_0 x0,y0,z0是地物系下,投影中心的坐标,也就是属于外方位元素,并且此种的 d / λ x d/\lambda_x d/λx就是对应书中的 c x ′ c^{'}_x cx′,并且 d d d是焦距。图像上的点 Z Z Z方向坐标都为 − d -d −d, c c c是一个比例,共线方程上,线段之间成比例。
而网站上的一些模型,容易与坐标转换混淆,
这个模型中,
Z
C
Z_C
ZC移到右边放置到
f
f
f的下边,也即
f
Z
C
\frac{f}{Z_C}
ZCf就是共线方程上,两段线段的比例
c
c
c,实际上此中
u
0
,
v
0
u_0,v_0
u0,v0与上面模型种的
u
0
,
v
0
u_0,v_0
u0,v0符号相反,但由于
f
f
f一般取正数,
1
d
x
、
1
d
y
\frac{1}{dx}、\frac{1}{dy}
dx1、dy1对应
1
λ
x
、
1
λ
y
\frac{1}{\lambda_x}、\frac{1}{\lambda_y}
λx1、λy1互为相反数,而相机世界里面的
t
=
[
X
0
,
Y
0
,
Z
0
]
′
t=[X_0,Y_0,Z_0]'
t=[X0,Y0,Z0]′则并非外方位元素,因为它的几何意义是地物系原点在图片坐标系下的坐标,所以只有利用旋转矩阵
R
T
R^T
RT进行处理后
R
T
⋅
t
R^T·t
RT⋅t才是外方位元素中的位移元素,
R
R
R直接对应于从地物系到相片坐标系的旋转矩阵。这个模型在应用的过程中,由于系数矩阵对应于,所以可以直接将坐标矩阵变形成:
[
R
,
t
]
=
[
f
d
x
0
u
0
0
f
d
x
v
0
0
0
1
]
−
1
⋅
[
L
1
L
2
L
3
L
4
L
5
L
6
L
7
L
8
L
9
L
10
L
11
1
]
⋅
L
9
2
+
L
10
2
+
L
11
2
[R,t]=\left[\begin{matrix}\frac{f}{d_x} \quad 0 \quad u_0 \\0 \quad \frac{f}{d_x} \quad v_0 \\ 0 \quad 0\quad 1 \end{matrix}\right]^{-1}·\left[\begin{matrix}L_1 \quad L_2 \quad L_3 \quad L_4 \\ L_5 \quad L_6 \quad L_7 \quad L_8 \\ L_9 \quad L_{10} \quad L_{11} \quad 1 \end{matrix}\right] · \sqrt{L_9^2 + L_{10}^2 + L_{11}^2}
[R,t]=
dxf0u00dxfv0001
−1⋅
L1L2L3L4L5L6L7L8L9L10L111
⋅L92+L102+L112
这里需要注意,这里之所以要成一个根号下,是为了使
L
12
L_{12}
L12位置处为1,
t
t
t获取后要经过
R
T
R^T
RT去旋转,而
f
/
d
x
、
f
/
d
y
f/d_x、f/d_y
f/dx、f/dy的计算可以根据
但由于这个地方的计算方式对应的是第一种模型,所以正负号要做调整,具体过程一定要自行推到,对应出相应的值。
5.编程实现
编程实现了DLT的11参数确定。
编程实现了DLT的16参数确定。
DLT直接线性变换法(Direct Linear Transformation)实现相机外定向和相机标定
6.参考
(3条消息) C++/opencv实现DLT(直接线性变换法)标定相机_々云逸的博客-CSDN博客_opencv相机标定c++