常用相机投影及畸变模型(针孔|广角|鱼眼)
常用相机投影及畸变模型
- 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 和 PP
- 2.7.1 除法畸变模型(Division distortion model)
- 2.7.2 除法畸变模型参数
- 2.8 针孔相机成像过程建模总结
- 3. 广角相机理论知识
- 3.1 Central omnidirectional cameras
- 3.2 单一有效视点特性为何重要
- 3.3 Unified model for central catadioptric cameras
- 3.4 全向模型(Omnidirectional)
- 4. 鱼眼镜头
- 4.1 投影函数
- 4.1.1 等距投影模型(Equidistant)
- 4.1.2 等立体角/等积投影模型(Equisolid Angle/Equal Area)
- 4.1.3 体视投影/立体投影模型(Stereographic)
- 4.1.4 正交投影模型(Orthographic)
- 4.2 多项式投影模型/Kannala-Brandt Camera Model/KB
- 4.2 UCM (Unified Omnidirectional Camera Model)
- 4.2.1 投影过程
- 4.2.2 反投影过程
- 4.3 EUCM (Extended Unified Camera Model)
- 4.3.1 归一化平面坐标
- 4.3.2 像素坐标
- 4.3.3 像素坐标到相机坐标
- 4.3.3.1 椭圆球面坐标
- 4.3.4 相机坐标
- 4.4 Mei模型
- 4.5 Scara模型
- 4.5.1 广角相机模型
- 4.5.2 Scara模型假设
- 4.5.3 Scara模型
- 4.5.4 Scara完整模型
Reference:
- 高翔,张涛 《视觉SLAM十四讲》
- 鱼眼镜头是怎么「鱼眼」的?
- VIO标定(二)广角相机模型
- 鱼眼相机模型EUCM(一)
- 相机模型–Omnidirectional Camera
- Omnidirectional Camera
- Mei: http://www.robots.ox.ac.uk/~cmei/articles/single_viewpoint_calib_mei_07.pdf
- OCamCalib: 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−zO-x-y-zO−x−y−z为相机坐标系,习惯上将zzz轴指向相机前方,xxx轴向右,yyy轴向下。OOO为摄像机的光心,也是针孔模型中的针孔。现实世界的空间点P,经过小孔OOO投影之后,落在物理成像平面O′−x′−y′O'-x'-y'O′−x′−y′上,成像点为P′P'P′。
(注意这里的 (cx,cy)(c_x, c_y)(cx,cy) 写的是 光心 或 principle point(PP),不是畸变中心(COD)!)
2.1 缩略词和术语
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) |
2.1 世界坐标系到像素坐标系
世界坐标系中三维点M=[X,Y,Z]TM=[X, Y, Z]^{T}M=[X,Y,Z]T和像素坐标系中二维点m=[u,v]Tm=[u, v]^{T}m=[u,v]T的关系为:
sm~=A[Rt]M~s \tilde{m}=A[R \quad t] \tilde{M}sm~=A[Rt]M~
即:
s[uv1]=Zc[uv1]=[fx0cx0fycy001][XcYcZc]=[fx0cx0fycy001][r11r12r13t1r21r22r23t2r31r32r33t3][XwYwZw1]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⎦⎥⎥⎤
其中,sss为缩放因子(ZcZ_cZc),AAA为相机的内参矩阵,[Rt][R \quad t][Rt] 为相机的外参矩阵,m~\tilde{m}m~ 和 M~\tilde{M}M~ 分别为 mmm 和 MMM对应的齐次坐标系。
2.2 针孔相机模型
相机将三维世界中的坐标点(unit: m) 映射到二维图像平面(unit: pixel) 的过程能够用一个几何模型来描述,其中最简单的称为针孔相机模型 (pinhole camera model)
。
2.2.1 世界坐标系到相机坐标系
[XcYcZc]=R[XwYwZw]+t=[Rt][XwYwZw1]=[r11r12r13t1r21r22r23t2r31r32r33t3][XwYwZw1]\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 相机坐标系到像素坐标系
根据三角形相似关系,有:
Zcf=Xcx=Ycy\frac{Z_{c}}{f}=\frac{X_{c}}{x}=\frac{Y_{c}}{y}fZc=xXc=yYc
整理,得:
{x=f⋅XcZcy=f⋅YcZc\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′ 位于图像的左上角,uuu 轴向右与 xxx 轴平行,vvv 轴向下与 yyy 轴平行。像素坐标系与成像平面之间,相差了一个缩放和一个原点的位移。我们设像素坐标在 uuu 轴上缩放了 α\alphaα 倍,在 vvv 轴上缩放了 β\betaβ 倍。同时,原点平移了 [cx,cy]T[c_x,c_y]^T[cx,cy]T。那么整理得,坐标之间的关系为:
{u=α⋅x+cxv=β⋅y+cy⟹{u=αf⋅XcZc+cx=fxXcZc+cxv=βf⋅YcZc+cy=fyYcZc+cy\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
其中,
- fff 为镜头焦距,单位为米;
- α\alphaα、β\betaβ 的单位为像素/米;
- fyf_yfy、fyf_yfy 为 xxx、yyy 方向的焦距,单位为像素。
最终,写成矩阵的形式为:
Zc[uv1]=[fx0cx0fycy001][XcYcZc]=KPZ_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]=KPZc⎣⎡uv1⎦⎤=⎣⎡fx000fy0cxcy1⎦⎤⎣⎡XcYcZc⎦⎤=KP
2.3 综述
从另一个角度看,我们可以把一个世界坐标点先转换到相机坐标系,再除掉它最后一维的数值(即该点距离相机成像平面的深度),这相当于把最后一维进行归一化处理,得到点 PPP 在相机归一化平面上的投影:
(RPw+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=1z=1z=1 处的平面上的一个点,这个 z=1z=1z=1 平面也称为归一化平面。归一化坐标再左乘内参就得到了像素坐标,所以我们可以把像素坐标 [u,v]T[u,v]^T[u,v]T 看成对归一化平面上的点进行量化测量的结果。从这个模型中也可以看出,如果对相机坐标同时乘以任意非零常数,归一化坐标都是一样的,这说明点的深度在投影过程中被丢失了,所以单目视觉中没法得到像素点的深度值。
2.4 内参标定
内参标定(Intrinsic Camera Calibration)
是找到一个相机的物理参数的过程。标定结果是一个相机内参集合。
2.5 畸变模型
普通相机畸变通常包括径向畸变和切向畸变。如下图所示
切向畸变表达式沿半径方向的偏移量,径向畸变的形成原因是镜头制造工艺不完美,使得镜头形状存在缺陷,通常又分为桶性畸变和枕形畸变,分别代表 drdrdr 往外偏和往里偏。
[xdistorted,ydistorted]T[x_{distorted}, y_{distorted}]^T[xdistorted,ydistorted]T是畸变后点的归一化坐标。
2.5.1 径向畸变
真实的摄像头使用的并不是针孔,它们使用的是能一次性聚焦大量光线的镜头,这使得其能迅速生成图像,但是,镜头仍会产生失真,光线通常会在摄像机镜头的边缘出现较大或较小幅度的弯曲,这会产生图像边缘扭曲的效果,因此,线条或者物体会比真实情况呈现出或多或少的弯曲。这种失真被称为径向畸变,是最常见的失真类型。
实际情况中我们常用 r=0r=0r=0 处的泰勒级数展开的前几项来近似描述径向畸变,径向畸变后的归一化坐标为:
{xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)\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的安装位置误差导致(相机的组装过程中由于不能使得透镜和成像面严格平行),切向畸变需要两个额外的畸变参数来描述,切向畸变后的归一化坐标为:
{xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+2p2xy+p1(r2+2y2)\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)
其中,r2=x2+y2r^{2}=x^{2}+y^{2}r2=x2+y2。
对于相机坐标系中的一点 PPP,我们能够通过5个畸变系数找到这个点在像素平面上的正确位置:
{xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted=y(1+k1r2+k2r4+k3r6)+2p2xy+p1(r2+2y2)\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)
由于参数过多导致数值求解不稳定, 通常只使用k1k_1k1,k2k_2k2,k3k_3k3,p1p_1p1,p2p_2p2综上,我们一共需要5个畸变参数(k1,k2,k3,p1,p2)\left(k_{1}, k_{2}, k_{3}, p_{1}, p_{2}\right)(k1,k2,k3,p1,p2)来描述透镜畸变。
将畸变后的点通过内参数矩阵投影到像素平面,得到该点在图像上的正确位置:
{u=fxxdistorted+cxv=fyydistorted+cy\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)
(也就是物理成像平面可能在设计或生产上是个歪的),因此需要考虑这些影响因素,传感器歪斜和不是正方形主要对相机 xxx 和 yyy 方向的焦距产生影响。
在不考虑畸变的情况下,考虑主点偏移、图像传感器的特性,3D 目标点成像数学模型用以下公式可完全表达。这就是相机内部参数对成像的影响,因此 KKK 称为内参矩阵,相机内参标定主要是标定相机的焦距、主点、歪斜(下面的sss)等内部参数。
Zc[uv1]=[fscx0ηfcy001][XcYcZc]=KPZ_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]=KPZc⎣⎡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);elseimg_dst(v, u) = 0;}
}
2.7 COD 和 PP
以下为 COD 和 PP 误差示意图:
(注意COD图片上两点在透镜中心相交,而PP的理论上垂直于传感器表面。也就是说在透镜装歪了的时候,COD本身也会跟着歪过来,但是PP理论上是垂直的,可能因为标定误差的原因导致它偏离了原位置)
有些情况下 PP 和 COD 是相似的,有些情况下它们可能是不同的。这主要取决于 相机构造质量 还有 相机透镜和传感器之间的对齐精度(见下面的一个例子展示了切向失真,这会导致 PP 和 COD 不同):
2.7.1 除法畸变模型(Division distortion model)
Ru=Rd/(1+sign(K1)∗(K1∗Rd)2+sign(K2)∗(K2∗Rd)4+…+sign(Kn)∗(Kn∗Rd)2n)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)
- RuR_uRu:去畸变后的半径;
- RdR_dRd:畸变半径。
2.7.2 除法畸变模型参数
Parameter | Description | Example |
---|---|---|
camK |
最前面的两个参数对应于焦距 x 和焦距 y(像素单位,原始图像)。在大多数情况下,焦距 x 和 y 是相同的,因为传感器像素通常是正方形而不仅仅是矩形。 第三个参数为 skew,通常使用的 skew=0。非零值意味着像素是一个平行四边形,而不是一个完美的矩形/正方形。 第四和第五个参数是主点的坐标PPx和PPy(像素单位,原始图像) |
camK = 2612.70312 2612.70312 0 671.287598 277.750671 |
DM |
第一个参数为模型类型。这里 333 代表的是当前使用的是除法模型:Ru=Rd/(1+sign(K1)∗(K1∗Rd)2+sign(K2)∗(K2∗Rd)4+sign(K3)∗(K3∗Rd)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是畸变系数,为上面的公式 KKK 的 1−31-31−3。 最后一个参数是 γ\gammaγ,总是 111。 |
distortParams = 3 635.07196 560.289429 -0.000464434823 0.000386408938 0.000644135347 1 |
2.8 针孔相机成像过程建模总结
3. 广角相机理论知识
3.1 Central omnidirectional cameras
一个视觉系统是 central 的话,那么被观测物体的所有入射光线汇交于 3D3D3D 空间的一个点,这个点称为映射中心 (projection center)
或单一有效视野点 (single effective viewpoint)
。这个特性被称为单一有效视点特性。透视相机是中心投影系统的一个例子,因为不同的光线相交于一点,即相机的光学中心。
所有的现代鱼眼摄像机都是 central 的,因此,它们满足单一有效视点特性(只是说满足单一有效视点特性,注意不是说现代鱼眼相机是通过镜面反射的-----即满足单一有效视点特性,就可以拟合类似的模型)。Central catadioptric cameras 由一个相机加上一个面镜所组成(如图,相机为底下成像平面,面镜为上面反射的mirror),相机和面镜的距离需要选择合适。面镜的家族里,能满足单一有效视野点特性的有 hyperbolic, parabolic, and elliptica 面镜。
- Camera + hyperbolic mirror | Camera + parabolic mirror + orthographic lens
在 hyperbolic 和 elliptical 面镜的情况下,单一有效视点特性是通过确保相机中心(针孔或透镜的中心)正值双曲线(椭圆)的焦点之一。在抛物(parabolic)面镜的情况下,必须在面镜和相机间插入一个直角的镜头,这使它可能平行光线反射抛物面镜收敛于摄像机中心:
- Camera + fisheye lens
另一种不使用面镜来扩大摄像机FOV的方法是在摄像机CCD上方增加一个鱼眼镜头。鱼眼镜头是一种能将相机的FOV扩大到190°的镜头系统。如下图所示:
3.2 单一有效视点特性为何重要
- 它允许用户从广角相机捕获的图片生成几何正确的透视图像。因为在单一有效视点约束下,感知图像中的每个像素测量光在一个特定方向通过视点的辐照度。当全向摄像机的几何位置已知时,也就是当摄像机被标定时,我们可以为每个像素预先计算这个方向。因此,可以将每个像素测量的辐照度值映射到距离视点任意距离的平面上,形成平面透视图像。此外,图像可以映射到以单个视点为中心的球体上,即球面投影。
- 它允许用户应用著名的对极几何理论,这对于sfm来说是非常重要的。对极几何适用于任何 central 相机,无论是 perspective 还是 omnidirectional。
3.3 Unified model for central catadioptric cameras
直观上,有单一有效视点的折射反射模型相比标准透视相机会复杂一些。这个模型确实应该考虑到在折反射照相机的情况下由面镜操作带来的反射,或者在鱼眼照相机的情况下由透镜引起的折射。
Geyer和Daniilidis证明,每个折射反射的(parabolic, hyperbolic, elliptical) 和标准透视投影相当于从一个集中在单一视点的球体投影映射,到一个与球心垂直距离为ϵ\epsilonϵ (同后面的ξ\xiξ) 的投影平面。(MEI模型理论)
投影模型有四个步骤。令 P=(x,y,z)P=(x,y,z)P=(x,y,z) 为在面镜参考坐标系下以 CCC 为中心点的场景点。为方便起见,我们假设面镜的对称轴与相机的光轴完全对齐。我们还假设相机和面镜的 xxx 轴和 yyy 轴是对齐的。因此,摄像机和面镜参考系之间的差异仅在于沿 zzz 轴的平移。
将场景点投影在单位球体上,得到:
Ps=P∥P∥=(xs,ys,zs)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ϵ=(xs,ys,zs+ϵ)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ϵ 距离为 111 的归一化平面(同针孔模型归一化坐标),因此:
m~=(xm,ym,1)=(xszs+ϵ,yszs+ϵ,1)=g−1(Ps)\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),通过内参矩阵 KKK,因此:
p~=Km~\tilde{p}=K \tilde{m}p~=Km~
其中KKK为(θ\thetaθ 为倾角,一般为 0):
K=[αuαucot(θ)u00αvv0001]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−1g^{-1}g−1 是双射的 (正反向一一对应),它的逆 ggg 为:
Ps=g(m)∝[xmym1−ϵxm2+ym2+1ϵ+1+(1−ϵ2)(xm2+ym2)]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∝表明 ggg 与右边的式子成正比。要得到归一化因子,只要在单位球体上归一化 g(m)g(m)g(m) 就足够了。因为 PsP_sPs 在单位圆上,因此 xs2+ys2+zs2=1x_{s}^{2}+y_{s}^{2}+z_{s}^{2}=1xs2+ys2+zs2=1。推导过程可见 Section 3.4。
这个函数是 central cata-dioptric cameras 投影模型的核心。它表示了归一化图像平面上的点 mmm 与面镜参考系中单位向量 PsP_sPs 的关系。注意在平面面镜的情况下,我们有 ϵ=0\epsilon = 0ϵ=0,透视相机的投影方程为:Ps∝(xm,ym,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 可以通过精确的参数函数(抛物线、双曲线、椭圆)来表示,但鱼眼镜头的投影模型因相机而异,并取决于镜头的视场。
3.4 全向模型(Omnidirectional)
全向模型利用面镜(mirror)反射进行成像的相机使用的模型。该模型带有一个参数 ξ\xiξ.
首先将相机坐标系的点归一化到半径为1的球面上:
(xsyszs)=1xc2+yc2+zc2(xcyczc)\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⎠⎞
然后再投影到图像平面上:
xu=xszs+ξ,yu=yszs+ξx_{u}=\frac{x_{s}}{z_{s}+\xi}, \quad y_{u}=\frac{y_{s}}{z_{s}+\xi} xu=zs+ξxs,yu=zs+ξys
其逆变换推导出来如下:
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]=[ξ+1+(1−ξ2)(xu2+yu2)xu2+yu2+1xuξ+1+(1−ξ2)(xu2+yu2)xu2+yu2+1yuξ+1+(1−ξ2)(xu2+yu2)xu2+yu2+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 时,全向模型就退化为了针孔模型。
相应的得到归一化平面坐标为:
[xszs−ξyszs−ξzszs+ξ]=[xuyu1−ξxu2+yu2+1ξ+1+(1−ξ2)(xu2+yu2)]\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⎦⎥⎤
4. 鱼眼镜头
由于鱼眼镜头会产生极大的形变,因此针孔模型无法为鱼眼镜头建模。鱼眼镜头一般是由十几个不同的透镜组合而成的,在成像的过程中,入射光线经过不同程度的折射,投影到尺寸有限的成像平面上,使得鱼眼镜头与普通镜头相比起来拥有了更大的视野范围。下图表示出了鱼眼相机的一般组成结构。最前面的两个镜头发生折射,使入射角减小,其余的镜头相当于一个成像镜头,这种多元件的构造结构使对鱼眼相机的折射关系的分析变得相当复杂。
研究表明鱼眼相机成像时遵循的模型可以近似为单位球面投影模型。可以将鱼眼相机的成像过程分解成两步:
- 三维空间点线性地投影到一个球面上,它是一个虚拟的单位球面,它的球心与相机坐标系的原点重合。
- 单位球面上的点投影到图像平面上,这个过程是非线性的。
下图表示出了鱼眼相机的成像过程:
我们知道,普通相机成像遵循的是针孔相机模型,在成像过程中实际场景中的直线仍被投影为图像平面上的直线。但是鱼眼相机如果按照针孔相机模型成像的话,投影图像会变得非常大,当相机视场角达到180°时,图像甚至会变为无穷大。所以,鱼眼相机的投影模型为了将尽可能大的场景投影到有限的图像平面内,允许了相机畸变的存在。并且由于鱼眼相机的径向畸变非常严重,所以鱼眼相机主要的是考虑径向畸变,而忽略其余类型的畸变。
4.1 投影函数
为了将尽可能大的场景投影到有限的图像平面内,鱼眼相机会按照一定的投影函数来设计。根据投影函数的不同,鱼眼相机的设计模型大致能被分为四种:等距投影模型
、等立体角投影模型
、正交投影模型
和体视投影模型
(简单的说,就是把球面上的点一一映射到平面的方法)。下面的四种鱼眼相机的投影模型反映出了空间中的一点 PPP 是如何投影到球面上,然后到图像平面上成像的。
4.1.1 等距投影模型(Equidistant)
公式:rd=fθr_d = f\thetard=fθ (距离与 θ\thetaθ 成正相关,在 θ\thetaθ 足够小时,可以近似看成是与弧长正相关)
该模型是使用最多的模型,上述式子中,rdr_drd 表示鱼眼图像中的点到畸变中心(画面中心)的距离,fff是鱼眼相机的焦距,θ\thetaθ是入射光线与鱼眼相机光轴之间的夹角,即入射角。
这种投影方式的特点是,物体在成像平面上离开画面中心的距离,与物体在空间中离开光轴的角度成正比,这个比例系数就是镜头焦距。在这种投影变换下,物体离开中心的距离(角度)就是一个重要的几何性质,物体的空间角距离与物体的像在像平面上的平面距离,是成正比的。这也是这个投影方式名称的来源。在下图的模拟场景中,中间一列的各个小方格的高度都是一样的:
4.1.2 等立体角/等积投影模型(Equisolid Angle/Equal Area)
公式:rd=2fsin(θ2)r_d = 2fsin(\frac{\theta}{2})rd=2fsin(2θ)
这种投影方式的特征在于,能保持变换前后,物体所占的立体角大小不变。或者说,在半球空间中,半球面上两个面积相同的图案,成像后,在成像平面上的两个图案的面积仍然相同(虽然两者形状不一定相似)。这正式这个投影方式名字的由来。在下图的模拟场景中,圆筒壁上每一列的各个小方格的面积都是相等的:
4.1.3 体视投影/立体投影模型(Stereographic)
公式:rd=2ftan(θ2)r_d = 2ftan(\frac{\theta}{2})rd=2ftan(2θ)
这种投影方式的特点是能保持角度不变,这在数学上是一个非常良好的性质,叫做保角变换(Conform)。保持角度不变,意思是任何直线相交的角度,在变换之后是保持不变的(虽然直线本身可能变弯曲)。在保角变换下,一个圆仍然还是一个圆(直线可以看做直径无穷大的圆)。所以在某种程度上,保角变换也是保持了「形状」不变的。在下面的模拟场景中,圆筒壁上的所有边界线,全部都变成了圆弧;所有线的交角,也都保持了 90° 不变:
4.1.4 正交投影模型(Orthographic)
公式:rd=fsin(θ)r_d = fsin(\theta)rd=fsin(θ)
这种投影方式,就像是把整个半球直接拍扁,用公式表达就是 r=sin(θ)。在几种投影方式中,这种投影方式带来的扭曲最大,对边缘物体压缩最厉害,实际很少使用。很显然,这种投影方式的最大视场角也不能大于 180°:
4.2 多项式投影模型/Kannala-Brandt Camera Model/KB
对于实际的鱼眼镜头来说,它们不可能精确地按照 4.1 中所述投影模型来设计,所以为了方便鱼眼相机的标定,Kannala 提出了一种鱼眼相机的一般多项式近似模型。通过前面的四个模型,可以发现 rdr_drd 是 θ\thetaθ 的奇函数,而且将这些式子按泰勒级数展开,发现 rdr_drd 可以用 θ\thetaθ 的奇次多项式表示,即:
rd=k0θ+k1θ3+k2θ5+k3θ7+⋯r_{d}=k_{0} \theta+k_{1} \theta^{3}+k_{2} \theta^{5}+k_{3} \theta^{7}+\cdotsrd=k0θ+k1θ3+k2θ5+k3θ7+⋯
为了实际计算的方便,需要确定式中 rdr_drd 取到的次幂数。Kannala 提出取式的前五项即取到的九次方,就给出了足够的自由度来很好地近似各种投影模型。rdr_drd 的一次项系数可以为 111,于是 OpenCV 中使用的鱼眼相机模型为:
rd=k0θ+k1θ3+k2θ5+k3θ7+k4θ9r_{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θ 能够得到 rdr_drd,即通过无畸变图像中的点能够计算出鱼眼图像中的畸变点。这种模型在 OpenCV 的鱼眼相机标定方法中是适用的,因为 OpenCV 借助标定板对鱼眼相机进行标定。从空间点到鱼眼图像上的点的变换过程可用式子表示为:
[XcYcZc]=RX+txc=XcZc,yc=YcZcr2=xc2+yc2θ=arctan(r)θd=k0θ+k1θ3+k2θ5+k3θ7+k4θ9xd=θdrxc,yd=θdrycu=fxxd+cx,v=fyyd+cy\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 为畸变后的等效折射角(不是实际的折射角),rdr_drd 和 θd\theta_dθd 满足 rd=f⋅tanθdr_d=f\cdot tan\theta_drd=f⋅tanθd,如果取等效焦距 f=1f=1f=1(这里不是实际焦距,而是球面到成像平面使用的距离),就有 rd=tanθdr_d = tan\theta_drd=tanθd,考虑到相机的成像CCD平面尺寸一般都是几毫米,焦距在几百毫米左右,所以相机实际成像过程中 θd\theta_dθd 是比较小的,θd\theta_dθd 可以近似用 θd\theta_dθd 表示(x→0x\rightarrow0x→0 ,tanx=xtanx=xtanx=x),所以才有了等式:
rd=θd=θ(1+k1θ2+k2θ4+k3θ6+k4θ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)
根据相似三角形定理可得(鱼眼镜头的成像原理到畸变矫正(完整版)):
rdr=xdxc=ydyc,xd=θdrxc,yd=θdryc\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
上面式子中,XXX表示空间点,XcX_cXc表示相机坐标系下对应的空间点,RRR 和 ttt 分别是两个坐标系之间的旋转矩阵和平移向量,(u,v)T(u,v)^T(u,v)T 表示投影到鱼眼图像上的对应点。OpenCV中对鱼眼相机的标定步骤能够分成四步:(1)初始化内参数;(2)初始化外参数;(3)使用LM算法最小化定位的图像点和投影的图像点之间的投影误差;(4)确定结果。
4.2 UCM (Unified Omnidirectional Camera Model)
该相机模型有5个参数[fx,fy,cx,cy,ξ]\left[f_{x}, f_{y}, c_{x}, c_{y}, \xi\right][fx,fy,cx,cy,ξ],它刚开始是针对于大FOV的鱼眼相机提出的,并且有两个优点:
- 它能精确地模拟各种图像设备和畸变的几何图像生成过程
- 它的反投影是一个闭式解
3D点首先被投影到单位球上,之后单位球上的点在以偏离z轴 ξ\xiξ 大小为中心的通过针孔模型进行投影,投影的过程可以通过下图进行表示。
4.2.1 投影过程
假设相机坐标系下的点为(x,y,x)(x,y,x)(x,y,x) ,像素坐标为(u,v)(u,v)(u,v),d=x2+y2+z2d=\sqrt{x^{2}+y^{2}+z^{2}}d=x2+y2+z2 那么它的投影过程为:
- 将场景点投影在单位球体上,得到:
Ps=P∥P∥=(xd,yd,zd)P_{s}=\frac{P}{\|P\|}=\left(\frac{x}{d}, \frac{y}{d}, \frac{z}{d}\right)Ps=∥P∥P=(dx,dy,dz) - 将中心偏离zzz轴 ξ\xiξ 单位,得:
Ps′=(xd,yd,zd+ξ)=(xd,yd,z+dξd)P_{s'}=\left(\frac{x}{d}, \frac{y}{d}, \frac{z}{d}+\xi\right)=\left(\frac{x}{d}, \frac{y}{d}, \frac{z+d\xi}{d}\right)Ps′=(dx,dy,dz+ξ)=(dx,dy,dz+dξ) - 到平面距离为1,即归一化坐标为:
Pu=(xξd+z,yξd+z,1)P_{u}=\left(\frac{x}{\xi d+z}, \frac{y}{\xi d+z}, 1\right)Pu=(ξd+zx,ξd+zy,1) - 投影到针孔模型上:
[uv]=[fxxξd+z+cxfyyξd+z+cy]{\left[\begin{array}{l} u \\ v \end{array}\right]=\left[\begin{array}{l} f_{x} \frac{x}{\xi d+z}+c_{x} \\ f_{y} \frac{y}{\xi d+z}+c_{y} \end{array}\right]} [uv]=[fxξd+zx+cxfyξd+zy+cy]
4.2.2 反投影过程
首先通过针孔相机的反投影过程得到:
[u~v~]=[(u−cx)/fx(v−cx)/fy]\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]−[00ξ]\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)
中,为了补偿透镜缺陷,对原始图像进行了径向切向去畸变,之后才使用该相机模型。所以在这里发现自己对相机模型和畸变模型一直存在混淆,相机模型应该是投影方式的不同,而去畸变是为了矫正相机透镜缺陷带来的问题,两者其实是独立的。
4.3 EUCM (Extended Unified Camera Model)
由于UCM是将三维点先投影在球面上,而为了表征更复杂的投影效果,EUCM在投影时将上面的球面升级为椭球面,增加了一个椭圆参数β\betaβ,其他投影折射过程和UCM一致。当β\betaβ为1时,EUCM退化为UCM。对于EUCM模型来说,它需要标定六个参数[fx,fy,cx,cy,α,β][f x, f y, c x, c y, \alpha, \beta][fx,fy,cx,cy,α,β],其中前四个是相机的内参,后两个是畸变系数,可以通过使用kalibr工具进行标定。
有了这6个参数,就可以计算图像的坐标了,它的模型如下,其中 zzz 为光轴:
- xxx: 相机坐标系坐标
- xpx_pxp: 投影平面坐标系坐标(椭球坐标)
- qqq: 归一化平面坐标系坐标(M平面)
根据上面的坐标、内参和畸变系数可以得到他们之间的关系。
相机坐标到像素坐标:x→q→u\mathbf{x}\rightarrow \mathbf{q} \rightarrow \mathbf{u}x→q→u
相机坐标→\rightarrow→归一化平面坐标→\rightarrow→像素坐标
4.3.1 归一化平面坐标
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⎦⎤
其中ρ=β(x2+y2)+z2\rho=\sqrt{\beta\left(x^{2}+y^{2}\right)+z^{2}}ρ=β(x2+y2)+z2:x, y, z 都是相机坐标系下的坐标。相较于普通的针孔模型,它的归一化坐标多了一个系数,α\alphaα和β\betaβ都是畸变系数。
4.3.2 像素坐标
有了归一化平面坐标后,就可以使用内参进行投影了:
π(x)=u=[fx00fy][x/[αρ+(1−α)z]y/[αρ+(1−α)z]]+[cxcy]\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]
4.3.3 像素坐标到相机坐标
在实际情况中,从图像中得到特征点,这是他的像素坐标,如何准确的恢复到世界坐标系中也是很重要的,畸变的影响会导致它最后反投影的点的结果不准确。
4.3.3.1 椭圆球面坐标
该坐标可以通过像素坐标进行转换,假设椭球面坐标xp=[mxmymz]T\mathbf{x}_{p}=\left[\begin{array}{lll}m_{x} & m_{y} & m_{z}\end{array}\right]^{T}xp=[mxmymz]T,那么它的值为:
mx=u−cxfxmy=v−cyfymz=1−βα2r2α1−(2α−1)βr2+(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
其中 r2=mx2+my2r^{2}=m_{x}^{2}+m_{y}^{2}r2=mx2+my2,r2≤1β(2α−1)r^{2} \leq \frac{1}{\beta(2 \alpha-1)}r2≤β(2α−1)1。归一化平面坐标和椭圆球面坐标只有zzz不相同(归一化平面坐标由椭圆球面坐标投影而来)。
4.3.4 相机坐标
这里的恢复就需要用到两帧图像的对应椭球面坐标进行三角化才可以得到相机坐标,椭球面坐标其实就相当于针孔相机去畸变之后的坐标,根据它得到的路标点才是比较准确的。
4.4 Mei模型
Mei模型主要基于在第三部分中由Geyer和Daniilidis提出的投影模型,详细的推导公式再重写一下。
Full projection model
3D点的投影可以通过以下步骤完成:
在 mirror 坐标系上的世界点映射到单位圆上:
(X)Fm→(Xs)Fm=X∥X∥=(Xs,Ys,Zs)(\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)将这些点转换为以 Cp=(0,0,ξ)\mathcal{C_p=(0,0,\xi)}Cp=(0,0,ξ) 为中心的新参考系上:
(Xs)Fm→(Xs)Fp=(Xs,Ys,Zs+ξ)\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+ξ)将它们投影到归一化图像平面上:
mu=(XsZs+ξ,YsZs+ξ,1)=ℏ(Xs)\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)添加上径向和切向畸变:
md=mu+D(mu,V)\mathbf{m}_d=\mathbf{m}_u+D\left(\mathbf{m}_u, V\right) md=mu+D(mu,V)最终投影涉及一个广义相机投影矩阵 K\mathbf{K}K(其中 γ\gammaγ 为广义焦距,(u0,v0)(u_0,v_0)(u0,v0) 为主点,sss 斜度):
p=Km=[γγsu00γrv0001]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ℏ 使一个点从 πmu\pi_{m_u}πmu 上升(返回)到球面:
ℏ−1(mu)=[ξ+1+(1−ξ2)(x2+y2)x2+y2+1xξ+1+(1−ξ2)(x2+y2)x2+y2+1yξ+1+(1−ξ2)(x2+y2)x2+y2+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)−ξ⎦⎥⎥⎥⎤
- 未知参数一:从网格参考系到镜像参考系的旋转和平移(外参 V1=[qw1qw2qw3qw4tw1tw2tw3]V^{1}=\left[\begin{array}{llll}q_{w 1} & q_{w 2} & q_{w 3} & q_{w 4} & t_{w 1} & t_{w 2}\end{array} t_{w 3}\right]V1=[qw1qw2qw3qw4tw1tw2tw3])
- 未知参数二:在mirror上的反射后点映射在正则化平面上(mirror参数 V2=ξV^{2}=\xiV2=ξ)
- 未知参数三:使用透镜产生的畸变(畸变参数 V3=[k1k2k3k4k5]V^{3}=\left[\begin{array}{llll} k_{1} & k_{2} & k_{3} & k_{4} & k_{5} \end{array}\right]V3=[k1k2k3k4k5])
- 未知参数四:用广义相机投影矩阵(相机的内参V4=[αγ1γ2u0v0]V^{4}=\left[\begin{array}{llll}\alpha & \gamma_{1} & \gamma_{2} & u_{0} & v_{0}\end{array}\right]V4=[αγ1γ2u0v0]),γ\gammaγ 包含相机焦距且该参数取决于面镜种类,可在下表中查看,但是在这里可以当成是焦距,而 u,vu,vu,v 表示主点
总的未知量有18个,通过优化(Levenberg-Marquardt)解得。
关于未知参数三 V3V^3V3,考虑了两个主要的失真来源:
- 透镜形状的瑕疵带来的径向失真;
- 相机安装不当(包括相机光轴和面镜旋转轴没对上)所产生的径向和切向畸变。
畸变函数与针孔模型的相同 ρ=x2+y2\rho=\sqrt{x^2+y^2}ρ=x2+y2,
径向畸变:
L(ρ)=1+k1ρ2+k2ρ4+k5ρ6L(\rho)=1+k_1\rho^2+k_2\rho^4+k_5\rho^6L(ρ)=1+k1ρ2+k2ρ4+k5ρ6
切向畸变:
dx=[2k3xy+k4(ρ2+2x2)k3(ρ2+2y2)+2k4xy]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]
4.5 Scara模型
4.5.1 广角相机模型
校准一个广角相机模型意味着寻找给定的2D2D2D像素点ppp和从面镜有效视点处传出的3D3D3D向量PPP之间的关系。一般来说,这个过程需要找到相机的内参和面镜的外参。该广角相机模型将成像系统作为了一个独特的紧凑系统,也就是说,它并不关心在组合相机内使用的是面镜还是鱼眼透镜。
值得注意的是,在此坐标系中,xxx 和 uuu 方向向下,yyy 和 vvv 方向向右,zzz 轴透过纸面向外:这与针孔相机模型是相反的。因此在求 NZN_ZNZ 的时候为负值。
4.5.2 Scara模型假设
该模型基于以下假设:
- 面镜相机系统是 central 系统,因此,在面镜上存在一个点,每条反射光线都在这个点上相交。这个点被认为是摄像机坐标系 XYZ 的轴原点。
- 假设相机和面镜的轴被很好的对齐,也就是说,只有很小的旋转偏差被考虑到模型中。(不考虑切向畸变的意思?)
- 面镜相对于它的轴是旋转对称的。
- 模型中没有考虑相机的透镜畸变,因为广角相机使用的面镜通常需要大的焦距在面镜上聚焦图像。因此,透镜的失真可以被忽略。如果你使用鱼眼镜头,相机镜头畸变已经被集成在了投影函数fff里面。
4.5.3 Scara模型
假设假设2是完全符合的,即相机和面镜轴完全的对齐。令ppp为图像的像素点,(u,v)(u,v)(u,v)是它相对于全向图像中心的像素坐标。设PPP是它对应的从单有效视点发出的三维向量,(x,y,z)(x,y,z)(x,y,z)是它相对于坐标轴原点的坐标。
因为相机和面镜轴假设为完美对齐,因此 xxx 和 yyy 分别与 uuu 和 vvv 成比例:
[xy]=α⋅[uv],α>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
我们想要标定估计的函数是将图像点 ppp 映射到其对应的 3D3D3D 向量 PPP 的函数。写成:
P=[xyz]=[α⋅uα⋅vf(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α包含进函数fff,因此可以同等的写成:
P=[xyz]=[uvf(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)⎦⎤
事实上,需要注意的是,PPP 并不是一个 3D3D3D 点,而是一个向量,因此前面的简化是被允许的。
而且,因为面镜是旋转对称的,函数 f(u,v)f(u,v)f(u,v) 仅取决于点到图像中心的距离 ρ=u2+v2\rho=\sqrt{u^{2}+v^{2}}ρ=u2+v2。
因此,我们仍可以将上述的方程简化为:
P=[xyz]=[uvf(ρ)]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(ρ)=a0+a1ρ+a2ρ2+a3ρ3+a4ρ4+…f(\rho)=a_{0}+a_{1} \rho+a_{2} \rho^{2}+a_{3} \rho^{3}+a_{4} \rho^{4}+\ldotsf(ρ)=a0+a1ρ+a2ρ2+a3ρ3+a4ρ4+…
所以需要估计的参数为:a1a_1a1, a2a_2a2, a3a_3a3, …该方法可以指定多项式的幂。但是在此使用四次幂也许可以得到最佳的标定结果。
值得注意的是,经过标定你会发现 a1=0a_1=0a1=0,这是因为,通过观察上图投影模型你会发现,当 f(ρ)f(\rho)f(ρ)取极大值时,图像坐标 x=y=0x=y=0x=y=0,也就是入射角为0度,f(ρ)f(\rho)f(ρ) 取导数,f′(ρ)=0f'(\rho) = 0f′(ρ)=0,ρ=u2+v2=0\rho = \sqrt{u^2 + v^2} = 0ρ=u2+v2=0, 那么 a1=0a_1=0a1=0。
在 world2cam 的时候,θ=arctan(x2+y2z2)\theta = arctan(\frac{x^2+y^2}{z^2})θ=arctan(z2x2+y2),这样可以求出入射光的夹角,通过夹角,可以求出在成像平面上,点到图像中心的距离(就是之前 cam2world 的反向)。即:
ρ=a0+a1θ+a2θ2+a3θ3+...\rho = a_0 + a_1\theta + a_2\theta^2 + a_3\theta^3 + ...ρ=a0+a1θ+a2θ2+a3θ3+...
后可以通过公式,可以反向求得在成像平面上的位置:
u=xx2+y2,v=yx2+y2∗ρu = \frac{x}{\sqrt{x^2+y^2}}, v = \frac{y}{\sqrt{x^2+y^2}} * \rho u=x2+y2x,v=x2+y2y∗ρ
其中 xx2+y2\frac{x}{\sqrt{x^2+y^2}}x2+y2x 为归一化,即求得在图像中的方向;ρ\rhoρ 为图像中离中心的距离。
4.5.4 Scara完整模型
在之前的模型中,我们假设相机和面镜轴完美对齐。实际上,由于相机-镜子设置的自然误差,可能会出现与这一假设的小偏差。此外,由于相机的数字化过程,像素也许不是正方形的。这些问题的自然结果是,镜面的圆形外边界呈现为椭圆,如下图所示:
为了考虑到这些因素,对对准误差做了建模,并通过仿射变换对 artefact 做了数字化。
[u′v′]=[cde1][uv]+[xc′yc′]\left[\begin{array}{l} u' \\ v' \end{array}\right]=\left[\begin{array}{ll} c & d \\ e & 1 \end{array}\right] \left[\begin{array}{l} u \\ v \end{array}\right]+\left[\begin{array}{l} x c' \\ y c' \end{array}\right][u′v′]=[ced1][uv]+[xc′yc′]
这个方程将真实扭曲的坐标(u′,v′)(u',v')(u′,v′)与理想的未失真的坐标(u,v)(u,v)(u,v)联系起来。
常用相机投影及畸变模型(针孔|广角|鱼眼)相关推荐
- 2.3ORBSLAM3之相机模型与畸变模型
1.简介 主要内容: 1. 对SLAM中常见的相机模型进行介绍,包括针孔相机模型和鱼眼相机模型 2. 对每种相机模型的畸变模型进行介绍 3. 对VSLAM中常见的几种去畸变方法进行介绍 4. 对常见的 ...
- 相机畸变模型及去畸变计算
透镜 实际成像时,如果小孔过小,则入射光的强度会受到影响,进一步会影响到成像. 另一方面,由于光的波动性,在小孔的边缘上,光将发生衍射,因此,这些光将在像平面上"散播".当小孔变的 ...
- 【鱼眼相机模型】鱼眼相机投影模型理解
一.从普通镜头到鱼眼镜头 如图1所示,普通镜头下的光线依据针孔相机模型进行成像(该部分可参考相机投影关系).但该模型存在一个缺陷:相机视野范围越大,所需的成像平面也越大,当相机视野范围要求在180°时 ...
- 相机标定(二)之相机畸变模型
一.相机畸变 定义:相机镜头的畸变实际上是光学透镜固有的透视失真的总称. 相机畸变的分类: 1.枕形畸变:又称鞍形形变,视野中边缘区域的放大率远大于光轴中心区域的放大率,常用在远摄镜头中(下图左): ...
- 相机标定:相机模型和畸变模型
一.相机标定方案 相机内参标定是确定内参和畸变参数(equidistqant畸变模型)或者(radial tangential模型)的过程. 本文首先介绍SLAM中常用的相机模型和畸变模型,随后介绍我 ...
- 相机投影原理、相机模型中的坐标系统以及标定方法(转载)
文章目录 0 引言 1 相机投影中的坐标系及其转换关系 1.1 世界坐标系与相机坐标系 1.2 相机坐标系与图像坐标系:称为摄像机模型以及投影矩阵 1.3 图像坐标系与像素坐标系 1.4 从世界坐标系 ...
- 针孔相机投影模型以及畸变模型
Overview 欢迎访问 持续更新:https://cgabc.xyz/posts/ff73e084/ 世界坐标系 到 像素坐标系 世界坐标系中三维点M=[X,Y,Z]TM=[X,Y,Z]^TM=[ ...
- python 正方形去畸变_opencv 角点检测+相机标定+去畸变+重投影误差计算
https://blog.csdn.net/u010128736/article/details/52875137 https://blog.csdn.net/h532600610/article/d ...
- 从普通相机模型到鱼眼畸变模型--标定与去畸变
目录 普通相机模型 普通成像模型 针孔模型与透镜组: 径向畸变 切向畸变 现代手机摄像头的基本组成 内参矩阵 畸变模型 张氏标定法 鱼眼模型 透镜组 r和f的进一步说明 等距投影模型(OpenCV:: ...
- 机器视觉-相机标定及畸变矫正
摘要:本文首先介绍了针孔相机模型(线性模型),然后推导四个坐标轴变换的关系,引出R.T.K.D中包含相机的5个内参,6个外参.然后介绍相机畸变的原因以及畸变模型(非线性模型),引出相机的5个畸变参数. ...
最新文章
- C#自定义控件在添加引用后不显示在工具箱的解决方法
- Java 技术篇-借助自定义对象实现函数返回多个不同类型的值实例演示
- 编程之美-一摞烙饼的排序方法整理
- Sklearn:sklearn.preprocessing之StandardScaler 的transform()函数和fit_transform()函数清晰讲解及其案例应用
- 【面试福利篇】英文面试的相关资料
- Python Django模板templates渲染及配置
- 关于内存的划分和传引用传参数的区别
- Java高级进阶学习资料!java开发环境的搭建是什么意思
- 前端学习(756):javascript预解析
- mysql工作台安装使用_如何安装MySQL工作台?
- itunes备份包括哪些内容_建筑工程的招标包括哪些内容?
- xstream-0 使用入门
- haartraining生成.xml过程
- netstat 命令详解
- pp助手苹果版_PP助手将下架?越狱时代已经过去,到底是该喜该悲
- 发票勾选平台:验证口令失败--加密模块未打开(0x23) (错误代码:35)
- mysql的第一次作业_数据库原理第一次作业-答案
- WPF 一个简单的颜色选择器
- 前端-HTML基础入门
- 【Linux】常用命令:网络、内存、cron 超详细介绍
热门文章
- 常见的meta标签用法
- 基于vue transform: translateY 上下滑动实现
- 米家扫地机器人尘盒怎么取_米家扫地机器人怎么清理灰尘盒
- 手机上最好用的五笔输入法_最欠揍的手机输入法,用不好失业又失恋
- scrapy settings和管道的深入
- 在Exchange server 2007中管理pop3和IMAP4协议访问
- 字体小三、小四号字的数字表示是多少
- [模型调研]实体消歧
- openGPS.cn - 高精度IP定位原理,定位误差说明
- 彻底解决SysFader:IEXPLORE.EXE应用程序错误