相机标定

相机在计算机视觉方面的一些应用一般需要相机标定。我们总是听到标定这个词,那么具体标定的是什么呢?相机的拍摄是一个三维到二维(透视投影)的过程,这个过程可以用数学模型去表述,标定便是计算这个数学模型中的参数,我们最终希望通过这些参数能够从二维的图像去还原三维的世界。

拍照过程简化(针孔相机模型)

拍照是一个三维世界降维到二维的不可逆的操作,可以说相机拍摄是一个
R
3

R
2
\mathbb{R}^3 \to \mathbb{R}^2
R3R2
的变换。
相机标定的目的就是找到一个合适的数学模型,近似表示这个三维到二维的过程,并且求其逆过程。

实际的镜头模组都是非常复杂的,我们可以找一个与这个镜头具有相同的物像共轭关系的凸透镜来等效这个镜头,我们把这个凸透镜称作等效透镜。为了分析的方便,我们用一个等效透镜在数学上替代一整个镜头模组。

【相机标定】相机内参 【相机标定】相机内参
Canon EF 85mm/F1.2L II USM 镜头模组 等效透镜

简化后的针孔相机模型中的 f 为焦距,但是这个焦距不是等效透镜的焦距,而是指图像传感器到等效透镜光心 O 的距离。
针孔相机模型大大简化了相机模型的数学复杂度,但是也有一些代价。针孔相机模型没有考虑相差(镜头畸变),没有考虑景深(因为针孔成像没有焦距的概念,认为物总是能够清晰成像)。

我们以小米 12S Ultra 的主摄为例,Sony IMX989 就是该款主摄的 CMOS 图像传感器。即便手机中的相机模组体积很紧凑,其中也是有多片镜头的,右下图是主摄的镜头组拆解,左图说的 23mm 等效焦距就是指跟这一堆镜片等效的等效镜片到 CMOS 的距离。像素尺寸指的是一个 CMOS 像素的边长,一个(正方形)像素尺寸约为 1.6μm。四合一像素尺寸是四个像素合成一个像素,所以边长 3.2μm。

小米12S Ultra主摄模组拆解
【相机标定】相机内参
【相机标定】相机内参

相机内参

相机拍摄过程中的四个坐标系

下图表示了摄影的过程,其实计算机视觉可以说是摄影或计算机图形学(Computer Graphics)的逆过程,想着如何利用已经降维成2D的信息去还原3D世界中的信息。

【相机标定】相机内参

这里使用四个坐标系来描述拍摄过程:像素坐标系、图像坐标系、相机坐标系、世界坐标系。

像素坐标系:图片是由像素组成的,每个像素可以用一个有序二元组(u,v)来表示,这个坐标系就叫做像素坐标系。像素坐标系是一个二维坐标系,标识了在每个像素在图像传感器中的位置,每次增量是 1 个像素。

图像坐标系:像素坐标系中的标号为(u,v),其中 u 轴对应实际物理尺寸 dx,v 轴对应实际物理尺寸 dy,图像坐标系是一个对应真实世界的尺寸二维坐标系,可以记为
(
x
,
y
)
(x,y)
(x,y)
。图像坐标系也标记的是像素在图像传感器中的位置,不过增量是每个像素的实际物理尺寸,比如上面提到的 IMX989 的每个像素尺寸 1.6μm,对应这里的dx和dy。

相机坐标系:以相机光心为原点呈现的世界三维坐标系
(
X
,
Y
,
Z
)
(X,Y,Z)
(X,Y,Z)
,坐标系原点是相机等效镜头的光心。

世界坐标系:真实的世界三维坐标系
(
X
w
,
Y
w
,
Z
w
)
(X_w,Y_w,Z_w)
(Xw,Yw,Zw)
,坐标系原点一般是外界的某一点。比如在机器人应用中经常是以机器人的基座为世界坐标系原点。

像素坐标系 图像坐标系 相机坐标系 世界坐标系
2D 坐标系,位于 CMOS 3D 坐标系
整数序号,标识像素位置,
原点位于 CMOS 左上角
对应真实世界物理尺寸,
标识像素在 CMOS 上的平面位置,
原点为相机光轴与 CMOS 的交点。
原点为相机光心 世界坐标系原点

