相机模型以及FOV计算
一、相机模型
相机将三维世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程 能够用一个几何模型进行描述。这里介绍一下常用的相机模型——针孔相机模型。
1.针孔相机模型
针孔相机模型可以理解为通过小孔呈像原理将三维世界中的景象投射到二维成像平面上。如下图所示:
这里
O
−
x
−
y
−
z
O-x-y-z
O−x−y−z为相机坐标系,一般Z轴向前,X轴向右,Y轴向下,
O
O
O为相机的光心,同时也是针孔模型中的针孔,现实世界的空间点
P
P
P经过小孔
O
O
O投影之后,落在物理成像平面
O
′
−
x
′
−
y
′
O^{'}-x^{'}-y^{'}
O′−x′−y′上,成像点
P
′
P^{'}
P′,设
P
P
P的坐标为
[
X
,
Y
,
Z
]
T
\begin{bmatrix}X, & Y, & Z \end{bmatrix}^{T}
[X,Y,Z]T,
P
′
P^{'}
P′为
[
X
′
,
Y
′
,
Z
′
]
T
\begin{bmatrix}X^{'}, & Y^{'}, & Z^{'} \end{bmatrix}^{T}
[X′,Y′,Z′]T,物理成像的平面到相机光心(小孔)的距离为
f
f
f(焦距)。如上图右侧所示,根据三角形的相似关系有:
Z
f
=
−
X
X
′
=
−
Y
Y
′
\begin{align*} \frac{Z}{f}=-\frac{X}{X^{'}}=-\frac{Y}{Y^{'}} \\ \end{align*}
fZ=−X′X=−Y′Y
其中负号表示成的像是倒立的。为了简化模型,我们把可以成像平面对称到相机前方,和三维空间点一起放在摄像机坐标系的同一侧,这样可以去掉负号,同时大多数相机输出的图像并不是倒像——相机自身 的软件会帮你翻转这张图像,所以你看到的一般是正着的像,也就是对称的成像平面上的像。由于输出的图像已经做了预处理,所以理解成在对称平面上的像,并不会带来什么坏处。可以参考下图:
整理可以得到:
X
′
=
f
X
Z
Y
′
=
f
Y
Z
(1)
\begin{align*} X^{'}&=f \frac{X}{Z} \\ Y^{'}&=f \frac{Y}{Z} \\ \end{align*} \tag{1}
X′Y′=fZX=fZY(1)
2.像素坐标系
上面描述了空间中点P和它的像之间的空间关系,但是我们最终获得的是一个个的像素,这需要在成像平面上对呈的像进行采样和量化,将光线转换为图像的像素。设在物理成像平面上固定着一个像素平面 O − u − v O-u-v O−u−v。我们在像素平面得到了 P ′ P^{'} P′的像素坐标: [ u , v ] T \begin{bmatrix}u ,& v \end{bmatrix}^{T} [u,v]T。像素坐标系为下图所示:
原点
O
′
O^{'}
O′ 位于图像的左上角,
u
u
u轴向右与
x
x
x轴平行,
v
v
v轴向下与
y
y
y轴平行。像素坐标系与成像平面之间,相差了一个缩放和一个原点的平移。我们设像素坐标在
u
u
u轴上缩放了
α
\alpha
α倍,在
v
v
v上缩放了
β
\beta
β倍。同时,原点平移了
[
c
x
,
c
y
]
T
\begin{bmatrix}c_{x} ,& c_{y} \end{bmatrix}^{T}
[cx,cy]T。那么,
P
′
P^{'}
P′的坐标与像素坐标
[
u
,
v
]
T
\begin{bmatrix}u ,& v \end{bmatrix}^{T}
[u,v]T的关系为:
{
u
=
α
X
′
+
c
x
v
=
β
Y
′
+
c
y
\begin{cases} u=\alpha X^{'}+c_x \\ v=\beta Y^{'}+c_y\\ \end{cases}
{u=αX′+cxv=βY′+cy
将此式与之前的式子进行合并:
{
u
=
α
X
′
+
c
x
v
=
β
Y
′
+
c
y
\begin{cases} u=\alpha X^{'}+c_x \\ v=\beta Y^{'}+c_y\\ \end{cases}
{u=αX′+cxv=βY′+cy
X ′ = f X Z Y ′ = f Y Z \begin{align*} X^{'}&=f \frac{X}{Z} \\ Y^{'}&=f \frac{Y}{Z} \\ \end{align*} X′Y′=fZX=fZY
同时令
α
f
\alpha f
αf合并成
f
x
f_x
fx,
β
f
\beta f
βf合并成
f
y
f_y
fy,其中
f
f
f的单位是米,
α
,
β
\alpha, \beta
α,β的单位为像素每米,合并得到的
f
x
,
f
y
f_x,f_y
fx,fy的单位为像素,得到:
{
u
=
α
f
X
Z
+
c
x
=
f
x
X
Z
+
c
x
v
=
β
f
Y
Z
+
c
y
=
f
y
Y
Z
+
c
y
\begin{cases} u&=\alpha f \frac{X}{Z}+c_x&=f_x \frac{X}{Z}+c_x \\ v&=\beta f \frac{Y}{Z}+c_y&=f_y \frac{Y}{Z}+c_y\\ \end{cases}
{uv=αfZX+cx=βfZY+cy=fxZX+cx=fyZY+cy
将该式写成矩阵形式,
[
u
v
1
]
=
1
Z
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
Y
Z
]
=
1
Z
K
P
\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=\frac{1}{Z}\begin{bmatrix} f_x &0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} X \\ Y \\ Z \end{bmatrix}=\frac{1}{Z}KP
uv1
=Z1
fx000fy0cxcy1
XYZ
=Z1KP
按照习惯将Z移到左侧:
Z
[
u
v
1
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
Y
Z
]
=
K
P
Z\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 \\ Y \\ Z \end{bmatrix}=KP
Z
uv1
=
fx000fy0cxcy1
XYZ
=KP
将
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
\begin{bmatrix} f_x &0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix}
fx000fy0cxcy1
作为相机的内参矩阵K,内参可以利用棋盘网格或者apriltag码方式进行标定。内参一般是不会变化的,除非焦距等参数发生了改变。
二、FOV相关计算公式
1.FOV简介
FOV的全称是Field of View (视场角),它表示相机或者人眼可以接收或者显示的影像的角度范围。由于相机的成像原理,一般都会有视场角的限制。如下图所示当相机的CCD或CMOS传感器的成像平面W一定时,FOV由焦距f决定,当焦距越大时,看的越远 但是FOV就会越小。当焦距越小时,FOV会变大,但是看到的范围就会变近。
2.FOV相关的计算公式
主要分为水平FOV,垂直FOV和对角FOV。其中水平FOV由焦距和sensor的宽度W决定,垂直FOV由焦距和sensor的高度H决定,DFOV由焦距和sensor的宽度W和高度H决定。
相关的计算公式如下,其中
f
x
,
c
x
,
f
y
,
c
y
f_x,c_x,f_y,c_y
fx,cx,fy,cy为相机去畸变后的内参:
水平方向
:
H
F
O
V
=
F
O
V
h
o
r
i
z
o
n
t
a
l
=
2
∗
arctan
(
c
x
f
x
)
=
2
∗
arctan
[
t
a
n
(
D
F
O
V
2
)
c
o
s
(
a
r
c
t
a
n
(
c
y
c
x
)
]
垂直方向
:
V
H
O
F
=
F
O
V
v
e
r
t
i
c
a
l
=
2
∗
arctan
(
c
y
f
y
)
=
2
∗
arctan
[
t
a
n
(
D
F
O
V
2
)
s
i
n
(
a
r
c
t
a
n
(
c
y
c
x
)
]
水平方向:HFOV=FOV_{horizontal} = 2*\arctan(\frac{c_x}{f_x})=2*\arctan[tan(\frac{DFOV}{2})cos(arctan(\frac{c_y}{c_x})] \\ 垂直方向:VHOF=FOV_{vertical} = 2*\arctan(\frac{c_y}{f_y})=2*\arctan[tan(\frac{DFOV}{2})sin(arctan(\frac{c_y}{c_x})] \\
水平方向:HFOV=FOVhorizontal=2∗arctan(fxcx)=2∗arctan[tan(2DFOV)cos(arctan(cxcy)]垂直方向:VHOF=FOVvertical=2∗arctan(fycy)=2∗arctan[tan(2DFOV)sin(arctan(cxcy)]