相机模型是任何标定程序的核心。因此,为了更好地了解影响相机标定的因素,值得深入研究相机模型。
1.针孔模型
相机模型将 3d 中的点与其在相机图像上的投影相关联。到目前为止,最常见的模型是针孔相机模型,它的基本假设是光线通过一个无限小的光圈(针孔)进入相机,如下图所示。
在数学和计算机视觉领域,三维空间中的点通常表示为
Q
=
[
x
,
y
,
z
]
.
Q=[x,y,z] .
Q=[x,y,z]. 它们在相机图像上的对应投影为
q
=
[
u
,
v
,
1
]
.
q=[u,v,1] .
q=[u,v,1].
q
q
q 中的“1”是必需的,因为我们正在处理齐次坐标。两者可以通过针孔模型联系起来:
q
=
[
f
0
c
x
0
f
c
y
0
0
1
]
⋅
Q
q = \begin{bmatrix} f & 0 & c_x \\ 0 & f & c_y \\ 0 & 0 & 1 \end{bmatrix} \cdot Q
q=⎣⎡f000f0cxcy1⎦⎤⋅Q
这个投影基本上做了两件事:它按
f
f
f 缩放坐标,并将它们转换成坐标不是相对于相机中心的,而是有一个位于图像左上角的坐标系。这是在数字图像中索引像素位置的自然方式。
参数 c x , c y c_x,c_y cx,cy被称为主点坐标,因为它们也可以被解释为图像坐标原点,这是在与光轴相交的图像平面。在 m 个相机中,假设 c x , c y c_x, c_y cx,cy 位于精确的图像中心是合理的。然而,镜头可能无法完美地与图像传感器居中,尤其是在智能手机等低成本相机中。在专用相机和镜头(例如 Scheimpflug 镜头或离轴投影镜头)中,光轴故意不与图像中心相交。在这些情况下, c x , c y c_x, c_y cx,cy 需要通过标定来确定。
参数 f f f 是焦距,它取决于所使用的相机镜头和传感器。大/长焦距的比例很大,可以解释为大“变焦”,而微距镜头的焦距小/短。 f f f 的单位必须与 q q q 和 Q Q Q 的单位兼容。因此,如果 3d 点 Q Q Q 以米为单位, q q q 以像素(或 px)为单位,则 f f f 的单位为 p x / m px/m px/m。请注意,在实际应用中, Q Q Q 最常以 m m m 或 m m mm mm 表示,而 q q q 几乎总是以 p x px px 表示。然而,重要的是要记住原点的位置。
2.扩展针孔模型
通过实验,为了适应不能用简单针孔模型很好描述的相机和镜头,一个通用的扩展有以下参数:
q
=
[
f
x
α
f
x
c
x
0
f
y
c
y
0
0
1
]
⋅
Q
q = \begin{bmatrix} f_x & \alpha f_x & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} \cdot Q
q=⎣⎡fx00αfxfy0cxcy1⎦⎤⋅Q
确切的表述因作者而异。然而,需要注意的重要一点是,通过引入 f x f_x fx 和 f y f_y fy 而不是一个常见的 f f f,我们允许相机在 x x x 和 y y y 方向上进行不同的缩放。比率 f x / f y f_x/f_y fx/fy 有时称为 纵横比。这可能是由于非方形像素(在一些模拟相机的数字化标准中可见,例如 480i 或 576i),或一些奇特的各向异性相机镜头。根据正在标定的相机的质量不同,包括 f x f_x fx 和 f y f_y fy 可能仍然是合理的。幸运的是,这两个参数都可以在相机标定中非常稳健和重复地确定,因此,对两者进行标定通常不会造成太大问题。
另一方面, α \alpha α 表示模型在相机中倾斜,这在现代设备的实践中很少被证明是合理的。它允许传感器的 x 轴和 y 轴不完全垂直。在几乎所有现代应用程序中,该参数都应从相机模型和标定中排除,除非存在充分理由将其包含在内,否则,它会使标定不那么稳健。
3.镜头失真
针孔模型仅适用于具有无限小的入瞳(或光圈)的相机。实际上,这种相机当然不存在,因为它们不允许任何光线进入。因此,通常需要一个透镜系统将入射光线聚焦到图像传感器上。在这样做时,会引入一定程度的镜头失真 。这通常在广角微距镜头(有时称为鱼眼镜头)中比在长焦距镜头中更明显,因为即使制造商尽力避免,构建低失真的广角镜头也更加困难.
4.径向失真效应
一组透镜畸变效应具有径向对称性,意思是在与主点的一定距离处,畸变量是恒定的。当镜头向内变形时,这被称为桶形畸变。相反,当它向外扭曲时,则称为枕形畸变。两者的混合称为胡须畸变。
桶形畸变(左)、枕形畸变(中)和胡须畸变(右)
由于径向对称,变量
r
r
r 的单个函数足以描述失真效果。使用
u
,
v
u,v
u,v作为图像坐标,
c
x
,
c
y
c_x,c_y
cx,cy作为主点坐标,我们可以定义
r
r
r:
r ( u , v ) = ( u − c x ) 2 + ( v − c y ) 2 , r(u,v) = \sqrt{(u-c_x)^2 + (v-c_y)^2} , r(u,v)=(u−cx)2+(v−cy)2,
即 r ( u , v ) r(u,v) r(u,v) 表示到图像中心的距离。
文献中已经提出了不同的适用于径向透镜畸变效应的参数函数。一个被广泛接受的模型是 Brown的偶序径向模型:
q corrected = ( 1 + k 1 r 2 + k 2 r 4 + k 5 r 6 ) ⋅ q . q_{\text{corrected}} = (1 + k_1 r^2 + k_2 r^4 + k_5 r^6) \cdot q . qcorrected=(1+k1r2+k2r4+k5r6)⋅q.
在这个模型中,使用了三个参数 ( k 1 , k 2 , k 5 ) (k_1, k_2, k_5) (k1,k2,k5)。它们是多项式系数,允许存在平滑变化的失真,可以是严格负值(桶形失真)、严格正值(枕形失真)或两者兼有(胡须失真)。请注意,由于函数的域始终为正( r ∈ [ 0 ; r max ] r \in [0; r_{\text{max}}] r∈[0;rmax]),因此只需要包含偶数多项式阶数。
5.切向失真效应
一个不容易用径向畸变模型解释的效应是切向或 薄棱镜畸变,这可能是由于偏心,即不同的镜头元件没有完全对齐,或者因为光轴不完全垂直于传感器平面。Brown 还提出了一个有用的模型,该模型已被证明可以很好地拟合像素失真:
q corrected = [ 2 k 3 x y + k 4 ( r 2 + 2 x 2 ) k 3 ( r 2 + 2 ∗ y 2 ) + 2 k 4 x y ] ⋅ q . q_{\text{corrected}} = \begin{bmatrix} 2 k_3 xy + k_4 (r^2+2x^2) \\ k_3 (r^2 + 2*y^2) + 2 k_4 xy \end {bmatrix} \cdot q . qcorrected=[2k3xy+k4(r2+2x2)k3(r2+2∗y2)+2k4xy]⋅q.
上述径向模型和切向模型的组合有时称为铅锤模型或 布朗康拉迪模型。
对于高质量的镜头和相机,通常不需要在相机模型中包含切向失真参数。就像中心点坐标和径向畸变参数一样,通常需要大量分布良好的标定图像来精确地确定这些参数,并具有良好的重复性。因此,不包括它们通常会有更好地效果,特别是如果相机和镜头质量足够好的话。
6.附录:关于齐次坐标
在 3d 空间或 2d 平面上表示点的常用方法是分别使用 3-vectors 和 2-vectors。然而,对于某些目的,使用齐次坐标代替它是非常有用的,其中引入了一个额外的坐标。
例如,一个二维图像点可以表示为 q inhom = [ u , v ] q_{\text{inhom}}=[u,v] qinhom=[u,v]。在齐次坐标中,我们写 q hom = s ⋅ [ u , v , 1 ] q_{\text{hom}}=s \cdot [u,v,1] qhom=s⋅[u,v,1],并有 s s s 作为自由比例参数。 s s s 的任何选择都代表相同的二维点。但是,我们不能允许 s s s 为 0 或无穷大。
现在想象一个坐标变换,包括按因子 α \alpha α 缩放和用向量 [ t x , t y ] [t_x, t_y] [tx,ty] 平移。它可以应用于 q inhom q_{\text{inhom}} qinhom 如下:
q ^ inhom = [ u v ] = [ α 0 0 α ] q inhom + [ t x t y ] \hat{q}_{\text{inhom}} = \begin{bmatrix} u \\ v \end{bmatrix} = \begin{bmatrix} \alpha & 0 \\ 0 & \alpha \end {bmatrix} q_{\text{inhom}} + \begin{bmatrix} t_x \\ t_y \end{bmatrix} q^inhom=[uv]=[α00α]qinhom+[txty]
这确实工作得很好,但是,转换不是线性的(它不能表示为单个矩阵向量乘积)。然而,对于许多推导,如果这种变换确实可以表示为单个矩阵向量运算,那么它会大大简化数学运算。使用同构版本的 q q q,我们可以执行以下操作:
q ^ hom = s [ u v 1 ] = [ α 0 t x 0 α t y 0 0 1 ] q hom \hat{q}_{\text{hom}} = s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix} = \begin{bmatrix} \alpha & 0 & t_x \\ 0 & \alpha & t_y \\ 0 & 0 & 1 \end{bmatrix} q_{\text{hom}} q^hom=s⎣⎡uv1⎦⎤=⎣⎡α000α0txty1⎦⎤qhom
也就是说:现在变换(在这种情况下是投影)被表示为线性变换。为了将 q ^ hom \hat{q}_{\text{hom}} q^hom 转换为 q ^ inhom \hat{q}_{\text{inhom}} q^inhom,我们可以很容易地解释,我们只需将前两个组件除以 q ^ inhom \hat{q} _{\text{inhom}} q^inhom 与第三个(这是任意比例因子 s s s)。
这个技巧允许以更简单的方式表达许多几何公式。此外,对齐次 2d 坐标有一个有用的解释:我们知道相机图像中的任何点都对应于 3d 空间中特定线上的某个点。二维线的齐次坐标正是空间中这条线的参数化。改变 s s s,我们沿着这条线移动。设置 s = 1 s = 1 s=1,我们与图像平面相交,得到我们通常感兴趣的2d点坐标。