相机拍照的过程可以分为以下几步:

相机内参

相机内参便是求第二步和第三步中的参数。

为了描述的方便,我们可以将针孔相机模型翻转过来,如下图所示,因为主要用到三角关系,所以翻转前后在数学描述上是等价的。
【相机标定】相机内参

在相机坐标系中,像平面(图像传感器所在平面)为
Z
=
f
Z=f
Z=f
(焦距,mm)。空间中一点 P 在相机坐标系下为
P
(
X
,
Y
,
Z
)
P(X,Y,Z)
P(X,Y,Z)
,该点在像平面上的投影为点
p
(
x
.
y
)
p(x.y)
p(x.y)
,在图像坐标系下为
p
(
x
,
y
)
p(x,y)
p(x,y)
,在像素坐标系中的坐标为
(
u
,
v
)
(u,v)
(u,v)

  【相机标定】相机内参

根据三角形相似原理,通过右图可得图像坐标系和相机坐标系比例关系


x
X
=
y
Y
=
f
Z
\frac{x}{X}=\frac{y}{Y}=\frac{f}{Z}
Xx=Yy=Zf

相机坐标系(3D) -> 图像坐标系(2D):于是我们 得到了 相机坐标系中一3D点
(
X
,
Y
,
Z
)
(X,Y,Z)
(X,Y,Z)
在图像坐标系中的对应平面位置
(
x
,
y
)
(x,y)
(x,y)


x
=
f
Z
X
,
 
y
=
f
Z
Y
x={f \over Z}X,\ y={f \over Z}Y
x=ZfX, y=ZfY

像素坐标系的原点位于图像传感器的左上角,记光心到 CMOS 零点的偏移为
c
x
,
c
y
c_x,c_y
cx,cy
,也就是相机光心在像素坐标系中的坐标为
(
c
x
,
c
y
)
(c_x,c_y)
(cx,cy)
。记每个像素在水平和竖直方向上的尺寸为
k
,
l
k, l
k,l
(mm/pixel),由于像素不一定是正方形的,所以这里长宽分别表示,这个就对应上面说的CMOS像素尺寸1.6μm。

图像坐标系(连续2D) -> 像素坐标系(离散2D):则图像坐标系中一点
(
x
,
y
)
(x,y)
(x,y)
到像素坐标系中像素标号
(
u
,
v
)
(u,v)
(u,v)
的关系可以表示为


u
=
x
k
+
c
x
=
f
k
Z
X
+
c
x
u={x\over k}+c_x={f \over kZ}X + c_x
u=kx+cx=kZfX+cx


v
=
y
l
+
c
y
=
f
l
Z
Y
+
c
y
v={y \over l}+c_y = {f \over lZ}Y + c_y
v=ly+cy=lZfY+cy


f
x
=
f
/
k
,
f
y
=
f
/
l
f_x=f /k, f_y=f /l
fx=f/k,fy=f/l
,则上面两式可以写成


u
=
f
x
X
Z
+
c
x
,
 
v
=
f
y
Y
Z
+
c
y
u=f_x{X \over Z}+c_x,\ v=f_y{Y \over Z}+c_y
u=fxZX+cx, v=fyZY+cy

其中
f
x
=
f
/
k
,
f
y
=
f
/
l
f_x=f/k,f_y=f/l
fx=f/k,fy=f/l
(pixel)为像素焦距,即单位长度的像素个数,单位为像素。

上式写成矩阵形式为


[
u
v
1
]
=
1
Z
[
f
x
c
x
f
y
c
y
1
]
[
X
Y
Z
]
\begin{bmatrix} u\\ v\\ 1 \end{bmatrix}= {1 \over 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}
uv1=Z1fx000fy0cxcy1XYZ

上面的矩阵可以写成
Z
p
u
v
=
K
P
Zp_{uv}=KP
Zpuv=KP
,中间的矩阵便是内参(intrinsics)矩阵,其中的四个参数便是要标定的内参。这个矩阵描述了相机坐标系到像素坐标系的变换关系。

