omnidirectional camera(广角相机):在一个水平面有360°视野的相机,或视野能覆盖半个球或近似整个球的相机。
面镜(mirror)与透镜(lens)的区别:
广角相机成像步骤与普通相机基本一致,主要的区别在于镜头聚光的部分,广角相机为了获得更大的FOV,有三种镜头聚光方式:
设 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)!)
Term | Description |
---|---|
COD | 畸变中心(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) |
PP | 主点(Principle Point) - 透镜光轴与传感器表面的交点 |
LPP | 透镜主平面(Lens Primary Plane) |
世界坐标系中三维点 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对应的齐次坐标系。
相机将三维世界中的坐标点(unit: m) 映射到二维图像平面(unit: pixel) 的过程能够用一个几何模型来描述,其中最简单的称为针孔相机模型 (pinhole camera model)
。
[ 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⎦⎥⎥⎤
根据三角形相似关系,有:
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
其中,
最终,写成矩阵的形式为:
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
从另一个角度看,我们可以把一个世界坐标点先转换到相机坐标系,再除掉它最后一维的数值(即该点距离相机成像平面的深度),这相当于把最后一维进行归一化处理,得到点 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 看成对归一化平面上的点进行量化测量的结果。从这个模型中也可以看出,如果对相机坐标同时乘以任意非零常数,归一化坐标都是一样的,这说明点的深度在投影过程中被丢失了,所以单目视觉中没法得到像素点的深度值。
内参标定(Intrinsic Camera Calibration)
是找到一个相机的物理参数的过程。标定结果是一个相机内参集合。
普通相机畸变通常包括径向畸变和切向畸变。如下图所示
切向畸变表达式沿半径方向的偏移量,径向畸变的形成原因是镜头制造工艺不完美,使得镜头形状存在缺陷,通常又分为桶性畸变和枕形畸变,分别代表 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是畸变后点的归一化坐标。
真实的摄像头使用的并不是针孔,它们使用的是能一次性聚焦大量光线的镜头,这使得其能迅速生成图像,但是,镜头仍会产生失真,光线通常会在摄像机镜头的边缘出现较大或较小幅度的弯曲,这会产生图像边缘扭曲的效果,因此,线条或者物体会比真实情况呈现出或多或少的弯曲。这种失真被称为径向畸变,是最常见的失真类型。
实际情况中我们常用 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)
切向畸变
是由于透镜和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
图像传感器图像原尺寸在制造过程可能不是正方形,同时可能存在歪斜(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
将图像中的每个位置,在畸变后的位置找出。
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;
}
}
以下为 COD 和 PP 误差示意图:
(注意COD图片上两点在透镜中心相交,而PP的理论上垂直于传感器表面。也就是说在透镜装歪了的时候,COD本身也会跟着歪过来,但是PP理论上是垂直的,可能因为标定误差的原因导致它偏离了原位置)
有些情况下 PP 和 COD 是相似的,有些情况下它们可能是不同的。这主要取决于 相机构造质量 还有 相机透镜和传感器之间的对齐精度(见下面的一个例子展示了切向失真,这会导致 PP 和 COD 不同):
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)
Parameter | Description | Example |
---|---|---|
camK | 最前面的两个参数对应于焦距 x 和焦距 y(像素单位,原始图像)。在大多数情况下,焦距 x 和 y 是相同的,因为传感器像素通常是正方形而不仅仅是矩形。 第三个参数为 skew,通常使用的 skew=0。非零值意味着像素是一个平行四边形,而不是一个完美的矩形/正方形。 第四和第五个参数是主点的坐标PPx和PPy(像素单位,原始图像) |
camK = 2612.70312 2612.70312 0 671.287598 277.750671 |
DM | 第一个参数为模型类型。这里 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 |
一个视觉系统是 central 的话,那么被观测物体的所有入射光线汇交于 3 D 3D 3D 空间的一个点,这个点称为映射中心 (projection center)
或单一有效视野点 (single effective viewpoint)
。这个特性被称为单一有效视点特性。透视相机是中心投影系统的一个例子,因为不同的光线相交于一点,即相机的光学中心。
所有的现代鱼眼摄像机都是 central 的,因此,它们满足单一有效视点特性(只是说满足单一有效视点特性,注意不是说现代鱼眼相机是通过镜面反射的-----即满足单一有效视点特性,就可以拟合类似的模型)。Central catadioptric cameras 由一个相机加上一个面镜所组成(如图,相机为底下成像平面,面镜为上面反射的mirror),相机和面镜的距离需要选择合适。面镜的家族里,能满足单一有效视野点特性的有 hyperbolic, parabolic, and elliptica 面镜。
直观上,有单一有效视点的折射反射模型相比标准透视相机会复杂一些。这个模型确实应该考虑到在折反射照相机的情况下由面镜操作带来的反射,或者在鱼眼照相机的情况下由透镜引起的折射。
Geyer和Daniilidis证明,每个折射反射的(parabolic, hyperbolic, elliptical) 和标准透视投影相当于从一个集中在单一视点的球体投影映射,到一个与球心垂直距离为 ϵ \epsilon ϵ (同后面的 ξ \xi ξ) 的投影平面。(MEI模型理论)
投影模型有四个步骤。令 P = ( x , y , z ) P=(x,y,z) P=(x,y,z) 为在面镜参考坐标系下以 C C C 为中心点的场景点。为方便起见,我们假设面镜的对称轴与相机的光轴完全对齐。我们还假设相机和面镜的 x x x 轴和 y y y 轴是对齐的。因此,摄像机和面镜参考系之间的差异仅在于沿 z z z 轴的平移。
将场景点投影在单位球体上,得到:
P s = P ∥ P ∥ = ( x s , y s , z s ) P_{s}=\frac{P}{\|P\|}=\left(x_{s}, y_{s}, z_{s}\right) Ps=∥P∥P=(xs,ys,zs)
点坐标被改变为一个新的以 C ϵ = ( 0 , 0 , − ϵ ) C_{\epsilon}=(0,0,-\epsilon) Cϵ=(0,0,−ϵ) 为中心的参考系,因此:
P ϵ = ( x s , y s , z s + ϵ ) P_{\epsilon}=\left(x_{s}, y_{s}, z_{s}+\epsilon\right) Pϵ=(xs,ys,zs+ϵ)
ϵ \epsilon ϵ 的范围通常在0 (planar mirror) 和 1 (parabolic mirror)之间。正确的 ϵ \epsilon ϵ 的值可以通过 d:distance between focal points 和 l:the latus rectum 得到。
P ϵ P_{\epsilon} Pϵ 之后被映射到了与 C ϵ C_{\epsilon} Cϵ 距离为 1 1 1 的归一化平面(同针孔模型归一化坐标),因此:
m ~ = ( x m , y m , 1 ) = ( x s z s + ϵ , y s z s + ϵ , 1 ) = g − 1 ( P s ) \tilde{m}=\left(x_{m}, y_{m}, 1\right)=\left(\frac{x_{s}}{z_{s}+\epsilon}, \frac{y_{s}}{z_{s}+\epsilon}, 1\right)=g^{-1}\left(P_{s}\right) m~=(xm,ym,1)=(zs+ϵxs,zs+ϵys,1)=g−1(Ps)
最后,将点 m ~ \tilde{m} m~ 映射到相机图像点 p ~ = ( u , v , 1 ) \tilde{p}=(u, v, 1) p~=(u,v,1),通过内参矩阵 K K K,因此:
p ~ = K m ~ \tilde{p}=K \tilde{m} p~=Km~
其中 K K K为( θ \theta θ 为倾角,一般为 0):
K = [ α u α u cot ( θ ) u 0 0 α v v 0 0 0 1 ] K=\left[\begin{array}{ccc} \alpha_{u} & \alpha_{u} \cot (\theta) & u_{0} \\ 0 & \alpha_{v} & v_{0} \\ 0 & 0 & 1 \end{array}\right] K=⎣⎡αu00αucot(θ)αv0u0v01⎦⎤
很容易证明 g − 1 g^{-1} g−1 是双射的 (正反向一一对应),它的逆 g g g 为:
P s = g ( m ) ∝ [ x m y m 1 − ϵ x m 2 + y m 2 + 1 ϵ + 1 + ( 1 − ϵ 2 ) ( x m 2 + y m 2 ) ] P_{s}=g(m) \propto\left[\begin{array}{c} x_{m} \\ y_{m} \\ 1-\epsilon \frac{x_{m}^{2}+y_{m}^{2}+1}{\epsilon+\sqrt{1+\left(1-\epsilon^{2}\right)\left(x_{m}^{2}+y_{m}^{2}\right)}} \end{array}\right] Ps=g(m)∝⎣⎢⎡xmym1−ϵϵ+1+(1−ϵ2)(xm2+ym2)xm2+ym2+1⎦⎥⎤
∝ \propto ∝表明 g g g 与右边的式子成正比。要得到归一化因子,只要在单位球体上归一化 g ( m ) g(m) g(m) 就足够了。因为 P s P_s Ps 在单位圆上,因此 x s 2 + y s 2 + z s 2 = 1 x_{s}^{2}+y_{s}^{2}+z_{s}^{2}=1 xs2+ys2+zs2=1。推导过程可见 Section 3.4。
这个函数是 central cata-dioptric cameras 投影模型的核心。它表示了归一化图像平面上的点 m m m 与面镜参考系中单位向量 P s P_s Ps 的关系。注意在平面面镜的情况下,我们有 ϵ = 0 \epsilon = 0 ϵ=0,透视相机的投影方程为: P s ∝ ( x m , y m , 1 ) P_{s} \propto\left(x_{m}, y_{m}, 1\right) Ps∝(xm,ym,1)。
这个模型被证明可以准确描述所有的 central catadioptric cameras (parabolic, hyperbolic, elliptical mirror) 和标准透视相机。这种模型有对鱼眼的扩展,然而,通过折射光近似的鱼眼相机只能在有限的精度上有效。这主要是因为,虽然三种central catadioptric cameras 可以通过精确的参数函数(抛物线、双曲线、椭圆)来表示,但鱼眼镜头的投影模型因相机而异,并取决于镜头的视场。
全向模型利用面镜(mirror)反射进行成像的相机使用的模型。该模型带有一个参数 ξ \xi ξ.
首先将相机坐标系的点归一化到半径为1的球面上:
( x s y s z s ) = 1 x c 2 + y c 2 + z c 2 ( x c y c z c ) \left(\begin{array}{l} x_{s} \\ y_{s} \\ z_{s} \end{array}\right)=\frac{1}{\sqrt{x_{c}^{2}+y_{c}^{2}+z_{c}^{2}}}\left(\begin{array}{l} x_{c} \\ y_{c} \\ z_{c} \end{array}\right) ⎝⎛xsyszs⎠⎞=xc2+yc2+zc21⎝⎛xcyczc⎠⎞
然后再投影到图像平面上:
x u = x s z s + ξ , y u = y s z s + ξ x_{u}=\frac{x_{s}}{z_{s}+\xi}, \quad y_{u}=\frac{y_{s}}{z_{s}+\xi} xu=zs+ξxs,yu=zs+ξys
其逆变换推导出来如下:
x s 2 + y s 2 + z s 2 = 1 ⇒ x u 2 ( z s + ξ ) 2 + y u 2 ( z s + ξ ) 2 + z s 2 = 1 ⇒ ( x u 2 + y u 2 + 1 ) z s 2 + 2 ξ ( x u 2 + y u 2 ) z s + x u 2 ξ 2 + y u 2 ξ 2 − 1 = 0 ⇒ [ x s y s z s ] = [ ξ + 1 + ( 1 − ξ 2 ) ( x u 2 + y u 2 ) x u 2 + y u 2 + 1 x u ξ + 1 + ( 1 − ξ 2 ) ( x u 2 + y u 2 ) x u 2 + y u 2 + 1 y u ξ + 1 + ( 1 − ξ 2 ) ( x u 2 + y u 2 ) x u 2 + y u 2 + 1 − ξ ] \begin{array}{c} \sqrt{x_{s}^{2}+y_{s}^{2}+z_{s}^{2}}=1 \\ \Rightarrow x_{u}^{2}\left(z_{s}+\xi\right)^{2}+y_{u}^{2}\left(z_{s}+\xi\right)^{2}+z_{s}^{2}=1 \\ \Rightarrow\left(x_{u}^{2}+y_{u}^{2}+1\right) z_{s}^{2}+2 \xi\left(x_{u}^{2}+y_{u}^{2}\right) z_{s}+x_{u}^{2} \xi^{2}+y_{u}^{2} \xi^{2}-1=0 \end{array}\\ \Rightarrow\left[\begin{array}{l} x_{s} \\ y_{s} \\ z_{s} \end{array}\right]=\left[\begin{array}{c} \frac{\xi+\sqrt{1+\left(1-\xi^{2}\right)\left(x_{u}^{2}+y_{u}^{2}\right)}}{x_{u}^{2}+y_{u}^{2}+1} x_{u} \\ \frac{\xi+\sqrt{1+\left(1-\xi^{2}\right)\left(x_{u}^{2}+y_{u}^{2}\right)}}{x_{u}^{2}+y_{u}^{2}+1} y_{u} \\ \frac{\xi+\sqrt{1+\left(1-\xi^{2}\right)\left(x_{u}^{2}+y_{u}^{2}\right)}}{x_{u}^{2}+y_{u}^{2}+1}-\xi \end{array}\right] xs2+ys2+zs2=1⇒xu2(zs+ξ)2+yu2(zs+ξ)2+zs2=1⇒(xu2+yu2+1)zs2+2ξ(xu2+yu2)zs+xu2ξ2+yu2ξ2−1=0⇒⎣⎡xsyszs⎦⎤=⎣⎢⎢⎢⎡xu2+yu2+1ξ+1+(1−ξ2)(xu2+yu2)xuxu2+yu2+1ξ+1+(1−ξ2)(xu2+yu2)yuxu2+yu2+1ξ+1+(1−ξ2)(xu2+yu2)−ξ⎦⎥⎥⎥⎤
最后,注意当 ξ = 0 \xi=0 ξ=0 时,全向模型就退化为了针孔模型。
相应的得到归一化平面坐标为:
[ x s z s − ξ y s z s − ξ z s z s + ξ ] = [ x u y u 1 − ξ x u 2 + y u 2 + 1 ξ + 1 + ( 1 − ξ 2 ) ( x u 2 + y u 2 ) ] \left[\begin{array}{c} \frac{x_{s}}{z_{s}-\xi} \\ \frac{y_{s}}{z_{s}-\xi} \\ \frac{z_{s}}{z_{s}+\xi} \end{array}\right]=\left[\begin{array}{c} x_u \\ y_u \\ 1-\xi \frac{x_u^{2}+y_u^{2}+1}{\xi+\sqrt{1+\left(1-\xi^{2}\right)\left(x_u^{2}+y_u^{2}\right)}} \end{array}\right] ⎣⎡zs−ξxszs−ξyszs+ξzs⎦⎤=⎣⎢⎡xuyu1−ξξ+1+(1−ξ2)(xu2+yu2)xu2+yu2+1⎦⎥⎤
由于鱼眼镜头会产生极大的形变,因此针孔模型无法为鱼眼镜头建模。鱼眼镜头一般是由十几个不同的透镜组合而成的,在成像的过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比起来拥有了更大的视野范围。下图表示出了鱼眼相机的一般组成结构。最前面的两个镜头发生折射,使入射角减小,其余的镜头相当于一个成像镜头,这种多元件的构造结构使对鱼眼相机的折射关系的分析变得相当复杂。
研究表明鱼眼相机成像时遵循的模型可以近似为单位球面投影模型。可以将鱼眼相机的成像过程分解成两步:
我们知道,普通相机成像遵循的是针孔相机模型,在成像过程中实际场景中的直线仍被投影为图像平面上的直线。但是鱼眼相机如果按照针孔相机模型成像的话,投影图像会变得非常大,当相机视场角达到180°时,图像甚至会变为无穷大。所以,鱼眼相机的投影模型为了将尽可能大的场景投影到有限的图像平面内,允许了相机畸变的存在。并且由于鱼眼相机的径向畸变非常严重,所以鱼眼相机主要的是考虑径向畸变,而忽略其余类型的畸变。
为了将尽可能大的场景投影到有限的图像平面内,鱼眼相机会按照一定的投影函数来设计。根据投影函数的不同,鱼眼相机的设计模型大致能被分为四种:等距投影模型
、等立体角投影模型
、正交投影模型
和体视投影模型
(简单的说,就是把球面上的点一一映射到平面的方法)。下面的四种鱼眼相机的投影模型反映出了空间中的一点 P P P 是如何投影到球面上,然后到图像平面上成像的。
公式: r d = f θ r_d = f\theta rd=fθ (距离与 θ \theta θ 成正相关,在 θ \theta θ 足够小时,可以近似看成是与弧长正相关)
该模型是使用最多的模型,上述式子中, r d r_d rd 表示鱼眼图像中的点到畸变中心(画面中心)的距离, f f f是鱼眼相机的焦距, θ \theta θ是入射光线与鱼眼相机光轴之间的夹角,即入射角。
这种投影方式的特点是,物体在成像平面上离开画面中心的距离,与物体在空间中离开光轴的角度成正比,这个比例系数就是镜头焦距。在这种投影变换下,物体离开中心的距离(角度)就是一个重要的几何性质,物体的空间角距离与物体的像在像平面上的平面距离,是成正比的。这也是这个投影方式名称的来源。在下图的模拟场景中,中间一列的各个小方格的高度都是一样的:
公式: r d = 2 f s i n ( θ 2 ) r_d = 2fsin(\frac{\theta}{2}) rd=2fsin(2θ)
这种投影方式的特征在于,能保持变换前后,物体所占的立体角大小不变。或者说,在半球空间中,半球面上两个面积相同的图案,成像后,在成像平面上的两个图案的面积仍然相同(虽然两者形状不一定相似)。这正式这个投影方式名字的由来。在下图的模拟场景中,圆筒壁上每一列的各个小方格的面积都是相等的:
公式: r d = 2 f t a n ( θ 2 ) r_d = 2ftan(\frac{\theta}{2}) rd=2ftan(2θ)
这种投影方式的特点是能保持角度不变,这在数学上是一个非常良好的性质,叫做保角变换(Conform)。保持角度不变,意思是任何直线相交的角度,在变换之后是保持不变的(虽然直线本身可能变弯曲)。在保角变换下,一个圆仍然还是一个圆(直线可以看做直径无穷大的圆)。所以在某种程度上,保角变换也是保持了「形状」不变的。在下面的模拟场景中,圆筒壁上的所有边界线,全部都变成了圆弧;所有线的交角,也都保持了 90° 不变:
公式: r d = f s i n ( θ ) r_d = fsin(\theta) rd=fsin(θ)
这种投影方式,就像是把整个半球直接拍扁,用公式表达就是 r=sin(θ)。在几种投影方式中,这种投影方式带来的扭曲最大,对边缘物体压缩最厉害,实际很少使用。很显然,这种投影方式的最大视场角也不能大于 180°:
对于实际的鱼眼镜头来说,它们不可能精确地按照 4.1 中所述投影模型来设计,所以为了方便鱼眼相机的标定,Kannala 提出了一种鱼眼相机的一般多项式近似模型。通过前面的四个模型,可以发现 r d r_d rd 是 θ \theta θ 的奇函数,而且将这些式子按泰勒级数展开,发现 r d r_d rd 可以用 θ \theta θ 的奇次多项式表示,即:
r d = k 0 θ + k 1 θ 3 + k 2 θ 5 + k 3 θ 7 + ⋯ r_{d}=k_{0} \theta+k_{1} \theta^{3}+k_{2} \theta^{5}+k_{3} \theta^{7}+\cdots rd=k0θ+k1θ3+k2θ5+k3θ7+⋯
为了实际计算的方便,需要确定式中 r d r_d rd 取到的次幂数。Kannala 提出取式的前五项即取到的九次方,就给出了足够的自由度来很好地近似各种投影模型。 r d r_d rd 的一次项系数可以为 1 1 1,于是 OpenCV 中使用的鱼眼相机模型为:
r d = k 0 θ + k 1 θ 3 + k 2 θ 5 + k 3 θ 7 + k 4 θ 9 r_{d}=k_{0} \theta+k_{1} \theta^{3}+k_{2} \theta^{5}+k_{3} \theta^{7}+k_{4} \theta^{9} rd=k0θ+k1θ3+k2θ5+k3θ7+k4θ9
上式表示的模型是根据四种鱼眼相机投影模型得出的一种通用鱼眼相机多项式模型。这种模型根据 θ \theta θ 能够得到 r d r_d rd,即通过无畸变图像中的点能够计算出鱼眼图像中的畸变点。这种模型在 OpenCV 的鱼眼相机标定方法中是适用的,因为 OpenCV 借助标定板对鱼眼相机进行标定。从空间点到鱼眼图像上的点的变换过程可用式子表示为:
[ X c Y c Z c ] = R X + t x c = X c Z c , y c = Y c Z c r 2 = x c 2 + y c 2 θ = arctan ( r ) θ d = k 0 θ + k 1 θ 3 + k 2 θ 5 + k 3 θ 7 + k 4 θ 9 x d = θ d r x c , y d = θ d r y c u = f x x d + c x , v = f y y d + c y \begin{array}{c} {\left[\begin{array}{c} X_{c} \\ Y_{c} \\ Z_{c} \end{array}\right]=R X+t} \\ x_{c}=\frac{X_{c}}{Z_{c}}, y_{c}=\frac{Y_{c}}{Z_{c}} \\ r^{2}=x_{c}^{2}+y_{c}^{2} \\ \theta=\arctan (r) \\ \theta_{d}=k_{0} \theta+k_{1} \theta^{3}+k_{2} \theta^{5}+k_{3} \theta^{7}+k_{4} \theta^{9} \\ x_{d}=\frac{\theta_{d}}{r} x_{c}, y_{d}=\frac{\theta_{d}}{r} y_{c} \\ u=f_{x} x_{d}+c_{x}, v=f_{y} y_{d}+c_{y} \end{array} ⎣⎡XcYcZc⎦⎤=RX+txc=ZcXc,yc=ZcYcr2=xc2+yc2θ=arctan(r)θd=k0θ+k1θ3+k2θ5+k3θ7+k4θ9xd=rθdxc,yd=rθdycu=fxxd+cx,v=fyyd+cy
θ \theta θ 是入射角, θ d \theta_d θd 为畸变后的等效折射角(不是实际的折射角), r d r_d rd 和 θ d \theta_d θd 满足 r d = f ⋅ t a n θ d r_d=f\cdot tan\theta_d rd=f⋅tanθd,如果取等效焦距 f = 1 f=1 f=1(这里不是实际焦距,而是球面到成像平面使用的距离),就有 r d = t a n θ d r_d = tan\theta_d rd=tanθd,考虑到相机的成像CCD平面尺寸一般都是几毫米,焦距在几百毫米左右,所以相机实际成像过程中 θ d \theta_d θd 是比较小的, θ d \theta_d θd 可以近似用 θ d \theta_d θd 表示( x → 0 x\rightarrow0 x→0 , t a n x = x tanx=x tanx=x),所以才有了等式:
r d = θ d = θ ( 1 + k 1 θ 2 + k 2 θ 4 + k 3 θ 6 + k 4 θ 8 ) \mathrm{r}_{\mathrm{d}}=\theta_{\mathrm{d}}=\theta\left(1+\mathrm{k}_1 \theta^2+\mathrm{k}_2 \theta^4+\mathrm{k}_3 \theta^6+\mathrm{k}_4 \theta^8\right) rd=θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ8)
根据相似三角形定理可得(鱼眼镜头的成像原理到畸变矫正(完整版)):
r d r = x d x c = y d y c , x d = θ d r x c , y d = θ d r y c \frac{r_d}{r} = \frac{x_d}{x_c} = \frac{y_d}{y_c},x_d=\frac{\theta_d}{r}x_c, y_d=\frac{\theta_d}{r}y_c rrd=xcxd=ycyd,xd=rθdxc,yd=rθdyc
上面式子中, X X X表示空间点, X c X_c Xc表示相机坐标系下对应的空间点, R R R 和 t t t 分别是两个坐标系之间的旋转矩阵和平移向量, ( u , v ) T (u,v)^T (u,v)T 表示投影到鱼眼图像上的对应点。OpenCV中对鱼眼相机的标定步骤能够分成四步:(1)初始化内参数;(2)初始化外参数;(3)使用LM算法最小化定位的图像点和投影的图像点之间的投影误差;(4)确定结果。
该相机模型有5个参数 [ f x , f y , c x , c y , ξ ] \left[f_{x}, f_{y}, c_{x}, c_{y}, \xi\right] [fx,fy,cx,cy,ξ],它刚开始是针对于大FOV的鱼眼相机提出的,并且有两个优点:
3D点首先被投影到单位球上,之后单位球上的点在以偏离z轴 ξ \xi ξ 大小为中心的通过针孔模型进行投影,投影的过程可以通过下图进行表示。
假设相机坐标系下的点为 ( x , y , x ) (x,y,x) (x,y,x) ,像素坐标为 ( u , v ) (u,v) (u,v), d = x 2 + y 2 + z 2 d=\sqrt{x^{2}+y^{2}+z^{2}} d=x2+y2+z2 那么它的投影过程为:
首先通过针孔相机的反投影过程得到:
[ u ~ v ~ ] = [ ( u − c x ) / f x ( v − c x ) / f y ] \left[\begin{array}{l} \tilde{u} \\ \tilde{v} \end{array}\right]=\left[\begin{array}{l} \left(u-c_{x}\right) / f_{x} \\ \left(v-c_{x}\right) / f_{y} \end{array}\right] [u~v~]=[(u−cx)/fx(v−cx)/fy]
最后得到的反投影坐标为:
π u − 1 ( u ) = ξ + ( 1 − ξ 2 ) ( u ~ 2 + v ~ 2 ) u ~ 2 + v ~ 2 + 1 [ u ~ v ~ 1 ] − [ 0 0 ξ ] \pi_{u}^{-1}(\mathbf{u})=\frac{\xi+\sqrt{\left(1-\xi^{2}\right)\left(\tilde{u}^{2}+\tilde{v}^{2}\right)}}{\tilde{u}^{2}+\tilde{v}^{2}+1}\left[\begin{array}{l} \tilde{u} \\ \tilde{v} \\ 1 \end{array}\right]-\left[\begin{array}{l} 0 \\ 0 \\ \xi \end{array}\right] πu−1(u)=u~2+v~2+1ξ+(1−ξ2)(u~2+v~2)⎣⎡u~v~1⎦⎤−⎣⎡00ξ⎦⎤
将其乘以深度就得到了相机坐标系的点。
在鱼眼DSO(Omnidirectional DSO: Direct Sparse Odometry)
中,为了补偿透镜缺陷,对原始图像进行了径向切向去畸变,之后才使用该相机模型。所以在这里发现自己对相机模型和畸变模型一直存在混淆,相机模型应该是投影方式的不同,而去畸变是为了矫正相机透镜缺陷带来的问题,两者其实是独立的。
由于UCM是将三维点先投影在球面上,而为了表征更复杂的投影效果,EUCM在投影时将上面的球面升级为椭球面,增加了一个椭圆参数 β \beta β,其他投影折射过程和UCM一致。当 β \beta β为1时,EUCM退化为UCM。对于EUCM模型来说,它需要标定六个参数 [ f x , f y , c x , c y , α , β ] [f x, f y, c x, c y, \alpha, \beta] [fx,fy,cx,cy,α,β],其中前四个是相机的内参,后两个是畸变系数,可以通过使用kalibr工具进行标定。
有了这6个参数,就可以计算图像的坐标了,它的模型如下,其中 z z z 为光轴:
根据上面的坐标、内参和畸变系数可以得到他们之间的关系。
相机坐标到像素坐标: x → q → u \mathbf{x}\rightarrow \mathbf{q} \rightarrow \mathbf{u} x→q→u
相机坐标 → \rightarrow →归一化平面坐标 → \rightarrow →像素坐标
q = [ x / [ α ρ + ( 1 − α ) z ] y / [ α ρ + ( 1 − α ) z ] 1 ] \mathbf{q}=\left[\begin{array}{c}x /[\alpha \rho+(1-\alpha) z] \\ y /[\alpha \rho+(1-\alpha) z] \\ 1\end{array}\right] q=⎣⎡x/[αρ+(1−α)z]y/[αρ+(1−α)z]1⎦⎤
其中 ρ = β ( x 2 + y 2 ) + z 2 \rho=\sqrt{\beta\left(x^{2}+y^{2}\right)+z^{2}} ρ=β(x2+y2)+z2:x, y, z 都是相机坐标系下的坐标。相较于普通的针孔模型,它的归一化坐标多了一个系数, α \alpha α和 β \beta β都是畸变系数。
有了归一化平面坐标后,就可以使用内参进行投影了:
π ( x ) = u = [ f x 0 0 f y ] [ x / [ α ρ + ( 1 − α ) z ] y / [ α ρ + ( 1 − α ) z ] ] + [ c x c y ] \pi(\mathbf{x})=\mathbf{u}=\left[\begin{array}{cc}f_{x} & 0 \\ 0 & f_{y}\end{array}\right]\left[\begin{array}{l}x /[\alpha \rho+(1-\alpha) z] \\ y /[\alpha \rho+(1-\alpha) z]\end{array}\right]+\left[\begin{array}{c}c_{x} \\ c_{y}\end{array}\right] π(x)=u=[fx00fy][x/[αρ+(1−α)z]y/[αρ+(1−α)z]]+[cxcy]
在实际情况中,从图像中得到特征点,这是他的像素坐标,如何准确的恢复到世界坐标系中也是很重要的,畸变的影响会导致它最后反投影的点的结果不准确。
该坐标可以通过像素坐标进行转换,假设椭球面坐标 x p = [ m x m y m z ] T \mathbf{x}_{p}=\left[\begin{array}{lll}m_{x} & m_{y} & m_{z}\end{array}\right]^{T} xp=[mxmymz]T,那么它的值为:
m x = u − c x f x m y = v − c y f y m z = 1 − β α 2 r 2 α 1 − ( 2 α − 1 ) β r 2 + ( 1 − α ) \begin{array}{c} m_{x}=\frac{u-c_{x}}{f_{x}} \\ m_{y}=\frac{v-c_{y}}{f_{y}} \\ m_{z}=\frac{1-\beta \alpha^{2} r^{2}}{\alpha \sqrt{1-(2 \alpha-1) \beta r^{2}}+(1-\alpha)} \end{array} mx=fxu−cxmy=fyv−cymz=α1−(2α−1)βr2+(1−α)1−βα2r2
其中 r 2 = m x 2 + m y 2 r^{2}=m_{x}^{2}+m_{y}^{2} r2=mx2+my2, r 2 ≤ 1 β ( 2 α − 1 ) r^{2} \leq \frac{1}{\beta(2 \alpha-1)} r2≤β(2α−1)1。归一化平面坐标和椭圆球面坐标只有 z z z不相同(归一化平面坐标由椭圆球面坐标投影而来)。
这里的恢复就需要用到两帧图像的对应椭球面坐标进行三角化才可以得到相机坐标,椭球面坐标其实就相当于针孔相机去畸变之后的坐标,根据它得到的路标点才是比较准确的。
Mei模型主要基于在第三部分中由Geyer和Daniilidis提出的投影模型,详细的推导公式再重写一下。
3D点的投影可以通过以下步骤完成:
在 mirror 坐标系上的世界点映射到单位圆上:
( X ) F m → ( X s ) F m = X ∥ X ∥ = ( X s , Y s , Z s ) (\mathcal{X})_{\mathcal{F}_m} \rightarrow\left(\mathcal{X}_s\right)_{\mathcal{F}_m}=\frac{\mathcal{X}}{\|\mathcal{X}\|}=\left(X_s, Y_s, Z_s\right) (X)Fm→(Xs)Fm=∥X∥X=(Xs,Ys,Zs)
将这些点转换为以 C p = ( 0 , 0 , ξ ) \mathcal{C_p=(0,0,\xi)} Cp=(0,0,ξ) 为中心的新参考系上:
( X s ) F m → ( X s ) F p = ( X s , Y s , Z s + ξ ) \left(\mathcal{X}_s\right)_{\mathcal{F}_m} \rightarrow\left(\mathcal{X}_s\right)_{\mathcal{F}_p}=\left(X_s, Y_s, Z_s+\xi\right) (Xs)Fm→(Xs)Fp=(Xs,Ys,Zs+ξ)
将它们投影到归一化图像平面上:
m u = ( X s Z s + ξ , Y s Z s + ξ , 1 ) = ℏ ( X s ) \mathbf{m}_u=\left(\frac{X_s}{Z_s+\xi}, \frac{Y_s}{Z_s+\xi}, 1\right)=\hbar\left(\mathcal{X}_s\right) mu=(Zs+ξXs,Zs+ξYs,1)=ℏ(Xs)
添加上径向和切向畸变:
m d = m u + D ( m u , V ) \mathbf{m}_d=\mathbf{m}_u+D\left(\mathbf{m}_u, V\right) md=mu+D(mu,V)
最终投影涉及一个广义相机投影矩阵 K \mathbf{K} K(其中 γ \gamma γ 为广义焦距, ( u 0 , v 0 ) (u_0,v_0) (u0,v0) 为主点, s s s 斜度):
p = K m = [ γ γ s u 0 0 γ r v 0 0 0 1 ] m = k ( m ) \mathbf{p}=\mathbf{K} \mathbf{m}=\left[\begin{array}{ccc} \gamma & \gamma s & u_0 \\ 0 & \gamma r & v_0 \\ 0 & 0 & 1 \end{array}\right] \mathbf{m}=k(\mathbf{m}) p=Km=⎣⎡γ00γsγr0u0v01⎦⎤m=k(m)
ℏ \hbar ℏ 使一个点从 π m u \pi_{m_u} πmu 上升(返回)到球面:
ℏ − 1 ( m u ) = [ ξ + 1 + ( 1 − ξ 2 ) ( x 2 + y 2 ) x 2 + y 2 + 1 x ξ + 1 + ( 1 − ξ 2 ) ( x 2 + y 2 ) x 2 + y 2 + 1 y ξ + 1 + ( 1 − ξ 2 ) ( x 2 + y 2 ) x 2 + y 2 + 1 − ξ ] \hbar^{-1}\left(\mathbf{m}_u\right)=\left[\begin{array}{c} \frac{\xi+\sqrt{1+\left(1-\xi^2\right)\left(x^2+y^2\right)}}{x^2+y^2+1}x \\ \frac{\xi+\sqrt{1+\left(1-\xi^2\right)\left(x^2+y^2\right)}}{x^2+y^2+1} y \\ \frac{\xi+\sqrt{1+\left(1-\xi^2\right)\left(x^2+y^2\right)}}{x^2+y^2+1}-\xi \end{array}\right] ℏ−1(mu)=⎣⎢⎢⎢⎡x2+y2+1ξ+1+(1−ξ2)(x2+y2)xx2+y2+1ξ+1+(1−ξ2)(x2+y2)yx2+y2+1ξ+1+(1−ξ2)(x2+y2)−ξ⎦⎥⎥⎥⎤
关于未知参数三 V 3 V^3 V3,考虑了两个主要的失真来源:
畸变函数与针孔模型的相同 ρ = x 2 + y 2 \rho=\sqrt{x^2+y^2} ρ=x2+y2,
径向畸变:
L ( ρ ) = 1 + k 1 ρ 2 + k 2 ρ 4 + k 5 ρ 6 L(\rho)=1+k_1\rho^2+k_2\rho^4+k_5\rho^6 L(ρ)=1+k1ρ2+k2ρ4+k5ρ6
切向畸变:
d x = [ 2 k 3 x y + k 4 ( ρ 2 + 2 x 2 ) k 3 ( ρ 2 + 2 y 2 ) + 2 k 4 x y ] dx=\left[\begin{array}{c}2k_3xy+k_4(\rho^2+2x^2) \\ k_3(\rho^2+2y^2)+2k_4xy\end{array}\right] dx=[2k3xy+k4(ρ2+2x2)k3(ρ2+2y2)+2k4xy]
校准一个广角相机模型意味着寻找给定的 2 D 2D 2D像素点 p p p和从面镜有效视点处传出的 3 D 3D 3D向量 P P P之间的关系。一般来说,这个过程需要找到相机的内参和面镜的外参。该广角相机模型将成像系统作为了一个独特的紧凑系统,也就是说,它并不关心在组合相机内使用的是面镜还是鱼眼透镜。
值得注意的是,在此坐标系中, x x x 和 u u u 方向向下, y y y 和 v v v 方向向右, z z z 轴透过纸面向外:这与针孔相机模型是相反的。因此在求 N Z N_Z NZ 的时候为负值。
该模型基于以下假设:
假设假设2是完全符合的,即相机和面镜轴完全的对齐。令 p p p为图像的像素点, ( u , v ) (u,v) (u,v)是它相对于全向图像中心的像素坐标。设 P P P是它对应的从单有效视点发出的三维向量, ( x , y , z ) (x,y,z) (x,y,z)是它相对于坐标轴原点的坐标。
因为相机和面镜轴假设为完美对齐,因此 x x x 和 y y y 分别与 u u u 和 v v v 成比例:
[ x y ] = α ⋅ [ u v ] , α > 0 \left[\begin{array}{l} x \\ y \end{array}\right]=\alpha \cdot\left[\begin{array}{l} u \\ v \end{array}\right], \quad \alpha>0 [xy]=α⋅[uv],α>0
我们想要标定估计的函数是将图像点 p p p 映射到其对应的 3 D 3D 3D 向量 P P P 的函数。写成:
P = [ x y z ] = [ α ⋅ u α ⋅ v f ( u , v ) ] P=\left[\begin{array}{l} x \\ y \\ z \end{array}\right]=\left[\begin{array}{c} \alpha \cdot u \\ \alpha \cdot v \\ f(u, v) \end{array}\right] P=⎣⎡xyz⎦⎤=⎣⎡α⋅uα⋅vf(u,v)⎦⎤
我们可以将 α \alpha α包含进函数 f f f,因此可以同等的写成:
P = [ x y z ] = [ u v f ( u , v ) ] P=\left[\begin{array}{l} x \\ y \\ z \end{array}\right]=\left[\begin{array}{c} u \\ v \\ f(u, v) \end{array}\right] P=⎣⎡xyz⎦⎤=⎣⎡uvf(u,v)⎦⎤
事实上,需要注意的是, P P P 并不是一个 3 D 3D 3D 点,而是一个向量,因此前面的简化是被允许的。
而且,因为面镜是旋转对称的,函数 f ( u , v ) f(u,v) f(u,v) 仅取决于点到图像中心的距离 ρ = u 2 + v 2 \rho=\sqrt{u^{2}+v^{2}} ρ=u2+v2。
因此,我们仍可以将上述的方程简化为:
P = [ x y z ] = [ u v f ( ρ ) ] P=\left[\begin{array}{l} x \\ y \\ z \end{array}\right]=\left[\begin{array}{c} u \\ v \\ f(\rho) \end{array}\right] P=⎣⎡xyz⎦⎤=⎣⎡uvf(ρ)⎦⎤
在此需要标定的函数只有 f ( ρ ) f(\rho) f(ρ)。该函数是个如下所示的多项式:
f ( ρ ) = a 0 + a 1 ρ + a 2 ρ 2 + a 3 ρ 3 + a 4 ρ 4 + … f(\rho)=a_{0}+a_{1} \rho+a_{2} \rho^{2}+a_{3} \rho^{3}+a_{4} \rho^{4}+\ldots f(ρ)=a0+a1ρ+a2ρ2+a3ρ3+a4ρ4+…
所以需要估计的参数为: a 1 a_1 a1, a 2 a_2 a