常用相机投影及畸变模型其一
1. 背景2. 针孔相机投影模型及其畸变模型2.1 缩略词和术语2.1 世界坐标系到像素坐标系2.2 针孔相机模型2.2.1 世界坐标系到相机坐标系2.2.2 相机坐标系到像素坐标系
2.3 综述2.4 内参标定2.5 畸变模型2.5.1 径向畸变2.5.2 切向畸变2.5.3 歪斜(skewed)
2.6 畸变矫正2.7 COD 和 PP2.7.1 除法畸变模型(Division distortion model)2.7.2 除法畸变模型参数
2.8 针孔相机成像过程建模总结
Reference:
高翔,张涛 《视觉SLAM十四讲》鱼眼镜头是怎么「鱼眼」的?VIO标定(二)广角相机模型鱼眼相机模型EUCM(一)相机模型–Omnidirectional CameraOmnidirectional CameraMei: http://www.robots.ox.ac.uk/~cmei/articles/single_viewpoint_calib_mei_07.pdfOCamCalib: Omnidirectional Camera Calibration Toolbox for Matlab
omnidirectional camera(广角相机):在一个水平面有360°视野的相机,或视野能覆盖半个球或近似整个球的相机。
1. 背景
面镜(mirror)与透镜(lens)的区别:
面镜用的是镜面反射;透镜用的是镜面折射。
广角相机成像步骤与普通相机基本一致,主要的区别在于镜头聚光的部分,广角相机为了获得更大的FOV,有三种镜头聚光方式:
Dioptric(折射光学的) camera:通过透镜来实现,主要是折射;仅通过折射,比如鱼眼镜头Catadioptric(反射折射的) camera:使用一个标准相机和一个面镜 shaped mirror — such as a parabolic, hyperbolic, or elliptical mirror,后面介绍的mirror都是如此,其在水平面可以提供360度视野,仰角方向大于100度;Poly-dioptric camera:通过组合多个相机来重叠相机视野。
2. 针孔相机投影模型及其畸变模型
设
O
−
x
−
y
−
z
O-x-y-z
O−x−y−z为相机坐标系,习惯上将
z
z
z轴指向相机前方,
x
x
x轴向右,
y
y
y轴向下。
O
O
O为摄像机的光心,也是针孔模型中的针孔。现实世界的空间点P,经过小孔
O
O
O投影之后,落在物理成像平面
O
′
−
x
′
−
y
′
O'-x'-y'
O′−x′−y′上,成像点为
P
′
P'
P′。 (注意这里的
(
c
x
,
c
y
)
(c_x, c_y)
(cx,cy) 写的是 光心 或 principle point(PP),不是畸变中心(COD)!)
2.1 缩略词和术语
TermDescriptionCOD畸变中心(Center of Distortion) - 在传感器上的
(
x
,
y
)
(x,y)
(x,y) 表示拟合的最佳对称中心 (unit:pixel)DM畸变模型(Distortion Model)EFL有效焦距(Effective Focal Length)Pinhole Model FL针孔模型焦距(Pinhole Model Focal Length) - 图像去畸变后的模型焦距 (unit:pixel)FOV视野(Field of View)。FOV的大小取决于相机镜头的焦距和传感器尺寸。较短的焦距和较大的传感器尺寸会导致更大的FOC,即能够捕捉到更广阔的画面范围。PP主点(Principle Point) - 透镜光轴与传感器表面的交点LPP透镜主平面(Lens Primary Plane)
2.1 世界坐标系到像素坐标系
世界坐标系中三维点
M
=
[
X
,
Y
,
Z
]
T
M=[X, Y, Z]^{T}
M=[X,Y,Z]T和像素坐标系中二维点
m
=
[
u
,
v
]
T
m=[u, v]^{T}
m=[u,v]T的关系为:
s
m
~
=
A
[
R
t
]
M
~
s \tilde{m}=A[R \quad t] \tilde{M}
sm~=A[Rt]M~
即:
s
[
u
v
1
]
=
Z
c
[
u
v
1
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
c
Y
c
Z
c
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
r
11
r
12
r
13
t
1
r
21
r
22
r
23
t
2
r
31
r
32
r
33
t
3
]
[
X
w
Y
w
Z
w
1
]
s\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=Z_c\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right] = \left[\begin{array}{lll} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right] \left[\begin{array}{c} X_{c} \\ Y_{c} \\ Z_{c} \end{array}\right]= \left[\begin{array}{lll} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{llll} r_{11} & r_{12} & r_{13} & t_{1} \\ r_{21} & r_{22} & r_{23} & t_{2} \\ r_{31} & r_{32} & r_{33} & t_{3} \end{array}\right]\left[\begin{array}{c} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{array}\right]
s
uv1
=Zc
uv1
=
fx000fy0cxcy1
XcYcZc
=
fx000fy0cxcy1
r11r21r31r12r22r32r13r23r33t1t2t3
XwYwZw1
其中,
s
s
s为缩放因子(
Z
c
Z_c
Zc),
A
A
A为相机的内参矩阵,
[
R
t
]
[R \quad t]
[Rt] 为相机的外参矩阵,
m
~
\tilde{m}
m~ 和
M
~
\tilde{M}
M~ 分别为
m
m
m 和
M
M
M对应的齐次坐标系。
2.2 针孔相机模型
相机将三维世界中的坐标点(unit: m) 映射到二维图像平面(unit: pixel) 的过程能够用一个几何模型来描述,其中最简单的称为针孔相机模型 (pinhole camera model)。
像素坐标:像素点在图像中所处的位置,以像素点左上角为原点图像坐标:图像中某个特征点在整幅图像中的位置,此时原点位于图像的中心
2.2.1 世界坐标系到相机坐标系
[
X
c
Y
c
Z
c
]
=
R
[
X
w
Y
w
Z
w
]
+
t
=
[
R
t
]
[
X
w
Y
w
Z
w
1
]
=
[
r
11
r
12
r
13
t
1
r
21
r
22
r
23
t
2
r
31
r
32
r
33
t
3
]
[
X
w
Y
w
Z
w
1
]
\left[\begin{array}{l} X_{c} \\ Y_{c} \\ Z_{c} \end{array}\right]=R\left[\begin{array}{c} X_{w} \\ Y_{w} \\ Z_{w} \end{array}\right]+t=[R \quad t]\left[\begin{array}{ccc} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{array}\right]= \left[\begin{array}{llll} r_{11} & r_{12} & r_{13} & t_{1} \\ r_{21} & r_{22} & r_{23} & t_{2} \\ r_{31} & r_{32} & r_{33} & t_{3} \end{array}\right]\left[\begin{array}{c} X_{w} \\ Y_{w} \\ Z_{w} \\ 1 \end{array}\right]
XcYcZc
=R
XwYwZw
+t=[Rt]
XwYwZw1
=
r11r21r31r12r22r32r13r23r33t1t2t3
XwYwZw1
2.2.2 相机坐标系到像素坐标系
根据三角形相似关系,有:
Z
c
f
=
X
c
x
=
Y
c
y
\frac{Z_{c}}{f}=\frac{X_{c}}{x}=\frac{Y_{c}}{y}
fZc=xXc=yYc
整理,得:
{
x
=
f
⋅
X
c
Z
c
y
=
f
⋅
Y
c
Z
c
\left\{\begin{array}{l} x=f \cdot \frac{X_{c}}{Z_{c}} \\ y=f \cdot \frac{Y_{c}}{Z_{c}} \end{array}\right.
{x=f⋅ZcXcy=f⋅ZcYc
像素坐标系通常的定义方式是:原点
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
[c_x,c_y]^T
[cx,cy]T。那么整理得,坐标之间的关系为:
{
u
=
α
⋅
x
+
c
x
v
=
β
⋅
y
+
c
y
⟹
{
u
=
α
f
⋅
X
c
Z
c
+
c
x
=
f
x
X
c
Z
c
+
c
x
v
=
β
f
⋅
Y
c
Z
c
+
c
y
=
f
y
Y
c
Z
c
+
c
y
\left\{\begin{array}{l} u=\alpha \cdot x+c_{x} \\ v=\beta \cdot y+c_{y} \end{array} \Longrightarrow\left\{\begin{array}{l} u=\alpha f \cdot \frac{X_{c}}{Z_{c}}+c_{x} = f_{x}\frac{X_c}{Z_c} + c_x \\ v=\beta f \cdot \frac{Y_{c}}{Z_{c}}+c_{y} = f_{y}\frac{Y_c}{Z_c} + c_y \end{array}\right.\right.
{u=α⋅x+cxv=β⋅y+cy⟹{u=αf⋅ZcXc+cx=fxZcXc+cxv=βf⋅ZcYc+cy=fyZcYc+cy
其中,
f
f
f 为镜头焦距,单位为米;
α
\alpha
α、
β
\beta
β 的单位为像素/米;
f
y
f_y
fy、
f
y
f_y
fy 为
x
x
x、
y
y
y 方向的焦距,单位为像素。
最终,写成矩阵的形式为:
Z
c
[
u
v
1
]
=
[
f
x
0
c
x
0
f
y
c
y
0
0
1
]
[
X
c
Y
c
Z
c
]
=
K
P
Z_c\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{ccc} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} X_{c} \\ Y_{c} \\ Z_{c} \end{array}\right]=KP
Zc
uv1
=
fx000fy0cxcy1
XcYcZc
=KP
2.3 综述
从另一个角度看,我们可以把一个世界坐标点先转换到相机坐标系,再除掉它最后一维的数值(即该点距离相机成像平面的深度),这相当于把最后一维进行归一化处理,得到点
P
P
P 在相机归一化平面上的投影:
(
R
P
w
+
t
)
=
[
X
,
Y
,
Z
]
T
(
相机坐标
)
→
[
X
/
Z
,
Y
/
Z
,
1
]
T
(归一化坐标)
(RP_w+t) = [X,Y,Z]^T(相机坐标) \rightarrow [X/Z,Y/Z,1]^T(归一化坐标)
(RPw+t)=[X,Y,Z]T(相机坐标)→[X/Z,Y/Z,1]T(归一化坐标)
归一化坐标可以看成相机前方
z
=
1
z=1
z=1 处的平面上的一个点,这个
z
=
1
z=1
z=1 平面也称为归一化平面。归一化坐标再左乘内参就得到了像素坐标,所以我们可以把像素坐标
[
u
,
v
]
T
[u,v]^T
[u,v]T 看成对归一化平面上的点进行量化测量的结果。从这个模型中也可以看出,如果对相机坐标同时乘以任意非零常数,归一化坐标都是一样的,这说明点的深度在投影过程中被丢失了,所以单目视觉中没法得到像素点的深度值。
2.4 内参标定
内参标定(Intrinsic Camera Calibration) 是找到一个相机的物理参数的过程。标定结果是一个相机内参集合。
2.5 畸变模型
普通相机畸变通常包括径向畸变和切向畸变。如下图所示 切向畸变表达式沿半径方向的偏移量,径向畸变的形成原因是镜头制造工艺不完美,使得镜头形状存在缺陷,通常又分为桶性畸变和枕形畸变,分别代表
d
r
dr
dr 往外偏和往里偏。
[
x
d
i
s
t
o
r
t
e
d
,
y
d
i
s
t
o
r
t
e
d
]
T
[x_{distorted}, y_{distorted}]^T
[xdistorted,ydistorted]T是畸变后点的归一化坐标。
2.5.1 径向畸变
真实的摄像头使用的并不是针孔,它们使用的是能一次性聚焦大量光线的镜头,这使得其能迅速生成图像,但是,镜头仍会产生失真,光线通常会在摄像机镜头的边缘出现较大或较小幅度的弯曲,这会产生图像边缘扭曲的效果,因此,线条或者物体会比真实情况呈现出或多或少的弯曲。这种失真被称为径向畸变,是最常见的失真类型。
桶形畸变(Barrel Distortion):又称桶形失真,是指光学系统引起的成像画面呈桶形膨胀状的失真现象。 桶形畸变在摄影镜头成像尤其是广角镜头成像时较为常见。枕形畸变(Pincushion Distortion):又称枕形失真,它是指光学系统引起的成像画面向中间“收缩”的现象。 枕形畸变在长焦镜头成像时较为常见较短的焦距可以捕捉更宽广的画面,但可能会引起桶型畸变(比如鱼眼相机);而较长的焦距可以捕捉较为狭窄的画面,但可能会引起枕型畸变。
实际情况中我们常用
r
=
0
r=0
r=0 处的泰勒级数展开的前几项来近似描述径向畸变,径向畸变后的归一化坐标为:
{
x
distorted
=
x
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
y
distorted
=
y
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
\left\{\begin{array}{l} x_{\text {distorted}}=x\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right) \\ y_{\text {distorted}}=y\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right) \end{array}\right.
{xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)
2.5.2 切向畸变
切向畸变是由于透镜和CMOS或者CCD的安装位置误差导致(相机的组装过程中由于不能使得透镜和成像面严格平行),切向畸变需要两个额外的畸变参数来描述,切向畸变后的归一化坐标为:
{
x
distorted
=
x
+
2
p
1
x
y
+
p
2
(
r
2
+
2
x
2
)
y
distorted
=
y
+
2
p
2
x
y
+
p
1
(
r
2
+
2
y
2
)
\left\{\begin{array}{l} x_{\text {distorted}}=x+2 p_{1} x y+p_{2}\left(r^{2}+2 x^{2}\right) \\ y_{\text {distorted}}=y+2 p_{2} x y+p_{1}\left(r^{2}+2 y^{2}\right) \end{array}\right.
{xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+2p2xy+p1(r2+2y2)
其中,
r
2
=
x
2
+
y
2
r^{2}=x^{2}+y^{2}
r2=x2+y2。 对于相机坐标系中的一点
P
P
P,我们能够通过5个畸变系数找到这个点在像素平面上的正确位置:
{
x
distorted
=
x
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
+
2
p
1
x
y
+
p
2
(
r
2
+
2
x
2
)
y
distorted
=
y
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
+
2
p
2
x
y
+
p
1
(
r
2
+
2
y
2
)
\left\{\begin{array}{l}x_{\text {distorted}}=x\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right)+2 p_{1} x y+p_{2}\left(r^{2}+2 x^{2}\right) \\ y_{\text {distorted}}=y\left(1+k_{1} r^{2}+k_{2} r^{4}+k_{3} r^{6}\right)+2 p_{2} x y+p_{1}\left(r^{2}+2 y^{2}\right)\end{array}\right.
{xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+2p2xy+p1(r2+2y2)
由于参数过多导致数值求解不稳定, 通常只使用
k
1
k_1
k1,
k
2
k_2
k2,
k
3
k_3
k3,
p
1
p_1
p1,
p
2
p_2
p2综上,我们一共需要5个畸变参数
(
k
1
,
k
2
,
k
3
,
p
1
,
p
2
)
\left(k_{1}, k_{2}, k_{3}, p_{1}, p_{2}\right)
(k1,k2,k3,p1,p2)来描述透镜畸变。 将畸变后的点通过内参数矩阵投影到像素平面,得到该点在图像上的正确位置:
{
u
=
f
x
x
distorted
+
c
x
v
=
f
y
y
distorted
+
c
y
\left\{\begin{array}{l}u=f_{x} x_{\text {distorted}}+c_{x} \\ v=f_{y} y_{\text {distorted}}+c_{y}\end{array}\right.
{u=fxxdistorted+cxv=fyydistorted+cy
2.5.3 歪斜(skewed)
图像传感器图像原尺寸在制造过程可能不是正方形,同时可能存在歪斜(skewed)(也就是物理成像平面可能在设计或生产上是个歪的),因此需要考虑这些影响因素,传感器歪斜和不是正方形主要对相机
x
x
x 和
y
y
y 方向的焦距产生影响。
在不考虑畸变的情况下,考虑主点偏移、图像传感器的特性,3D 目标点成像数学模型用以下公式可完全表达。这就是相机内部参数对成像的影响,因此
K
K
K 称为内参矩阵,相机内参标定主要是标定相机的焦距、主点、歪斜(下面的
s
s
s)等内部参数。
Z
c
[
u
v
1
]
=
[
f
s
c
x
0
η
f
c
y
0
0
1
]
[
X
c
Y
c
Z
c
]
=
K
P
Z_c\left[\begin{array}{l} u \\ v \\ 1 \end{array}\right]=\left[\begin{array}{ccc} f & s & c_{x} \\ 0 & \eta f & c_{y} \\ 0 & 0 & 1 \end{array}\right]\left[\begin{array}{l} X_{c} \\ Y_{c} \\ Z_{c} \end{array}\right]=KP
Zc
uv1
=
f00sηf0cxcy1
XcYcZc
=KP
2.6 畸变矫正
将图像中的每个位置,在畸变后的位置找出。
for (int v = 0; v < height; v++) {
for (int u = 0; u < width; u++) {
double u_distorted = 0, v_distorted = 0;
// 计算点(u,v)对应到畸变图像中的坐标(u_distorted, v_distorted)
double x = (u-cx)/fx;
double y = (v-cy)/fy;
double x2 = x*x, y2 = y*y, xy = x*y, r2 = x2 + y2;
double x_radial = x * (1 + k1*r2 + k2*r2*r2);
double y_radial = y * (1 + k1*r2 + k2*r2*r2);
double x_tangential = 2*p1*xy + p2*(r2 + 2*x2);
double y_tangential = 2*p2*xy + p1*(r2 + 2*y2);
double xd = x_radial + x_tangential;
double yd = y_radial + y_tangential;
u_distorted = xd*fx + cx;
v_distorted = yd*fy + cy;
// 赋值(最近邻插值)
if (u_distorted >= 0 && v_distorted >= 0 && u_distorted < width && v_distorted < height)
img_dst(v, u) = (*this)((int) v_distorted, (int) u_distorted);
else
img_dst(v, u) = 0;
}
}
2.7 COD 和 PP
以下为 COD 和 PP 误差示意图:
(注意COD图片上两点在透镜中心相交,而PP的理论上垂直于传感器表面。也就是说在透镜装歪了的时候,COD本身也会跟着歪过来,但是PP理论上是垂直的,可能因为标定误差的原因导致它偏离了原位置)
有些情况下 PP 和 COD 是相似的,有些情况下它们可能是不同的。这主要取决于 相机构造质量 还有 相机透镜和传感器之间的对齐精度(见下面的一个例子展示了切向失真,这会导致 PP 和 COD 不同):
使用上在 2.7.2 节有比较清晰的示例,简单说,去畸变时使用的畸变中心,COD是畸变矫正的参考原点;内参矩阵
K
K
K 中使用 PP,一般用
(
c
x
,
c
y
)
(c_x, c_y)
(cx,cy) 表示,这里的
c
c
c 是 center,有的文章中是
p
p
x
pp_x
ppx、
p
p
y
pp_y
ppy,但早起大多数标定法使用的是
(
c
x
,
c
y
)
(c_x, c_y)
(cx,cy),就沿用了下来。
2.7.1 除法畸变模型(Division distortion model)
R
u
=
R
d
/
(
1
+
sign
(
K
1
)
∗
(
K
1
∗
R
d
)
2
+
sign
(
K
2
)
∗
(
K
2
∗
R
d
)
4
+
…
+
sign
(
K
n
)
∗
(
K
n
∗
R
d
)
2
n
)
R_u=R_d /\left(1+\operatorname{sign}\left(K_1\right) *\left(K_1 * R_d\right)^2+\operatorname{sign}\left(K_2\right) *\left(K_2 * R_d\right)^4+\ldots+\operatorname{sign}\left(K_n\right) *\left(K_n * R_d\right)^{2 n}\right)
Ru=Rd/(1+sign(K1)∗(K1∗Rd)2+sign(K2)∗(K2∗Rd)4+…+sign(Kn)∗(Kn∗Rd)2n)
R
u
R_u
Ru:去畸变后的半径;
R
d
R_d
Rd:畸变半径。
2.7.2 除法畸变模型参数
ParameterDescriptionExamplecamK最前面的两个参数对应于焦距 x 和焦距 y(像素单位,原始图像)。在大多数情况下,焦距 x 和 y 是相同的,因为传感器像素通常是正方形而不仅仅是矩形。第三个参数为 skew,通常使用的 skew=0。非零值意味着像素是一个平行四边形,而不是一个完美的矩形/正方形。第四和第五个参数是主点的坐标PPx和PPy(像素单位,原始图像)camK = 2612.70312 2612.70312 0 671.287598 277.750671DM第一个参数为模型类型。这里
3
3
3 代表的是当前使用的是除法模型:
R
u
=
R
d
/
(
1
+
sign
(
K
1
)
∗
(
K
1
∗
R
d
)
2
+
sign
(
K
2
)
∗
(
K
2
∗
R
d
)
4
+
sign
(
K
3
)
∗
(
K
3
∗
R
d
)
6
)
R_u=R_d /(1+\operatorname{sign}\left(K_1\right) *\left(K_1 * R_d\right)^2+\operatorname{sign}\left(K_2\right) *\left(K_2 * R_d\right)^4+\operatorname{sign}\left(K_3\right) *\left(K_3 * R_d\right)^{6})
Ru=Rd/(1+sign(K1)∗(K1∗Rd)2+sign(K2)∗(K2∗Rd)4+sign(K3)∗(K3∗Rd)6) 第2和第3个参数是畸变中心的坐标CODx和CODy。参数4到6是畸变系数,为上面的公式
K
K
K 的
1
−
3
1-3
1−3。最后一个参数是
γ
\gamma
γ,总是
1
1
1。distortParams = 3 635.07196 560.289429 -0.000464434823 0.000386408938 0.000644135347 1
2.8 针孔相机成像过程建模总结