有了相机内参我们便可以知道像素点对应的归一化平面(距光心距离为1的平面)的 x y 坐标,注意不是真实的XY坐标,因为空间点的深度值在透视投影过程中丢失了。

畸变

畸变(distortion)是对直线投影(rectilinear projection)的一种偏移。简单来说直线投影是场景内的一条直线投影到图片上也保持为一条直线。畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(optical aberration),可能是摄像机镜头的原因。

畸变模型:桶形畸变和枕形畸变。

相机中透镜的加入会对光线传播产生影响。透镜自身形状会影响光线传播,这种畸变(distortion,或失真)称为径向畸变;再者,相机组装过程中,镜片平面和 CMOS 不可能绝对平行,这种透镜平面和 CMOS 成像面不平行导致的畸变叫 切向畸变。

如果镜头没有畸变,那么点 P、光心 O、像点 p 应该是共线的。

径向畸变可以理解为像点沿距光心的长度方向发生了变化,切向畸变可以理解为像点沿切向(长度正交方向)发生了变化。一般使用多项式描述这些畸变,
(
x
d
i
s
t
o
r
t
,
y
d
i
s
t
o
r
t
)
(x_{distort}, y_{distort})
(xdistort,ydistort)
来描述畸变后的像点位置

径向畸变


x
d
i
s
t
o
r
t
=
x
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
y
d
i
s
t
o
r
t
=
y
(
1
+
k
1
r
2
+
k
2
r
4
+
k
3
r
6
)
x_{distort}=x(1+k_1r^2 + k_2 r^4 + k_3 r^6) \\ y_{distort} = y(1+k_1 r^2 + k_2 r^4 + k_3 r^6)
xdistort=x(1+k1r2+k2r4+k3r6)ydistort=y(1+k1r2+k2r4+k3r6)

切向畸变


x
d
i
s
t
o
r
t
=
x
+
2
p
1
x
y
+
p
2
(
r
2
+
2
x
2
)
y
d
i
s
t
o
r
t
=
y
+
2
p
2
x
y
+
p
1
(
r
2
+
2
y
2
)
x_{distort}=x+2p_1xy + p_2(r^2 +2x^2) \\ y_{distort} = y + 2p_2xy +p_1(r^2 + 2y^2)
xdistort=x+2p1xy+p2(r2+2x2)ydistort=y+2p2xy+p1(r2+2y2)

像平面(图像坐标系)上畸变后的像点坐标为


x
d
i
s
t
o
r
t
=
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
d
i
s
t
o
r
t
=
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
)
x_{distort}=x(1+k_1r^2 + k_2 r^4 + k_3 r^6)+2p_1xy + p_2(r^2 +2x^2) \\ y_{distort} = y(1+k_1 r^2 + k_2 r^4 + k_3 r^6) + 2p_2xy +p_1(r^2 + 2y^2)
xdistort=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistort=y(1+k1r2+k2r4+k3r6)+2p2xy+p1(r2+2y2)

得到 5 个畸变参数
k
1
,
k
2
,
k
3
,
p
1
,
p
2
k_1, k_2, k_3, p_1, p_2
k1,k2,k3,p1,p2
后便可以对畸变进行建模。实际使用中也可以使用更简单的模型,比如径向畸变只使用二阶(只用
k
1
k_1
k1
)多项式描述。

外参

内参是确定像素坐标系到图像坐标系的四个参数
c
x
,
c
y
,
f
x
,
f
y
c_x,c_y,f_x,f_y
cx,cy,fx,fy

世界坐标系到相机坐标系的变换矩阵
R
,
t
\mathbf{R,t}
R,t
​称为外参。

比如和机器人相关的应用中,一般外参是描述相机坐标系和机器人基坐标系之间的刚体变换。

如果有标定板的话,标定板的尺寸都是已知的。

参考

相机标定究竟在标定什么?–复旦光学博士 许翔翔

Computer Vision: A Modern Approach

发表回复