想着整理下相机模型(内容上参考 slam十四讲)、相机的内外参标定。方便自己的使用和回顾。
不过,内外参标定啥时候记录随缘 -_-
概述
【构建相机模型】
- 相机将三位世界中的坐标点(单位为米)映射到二维图像平面(单位为像素)的过程,使用一个集合模型进行描述。故使用针孔和畸变两个模型来描述整个投影过程。
- 最简单且常见的为针孔模型,他描述了一束光通过针孔后,在针孔背面投影成像的关系。
- 同时由于相机镜头上的透镜的存在,使得光线投影到成像平面过程中会产生畸变。
【单目相机成像过程】(这里先上最终的结论)
- 1 【世界坐标】世界坐标系下有点P,世界坐标为 PwP_wPw。
- 2 【相机坐标】相机在运动,对应的外参为 R、tR、tR、t。 点P的相机坐标为 Pc=RPw+tP_{c}=RP_w+tPc=RPw+t。
- 3 【归一化坐标】此时 Pc=(X,Y,Z)P_c=(X,Y,Z)Pc=(X,Y,Z),将点投影到归一化平面 Z=1Z=1Z=1 上,得到点P的归一化坐标为 Pc′=[X/Z,Y/Z,1]TP_c^{'}=[X/Z,Y/Z,1]^TPc′=[X/Z,Y/Z,1]T
- 4 【去畸变】存在畸变时,使用畸变参数计算 对应的坐标。
- 5 【像素坐标】通过内参矩阵,计算对应的像素坐标:P~uv=KPc′\tilde{P}_{uv}=KP_c^{'}P~uv=KPc′
【公式与图示】
在不考虑畸变的影响,可将整过过程写成表达式如下,目前变量都是欧式空间下的。sP~=K(RPw+t)s\tilde{P}=K(RP_w+t)sP~=K(RPw+t)
以及图示公式细节(s=Zcs=Z_cs=Zc,所以图示等号左边与最终的uv还有个s倍的关系)
- [Xw,Yw,zw]T[X_w,Y_w,z_w]^T[Xw,Yw,zw]T 为世界坐标系下某一点的物理坐标
- (u,v)(u,v)(u,v) 为该点在像素坐标系下的像素坐标;
- ZZZ 为尺度因子(表示该点距离成像孔的深度信息)
- (fdX,−fcotθdX,uo0, fdYsinθ,vo0, 0, 1)\begin{pmatrix}\frac{f}{dX}, \frac{-f\text{cot}\theta}{dX}, u_o\\0,\,\,\,\,\,\, \frac{f}{dY\text{sin}\theta}, v_o\\0,\,\,\,\,\,\,\,\,\,0,\,\,\,\,\,\,\,\,1\end{pmatrix}dXf,dX−fcotθ,uo0,dYsinθf,vo0,0,1 成为相机的内参矩阵,该矩阵取决于相机的内部参数。
- fff 为像距
dX,dYdX,dYdX,dY 分别表示 X,Y 方向上的一个像素在相机感光板上的物理长度(即一个像素在感光板上是多少毫米)
uo,vou_o, v_ouo,vo 分别表示相机感光板中心在像素坐标系下的坐标
θ\thetaθ 表示感光板的横边和纵边之间的角度(90°表示无误差)- RTR TRT 为相机的外参矩阵,可将在世界坐标系的目标点,通过旋转平移,转换到相机坐标系中。
1 针孔模型建模
小孔成像原理,成像平面的图像 为实际物品按照z轴旋转180度状态。在实际相机中,会将成像平面上倒转的图像处理成与3D目标,直观上是一致的。然后根据等边三角形相似原理,构建了一个 等效成像面,这样也简化了点 在坐标系的构建和空间与图像上映射时的坐标问题。
如下图
在上图中,构建3维坐标与2维坐标的转换中所需的坐标系(共四种)。
- 世界坐标系 owxwywzwo_wx_wy_wz_wowxwywzw
世界坐标系不是一个又明确定义的坐标系,可以任意制定一个字 “在当前场景下固定不变的坐标系” 作为世界坐标系。- 相机坐标系 ocxcyczco_cx_cy_cz_cocxcyczc
相机坐标系习惯上定义:假设手持相机,相机光心作为原点;右边为x轴正方向;下边为y轴正方向;相机前方为z轴正方向(拍摄远处的物体距离为正)。- 图像坐标系 oixiyio_ix_iy_ioixiyi
为二维坐标系。图像坐标系的原点位于感光芯片的中心(感光芯片是位于镜头背后的用于成像的小板子),x、y轴方向和相机坐标系的x、y轴相同。- 像素坐标系 opxpypo_px_py_popxpyp
像素坐标系也位于成像平面上,是图像坐标系通过平移和缩放得到的。值得注意是,不同的软件或者库对于像素坐标 (u,v) 的定义不一样。
我们先探究目标从 相机坐标系 转换到 图像坐标系的关系。
其中,3D点的坐标为 (Xc,Yc,Zc)(X_c,Y_c,Z_c)(Xc,Yc,Zc),图片上的2D坐标为 (Xi,Yi)(X_i, Y_i)(Xi,Yi)。则有Zcf=XcXi=YcYi\frac{Z_c}{f}=\frac{X_c}{X_i}=\frac{Y_c}{Y_i}fZc=XiXc=YiYc
2 相机内参
内参矩阵为相机坐标系下的3D坐标转换到像素坐标的变化关系。
相机坐标–> 图像坐标
通过上面的公式可以得到二者转换关系。其中 fff 为相机焦距。
Xi=fZcXcYi=fZcYc \begin{aligned} X_i &=\frac{f}{Z_c}X_c \\ Y_i &=\frac{f}{Z_c}Y_c \end{aligned} XiYi=ZcfXc=ZcfYc图像坐标–>像素坐标
图像坐标实连续值,而像素坐标是离散的正值,经过平移和缩放,得到两者之间的关系:
u=αXi+cxv=βYi+cy \begin{aligned} u &=\alpha X_i+c_x \\ v &=\beta Y_i+c_y \\ \end{aligned} uv=αXi+cx=βYi+cy
- α、β\alpha、\betaα、β 与实际传感器的物理尺寸相关,单位为 pixel每m。
cx、cyc_x、c_ycx、cy 为光心,单位为 pixel。
Xi,XjX_i, X_jXi,Xj 为 图像坐标系下的坐标,单位为 m。相机坐标–> 像素坐标
通过上面的公式,可得以下转换关系
u=αfZcXc+cx u=fxXcZc+cxv=βfZcYc+cy v=fyYcZc+cy \begin{aligned} u &=\alpha\frac{f}{Z_c}X_c+c_x\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,u =f_x\frac{X_c}{Z_c} +c_x\\ v &=\beta\frac{f}{Z_c}Y_c+c_y\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,v =f_y\frac{Y_c}{Z_c} +c_y \end{aligned} uv=αZcfXc+cxu=fxZcXc+cx=βZcfYc+cyv=fyZcYc+cy可以发现,当相机硬件固定下来,fx、fy、cx、cyf_x、f_y、c_x、c_yfx、fy、cx、cy 也就固定下来了。此时 uuu 与 XcX_cXc、vvv 与 YcY_cYc 的变化并不成正比,因为还存在ZcZ_cZc的变量。
为了公式更好的转换和表达,引入了齐次坐标(在原有的坐标维度额外补充1维,数值为1),在这里像素的齐次坐标为 P~uv\tilde{P}_{uv}P~uv。在相机的坐标转换过程中,是否使用齐次式主要取决于转换的复杂性和需要表示的信息类型。对于涉及平移、旋转、缩放等多种变换的复杂场景,以及需要表示无穷远点或区分点和向量的场合,使用齐次坐标可以更方便地实现坐标的线性转换和统一处理。然而,在计算资源受限或特定应用场景下,可能会选择不使用齐次坐标进行坐标转换。
则可将上面的表达式整理为(uv1)=1Zc(fx0cx0fycy001)(XcYcZc)\begin{pmatrix} u\\ v\\ 1 \end{pmatrix}=\frac{1}{Z_c}\begin{pmatrix} f_x & 0 & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{pmatrix}\begin{pmatrix} X_c\\ Y_c\\ Z_c \end{pmatrix} uv1=Zc1fx000fy0cxcy1XcYcZc该式中,将中间的定量组成的矩阵成为相机的内参数(Camera Intrinsic)矩阵K。通常认为,相机的内参在出厂之后是固定的,不会在使用过程中发生变化。
相机坐标转换到像素坐标的公式可记如下sP~uv=KPcs \tilde{P}_{uv} = KP_csP~uv=KPc其中s=Zcs=Z_cs=Zc,将该值记成s也是说明它为一个缩放尺度,为数值。从另一个角度考虑该投影过程。
相机坐标系下的点 除以最后一个维度(即该点距离相机成像平面的深度),即对最后一维度进行归一化处理,得到点P在相机的归一化平面上的归一化坐标。于是定义z=1z=1z=1为归一化平面,该平面上的点为归一化坐标 (Xc,Yc,Zc)−˜(Xc/Zc, Yc/Zc, 1)(X_c,Y_c,Z_c)\~{-}(X_c/Z_c, \,Y_c/Z_c,\,1)(Xc,Yc,Zc)−˜(Xc/Zc,Yc/Zc,1)注意:
- 另外,有时会引入一个 λ\lambdaλ 参数,来描述坐标轴垂直程度的误差(感光芯片的X,Y轴没有完全垂直)K=(fxλcx0fycy001) K= \begin{pmatrix} f_x & \lambda & c_x\\ 0 & f_y & c_y\\ 0 & 0 & 1 \end{pmatrix}\ K=fx00λfy0cxcy1
- 感光芯片的最小单位一般不是严格的正方形,所以得到的 fxf_xfx 和 fyf_yfy 不一定相等。
- K一般会由相机生产商提供,如果没有提供则可通过单目棋盘格张正友标定法进行获取,该过程被称作未内参标定。
- 实际使用XY坐标轴的不垂直误差不需要考虑
- 这个内参矩阵为小孔成像原理推导出来的,畸变模型后续进行介绍。
3 相机外参
外参矩阵描述的是,世界坐标系下的坐标转换为相机坐标系下的坐标的过程。这两个坐标系均为3维的,转换过程为旋转平移操作的刚体变换。
相机外参:旋转矩阵 R 为3x3,平移向量 t 为 3x1。
点P:相机坐标系下的坐标PcP_cPc为3x1,在世界坐标系下的坐标 PwP_wPw为 3x1,对应的齐次世界坐标 P~w\tilde{P}_{w}P~w为 4x1。
则有 Pc=RPw+tP_c=R P_w+tPc=RPw+t对应的齐次公式为Pc=[Rt]P~wP_c=\begin{bmatrix} R & t \end{bmatrix} \tilde{P}_{w}Pc=[Rt]P~w则,将世界坐标转换为像素坐标的完整的转换公式为sPuv=s[uv1]=K(RPw+t)s P_{uv}=s \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=K(RP_w+t)sPuv=suv1=K(RPw+t)
4 畸变
【畸变的分类】
为了更好的成像效果,在相机的前方加入了透镜,会对成像过程中光线的传播产生新的影响。
- 【径向畸变】透镜自身的形状对光线的传播产生的影响。
- 桶形畸变:放大率随着光轴之间的距离增加而减小。
- 枕形畸变:与桶形畸变刚好相反
- 【切向畸变】在机械组装过程中,透镜和成像平面不可能完全平行,对光的传播产生的映像。
【畸变的数学表达】
为了更好理解畸变,使用更严格的数学形式对这两者进行描述。
考虑归一化平面上的任意一点 p,它的坐标为 [x,y]T[x,y]^T[x,y]T,对应的极坐标形式为[r,θ]T[r,\theta]^T[r,θ]T,其中 rrr 表示点 p 与坐标系原点的距离,θ\thetaθ 表示与水平轴的夹角。通常假设这些畸变呈多项式关系。
- 径向畸变可以看成坐标点沿着长度方向发生了变化,即 点距离远点的长度发生了变化。xdistored=x(1+k1r2+k2r4+k3r6)ydistored=y(1+k1r2+k2r4+k3r6) \begin{aligned} x_{distored}& =x(1+k_1r^2+k_2r^4+k_3r^6) \\ y_{distored}& =y(1+k_1r^2+k_2r^4+k_3r^6) \end{aligned} xdistoredydistored=x(1+k1r2+k2r4+k3r6)=y(1+k1r2+k2r4+k3r6)
- 切向畸变可以看成坐标点沿着切线方向发生了变化,即 水平夹角发生了变化。
xdistored=x+2p1xy+p2(r2+2x2)ydistored=y+p1(r2+2y2)+2P2xy \begin{aligned} x_{distored}& =x+2p_1xy+p_2(r^2+2x^2) \\ y_{distored}& =y+p_1(r^2+2y^2)+2P_2xy \end{aligned} xdistoredydistored=x+2p1xy+p2(r2+2x2)=y+p1(r2+2y2)+2P2xy因此对于相机坐标系中的一点P,可通过5个畸变系数找到对应的像素平面上的正确位置。流程如下:
- 将三维空间点投影到归一化图像平面。设它的归一化坐标为 [x,y]T[x,y]^T[x,y]T
- 对于归一化平面上的点计算畸变 xdistored=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistored=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2P2xy \begin{aligned} x_{distored} = x(1+k_1r^2+k_2r^4+k_3r^6)+2p_1xy+p_2(r^2+2x^2) \\ y_{distored} = y(1+k_1r^2+k_2r^4+k_3r^6)+p_1(r^2+2y^2)+2P_2xy \end{aligned} xdistored=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistored=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2P2xy
- 将畸变后的点通过内参矩阵投影到像素平面,得到在图像上的 uv 坐标u=fxxdistorted+cxv=fyydistorted+cy \begin{aligned} u= f_xx_{distorted}+c_x \\ v = f_yy_{distorted}+c_y \end{aligned} u=fxxdistorted+cxv=fyydistorted+cy
【去畸变】
实际使用中,畸变矫正的做法:
- 先对整张图像进行去畸变,然后在该图像中讨论像素坐标与空间坐标的映射(更常用)
- 将畸变方程使用到3D点到畸变后图像的过程,会增加计算的麻烦程度