- 操作系统:ubuntu22.04
- OpenCV版本:OpenCV4.9
- IDE:Visual Studio Code
- 编程语言:C++11
算法描述
本节中的函数使用所谓的针孔相机模型。通过使用透视变换将场景中的3D点 P w P_w Pw 投影到图像平面上,从而获得场景的视图,形成相应的像素点 p p p 和 P w P_w Pw均用齐次坐标表示,即分别为3D和2D齐次向量。在本节引言的末尾,您将找到关于射影几何、齐次向量和齐次变换的简要介绍。为了更加简洁的符号表示,我们通常省略“齐次”一词,而直接说向量而不是齐次向量。
由针孔相机模型给出的无畸变的射影变换如下所示。
s
p
=
A
[
R
∣
t
]
P
w
,
s \; p = A \begin{bmatrix} R|t \end{bmatrix} P_w,
sp=A[R∣t]Pw,
其中
P
w
P_w
Pw是相对于世界坐标系表示的3D点,p 是图像平面上的2D像素,A 是相机内参矩阵,R 和t 是描述从世界坐标系到相机坐标系(或相机框架)的坐标变化的旋转和平移,s 是射影变换的任意缩放因子,并不是相机模型的一部分。相机内参矩阵A(使用的符号如[314]中所述,也通常记作K)将给定在相机坐标系中的3D点投影到2D像素坐标,即:
p
=
A
P
c
.
p = A P_c.
p=APc.
相机内参矩阵 A 由以像素单位表示的焦距
f
x
f_x
fx和
f
y
f_y
fy以及主点
(
c
x
,
c
y
)
(c_x, c_y)
(cx,cy)组成,主点通常接近图像中心:
A
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
A = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}
A=
fx000fy0cxcy1
因此
[
u
v
1
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
c
Y
c
Z
c
]
\begin{bmatrix}{u}\\{v}\\{1}\end{bmatrix}=\begin{bmatrix}{f_x}&{0}&{c_x}\\ {0}&{f_y}&{c_y}\\ {0}&{0}&{1} \end{bmatrix} \begin{bmatrix}{X_c}\\{Y_c}\\{Z_c}\end{bmatrix}
uv1
=
fx000fy0cxcy1
XcYcZc
内参矩阵不依赖于所观察的场景。因此,一旦估计出来,只要焦距固定(对于变焦镜头而言),就可以重复使用。因此,如果相机的图像按某个比例因子缩放,那么所有这些参数都需要按相同的比例因子进行缩放(相应地乘以或除以)。
联合旋转-平移矩阵
[
R
∣
t
]
[R|t]
[R∣t]是射影变换和齐次变换的矩阵乘积。3x4 的射影变换将用相机坐标表示的3D点映射到图像平面上的2D点,并且这些2D点用归一化的相机坐标
x
′
=
X
c
/
Z
c
x' = X_c / Z_c
x′=Xc/Zc和
y
′
=
Y
c
/
Z
c
y' = Y_c / Z_c
y′=Yc/Zc
Z
c
[
x
′
y
′
1
]
=
[
1
0
0
0
0
1
0
0
0
0
1
0
]
[
X
c
Y
c
Z
c
1
]
Z_c \begin{bmatrix} x' \\ y' \\ 1 \end{bmatrix} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} \begin{bmatrix} X_c \\ Y_c \\ Z_c \\ 1 \end{bmatrix}
Zc
x′y′1
=
100010001000
XcYcZc1
齐次变换由外参
R
R
R和
t
t
t编码,表示从世界坐标系w到相机坐标系c的基底变换。因此,给定世界坐标中的点P
的表示
P
w
P_w
Pw,我们可以通过
P
c
=
[
R
∣
0
;
t
∣
1
]
P
w
P_c = [R | 0; t | 1] P_w
Pc=[R∣0;t∣1]Pw
这个齐次变换由 R,一个3x3的旋转矩阵,和t,一个3x1的平移向量组成:
[
R