光圈(Aperture)与景深(Depth of Field):光圈可以看做是小孔成像模型中的孔径,光圈越大进光面积就会越大。
θ = a r c t a n ( d 2 / f ) \theta = arctan(\frac{d}{2}/f) θ=arctan(2d/f)
视野取决与两个因素:成像平面(Sensor)的大小、焦距。焦距越大视野越小。
透视投影(Perspective Projection)是最常用的成像模型,可以用针孔成像模型来近似表示。透视投影成像模型的特点是所有来自场景的光线均通过一个投影中心,它对应于透镜的中心,经过投影中心且垂直于图像平面(成像平面)的直线称为投影轴或光轴。
相机的镜头是一组透镜,当平行于主光轴的光线穿过透镜时,会聚到一点上,这个点叫做焦点,焦点到透镜中心的距离叫做焦距 f f f。数码相机的镜头相当于一个凸透镜,感光元件就处在这个凸透镜的焦点附近,将焦距近似为凸透镜中心到感光元件的距离时就成为小孔成像模型。
世界坐标系是客观三维世界的绝对坐标系,也称客观坐标系。因为数码相机安放在三维空间中,我们需要世界坐标系这个基准坐标系来描述数码相机的位置,并且用它来描述安放在此三维环境中的其他任何物体的位置,用 ( X w , Y w , Z w ) (X_w, Y_w, Z_w) (Xw,Yw,Zw)表示其坐标值,单位是长度单位。
相机坐标系是以相机的光心为坐标原点, X X X轴和 Y Y Y轴分别平行于图像坐标系的 X X X轴和 Y Y Y轴,相机的光轴为 Z Z Z轴,用 ( X c , Y c , Z c ) (X_c, Y_c, Z_c) (Xc,Yc,Zc)表示其坐标值,单位是长度单位。
以CCD图像平面的中心为坐标原点,或者说以主光轴和图像平面交点为坐标原点, X X X轴和 Y Y Y轴分别平行于图像平面的两条垂直边,用 ( x , y ) (x, y) (x,y)表示其坐标值,单位是长度单位。图像坐标系是用物理单位(例如毫米)表示像素在图像中的位置,也叫图像物理坐标系。
以CCD图像平面的左上角顶点为原点, X X X轴和 Y Y Y轴分别平行于图像坐标系的 X X X轴和 Y Y Y轴,用 ( u , v ) (u, v) (u,v)表示其坐标值,单位以像素计。数码相机采集的图像首先是形成标准电信号的形式,然后再通过模数转换变换为数字图像。每幅图像的存储形式是 M ∗ N M*N M∗N的数组, M M M行 N N N列的图像中的每一个元素的数值代表的是图像点的灰度。这样的每个元素叫像素,像素坐标系就是以像素为单位的图像坐标系,也叫图像像素坐标系。
CCD 是英语 Charge Coupled Device(电荷耦合元件)的缩写,是一种将图像转换为电信号的半导体元件。大小约为长宽各 1 厘米左右,由类似棋盘的格状排列的小像素 (pixel) 组成。
用相机拍摄风景时,拍摄对象发出的光通过镜头在 CCD 上成像。光到达 CCD 的某个像素时,将根据光的强度产生相应的电荷。将该电荷的大小读取为电信号,即可获得各像素上光的强度(浓度值)。
换言之,每个像素都是一个可以检测光强度的传感器(光电二极管)。所谓 200 万像素 CCD 就是一个由 200 万个光电二极管构成的集合体。
除了CCD之外,摄像头的传感器还有CMOS(Complementary Metal-Oxide Semiconductor,金属氧化物半导体元件)和CIS(Contact Image Sensor,接触式图像传感器)等类型。
图像在计算机中以矩阵形式存储(二维数组) ,需要对感光度量化成数值,例如0~255之间的整数(彩色图像还有通道) 。
世界坐标系—>相机坐标系—>图像坐标系—>像素坐标系
从世界坐标系到相机坐标系的,为刚体变换,反应了物体与相机的相对运动关系。 P w ( X w , Y w , Z w ) − − > P c ( X c , Y c , Z c ) P_w(X_w, Y_w, Z_w)-->P_c(X_c, Y_c, Z_c) Pw(Xw,Yw,Zw)−−>Pc(Xc,Yc,Zc)
[ X c Y c Z c 1 ] = [ R t 0 T 1 ] [ X w Y w Z w 1 ] \left[ \begin{matrix} X_c\\ Y_c\\ Z_c\\ 1 \end{matrix} \right]= \left[ \begin{matrix} R & t\\ 0^T & 1 \end{matrix} \right] \left[ \begin{matrix} X_w\\ Y_w\\ Z_w\\ 1 \end{matrix} \right] ⎣⎢⎢⎡XcYcZc1⎦⎥⎥⎤=[R0Tt1]⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤
有6个自由度,这6个参数称为相机的外参(Extrinsic)。
式中, R R R为 3 ∗ 3 3*3 3∗3的正交旋转矩阵, t t t为三维平移向量。
在三维空间中,旋转可以分解为绕各自坐标轴的二维旋转,如果依次绕 x , y , z x,y,z x,y,z轴旋转角度,则旋转可以表示为:
R x ( α ) = [ 1 0 0 0 c o s α s i n α 0 − s i n α c o s α ] R_x(\alpha) = \left[ \begin{matrix} 1 & 0 & 0 \\ 0 & cos\alpha & sin\alpha \\ 0 & -sin\alpha & cos\alpha \end{matrix} \right] Rx(α)=⎣⎡1000cosα−sinα0sinαcosα⎦⎤
R y ( β ) = [ c o s β 0 − s i n β 0 1 0 s i n β 0 c o s β ] R_y(\beta) = \left[ \begin{matrix} cos\beta & 0 & -sin\beta \\ 0 & 1 & 0 \\ sin\beta & 0 & cos\beta \end{matrix} \right] Ry(β)=⎣⎡cosβ0sinβ010−sinβ0cosβ⎦⎤
R z ( γ ) = [ c o s γ s i n γ 0 − s i n γ c o s γ 0 0 0 1 ] R_z(\gamma) = \left[ \begin{matrix} cos\gamma & sin\gamma & 0 \\ -sin\gamma & cos\gamma & 0 \\ 0 & 0 & 1 \end{matrix} \right] Rz(γ)=⎣⎡cosγ−sinγ0sinγcosγ0001⎦⎤
旋转矩阵 R R R可以表示为 R x , R y , R z R_x, R_y, R_z Rx,Ry,Rz的乘积,因此 R = R x ( α ) ∗ R y ( β ) ∗ R z ( γ ) R=R_x(\alpha)*R_y(\beta)*R_z(\gamma) R=Rx(α)∗Ry(β)∗Rz(γ).
t t t平移向量表示摄像机坐标原点在世界坐标系中的位置。
图像坐标系与相机坐标系的转换为:
x = f X c Z c y = f Y c Z c x = \frac{fX_c}{Z_c} \\ \ \\ y=\frac{fY_c}{Z_c} x=ZcfXc y=ZcfYc
其中 f f f为焦距(像平面与相机坐标系原点的距离)。用齐次坐标系和矩阵表示上述关系:
Z c [ x y 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X c Y c Z c 1 ] Z_c \left[ \begin{matrix} x\\ y\\ 1 \end{matrix} \right] = \left[ \begin{matrix} f & 0 & 0 & 0\\ 0 & f & 0 & 0\\ 0 & 0 & 1 & 0 \end{matrix} \right] \left[ \begin{matrix} X_c\\ Y_c\\ Z_c\\ 1 \end{matrix} \right] Zc⎣⎡xy1⎦⎤=⎣⎡f000f0001000⎦⎤⎣⎢⎢⎡XcYcZc1⎦⎥⎥⎤
从相机坐标系到图像坐标系的投影只和相机的焦距 f f f有关,一个自由度。
他们之间的转换关系为:
u = x d x + u 0 v = y d y + v 0 u = \frac{x}{dx}+u_0 \\ \ \\ v=\frac{y}{dy}+v_0 u=dxx+u0 v=dyy+v0
采用齐次坐标再用矩阵形式将上式表示为:
[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ x y 1 ] \left[ \begin{matrix} u\\ v\\ 1 \end{matrix} \right] = \left[ \begin{matrix} \frac{1}{dx} & 0 & u_0\\ 0 & \frac{1}{dy} & v_0\\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} x\\ y\\ 1 \end{matrix} \right] ⎣⎡uv1⎦⎤=⎣⎡dx1000dy10u0v01⎦⎤⎣⎡xy1⎦⎤
其中 ( u 0 , v 0 ) (u_0, v_0) (u0,v0)是图像坐标系原点在像素坐标系中的坐标, d x dx dx 和 d y dy dy分别是每个像素在图像平面 x x x和 y y y方向上的物理尺寸。从图像坐标系到像素坐标系转换有4个自由度。
Z c [ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ R t 0 T 1 ] [ X w Y w Z w 1 ] Z_c \left[ \begin{matrix} u\\ v\\ 1 \end{matrix} \right] = \left[ \begin{matrix} \frac{1}{dx} & 0 & u_0\\ 0 & \frac{1}{dy} & v_0\\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} f & 0 & 0 & 0\\ 0 & f & 0 & 0\\ 0 & 0 & 1 & 0 \end{matrix} \right] \left[ \begin{matrix} R & t\\ 0^T & 1 \end{matrix} \right] \left[ \begin{matrix} X_w\\ Y_w\\ Z_w\\ 1 \end{matrix} \right] Zc⎣⎡uv1⎦⎤=⎣⎡dx1000dy10u0v01⎦⎤⎣⎡f000f0001000⎦⎤[R0Tt1]⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤
由上式可知,该模型中,内参有5个,外参有6个。
如果把 1 d x \frac{1}{dx} dx1和 1 d y \frac{1}{dy} dy1和 f f f相乘得到常用的 f x , f y f_x, f_y fx,fy,则内参有4个自由度,外参有6个自由度(3个旋转,3个平移)。
Z c [ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ R t 0 T 1 ] [ X w Y w Z w 1 ] = [ f x 0 u 0 0 0 f y v 0 0 0 0 1 0 ] [ R t 0 T 1 ] [ X w Y w Z w 1 ] = K ∗ M 1 [ X w Y w Z w 1 ] = M [ X w Y w Z w 1 ] = [ m 11 m 12 m 13 m 14 m 21 m 22 m 23 m 24 m 31 m 32 m 33 m 34 ] [ X w Y w Z w 1 ] Z_c \left[ \begin{matrix} u\\ v\\ 1 \end{matrix} \right] = \left[ \begin{matrix} \frac{1}{dx} & 0 & u_0\\ 0 & \frac{1}{dy} & v_0\\ 0 & 0 & 1 \end{matrix} \right] \left[ \begin{matrix} f & 0 & 0 & 0\\ 0 & f & 0 & 0\\ 0 & 0 & 1 & 0 \end{matrix} \right] \left[ \begin{matrix} R & t\\ 0^T & 1 \end{matrix} \right] \left[ \begin{matrix} X_w\\ Y_w\\ Z_w\\ 1 \end{matrix} \right] = \left[ \begin{matrix} f_x & 0 & u_0 & 0\\ 0 & f_y & v_0 & 0\\ 0 & 0 & 1 & 0 \end{matrix} \right] \left[ \begin{matrix} R & t\\ 0^T & 1 \end{matrix} \right] \left[ \begin{matrix} X_w\\ Y_w\\ Z_w\\ 1 \end{matrix} \right] \\ \ \\= K*M1 \left[ \begin{matrix} X_w\\ Y_w\\ Z_w\\ 1 \end{matrix} \right] = M \left[ \begin{matrix} X_w\\ Y_w\\ Z_w\\ 1 \end{matrix} \right] = \left[ \begin{matrix} m_{11} & m_{12} & m_{13} & m_{14}\\ m_{21} & m_{22} & m_{23} & m_{24}\\ m_{31} & m_{32} & m_{33} & m_{34} \end{matrix} \right] \left[ \begin{matrix} X_w\\ Y_w\\ Z_w\\ 1 \end{matrix} \right] Zc⎣⎡uv1⎦⎤=⎣⎡dx1000dy10u0v01⎦⎤⎣⎡f000f0001000⎦⎤[R0Tt1]⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤=⎣⎡fx000fy0u0v01000⎦⎤[R0Tt1]⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤ =K∗M1⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤=M⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤=⎣⎡m11m21m31m12m22m32m13m23m33m14m24m34⎦⎤⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤
其中,
f x = f d x f y = f d y K = [ f x 0 0 0 0 f y 0 0 0 0 1 0 ] M 1 = [ R t 0 T 1 ] f_x = \frac{f}{dx} \ \\ \ \\ f_y = \frac{f}{dy} \ \\ \ \\ K = \left[ \begin{matrix} f_x & 0 & 0 & 0\\ 0 & f_y & 0 & 0\\ 0 & 0 & 1 & 0 \end{matrix} \right] \ \\ \ \\ M1 = \left[ \begin{matrix} R & t\\ 0^T & 1 \end{matrix} \right] fx=dxf fy=dyf K=⎣⎡fx000fy0001000⎦⎤ M1=[R0Tt1]
f x , f y f_x, f_y fx,fy分别是图像水平轴和垂直轴的尺度因子。 K K K的参数中只包含焦距、主点坐标等,只由相机的内部结构决定,因此称 K K K 为内部参数矩阵, f x , f y , u 0 , v 0 f_x, f_y, u_0, v_0 fx,fy,u0,v0叫做内部参数。 M 1 M1 M1中包含的旋转矩阵和平移向量是由相机坐标系相对于世界坐标系的位置决定的,因此称 M 1 M1 M1为相机的外部参数矩阵, R R R和 t t t叫做外部参数, M M M叫投影矩阵。相机标定就是确定相机的内部参数和外部参数。
理想的透视模型是针孔成像模型,物和像会满足相似三角形的关系。但是实际上由于相机光学系统存在加工和装配的误差,透镜就并不能满足物和像成相似三角形的关系,所以相机图像平面上实际所成的像与理想成像之间会存在畸变。畸变属于成像的几何失真,是由于像平面上不同区域对图像的放大率不同形成的画面扭曲变形的现象,这种变形的程度从画面中心至画面边缘依次递增,主要在画面边缘反映比较明显。为了减小畸变,拍摄图片时应尽量避免用镜头焦距的最广角端或最远端拍摄。
总之,引起畸变的两个主要因素:
1、透镜形状:径向畸变
2、透镜与成像平面不平行:切向畸变
径向畸变如下图:
对于象平面中的点,其畸变可由下图说明。
dr:径向畸变
dt:切向畸变
径向畸变:
x c o r r e c t e d ′ = x ′ ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y c o r r e c t e d ′ = y ′ ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) x_{corrected}' = x'(1+k_1r^2+k_2r^4+k_3r^6) \ \\ \ \\ y_{corrected}' = y'(1+k_1r^2+k_2r^4+k_3r^6) xcorrected′=x′(1+k1r2+k2r4+k3r6) ycorrected′=y′(1+k1r2+k2r4+k3r6)
切向畸变:
x c o r r e c t e d ′ = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) y c o r r e c t e d ′ = y + p 1 ( x 2 + 2 y 2 ) + 2 p 2 x y x_{corrected}' = x+2p_1xy+p_2(r^2+2x^2) \ \\ \ \\ y_{corrected}' = y+p_1(x^2+2y^2)+2p_2xy xcorrected′=x+2p1xy+p2(r2+2x2) ycorrected′=y+p1(x2+2y2)+2p2xy
其中 m r ( x r , y r ) m_r(x_r, y_r) mr(xr,yr)表示实际投影点的像平面坐标系下的物理坐标, m i ( x i , y i ) m_i(x_i, y_i) mi(xi,yi)表示理想投影点的像平面坐标系下的物理坐标。镜头的畸变模型可表示为:
{ x i = x r + σ x y i = y r + σ y \begin{cases} x_i = x_r + \sigma_x \\ \ \\ y_i = y_r + \sigma_y \end{cases} ⎩⎪⎨⎪⎧xi=xr+σx yi=yr+σy
σ x \sigma_x σx和 σ y \sigma_y σy是非线性畸变值,它包括径向畸变,偏心畸变和薄棱镜畸变等。
理论上来说镜头都存在径向和切向畸变,但是通常径向畸变较大,切向畸变较小。径向畸变的模型可由下面的模型来表示:
{ σ x = x r ( k 1 r 2 + k 2 r 4 + ⋅ ⋅ ⋅ ) σ y = y r ( k 1 r 2 + k 2 r 4 + ⋅ ⋅ ⋅ ) \begin{cases} \sigma_x = x_r(k_1r^2+k_2r^4+···)\\ \ \\ \sigma_y = y_r(k_1r^2+k_2r^4+···) \end{cases} ⎩⎪⎨⎪⎧σx=xr(k1r2+k2r4+⋅⋅⋅) σy=yr(k1r2+k2r4+⋅⋅⋅)
其中, k 1 , k 2 , k 3 ⋅ ⋅ ⋅ k_1, k_2, k_3··· k1,k2,k3⋅⋅⋅表示径向畸变系数, r = x r 2 + y r 2 r=\sqrt{x_r^2+y_r^2} r=xr2+yr2;通常情况下径向畸变系数只考虑到一阶或二阶就可以满足精度需求了。
偏心畸变模型是由于多个光学镜头的光轴不能完全共线产生的,这种畸变是由径向和切向畸变共同构成的,数学模型可表示如下:
{ σ x = p 1 x r ( 3 x r 2 + y r 2 ) + 2 p 2 x r y r + o [ ( x r , y r ) 4 ] σ y = p 2 x r ( 3 x r 2 + y r 2 ) + 2 p 1 x r y r + o [ ( x r , y r ) 4 ] \begin{cases} \sigma_x = p_1x_r(3x_r^2+y_r^2)+2p_2x_ry_r+o[(x_r, y_r)^4]\\ \ \\ \sigma_y = p_2x_r(3x_r^2+y_r^2)+2p_1x_ry_r+o[(x_r, y_r)^4] \end{cases} ⎩⎪⎨⎪⎧σx=p1xr(3xr2+yr2)+2p2xryr+o[(xr,yr)4] σy=p2xr(3xr2+yr2)+2p1xryr+o[(xr,yr)4]
其中 p 1 , p 2 p_1, p_2 p1,p2为切向畸变系数。
薄棱镜畸变是由于镜头设计制造缺陷和加工安装所造成的,如镜头与相机成像平面有一个很小的倾角等。因为薄棱镜畸变非常小,通常不考虑,这里只考虑径向畸变和偏心畸变,总的可以表示为:
{ x i = x r + x r ( k 1 r 2 + k 2 r 4 ) + p 1 x r ( 3 x r 2 + y r 2 ) + 2 p 2 x r y r y i = y r + y r ( k 1 r 2 + k 2 r 4 ) + p 2 x r ( 3 x r 2 + y r 2 ) + 2 p 1 x r y r \begin{cases} x_i = x_r+x_r(k_1r^2+k_2r^4)+p_1x_r(3x_r^2+y_r^2)+2p_2x_ry_r\\ \ \\ y_i = y_r+y_r(k_1r^2+k_2r^4)+p_2x_r(3x_r^2+y_r^2)+2p_1x_ry_r \end{cases} ⎩⎪⎨⎪⎧xi=xr+xr(k1r2+k2r4)+p1xr(3xr2+yr2)+2p2xryr yi=yr+yr(k1r2+k2r4)+p2xr(3xr2+yr2)+2p1xryr
实际的成像模型为:
{ u = f x ( x r + x r ( k 1 r 2 + k 2 r 4 ) + p 1 x r ( 3 x r 2 + y r 2 ) + 2 p 2 x r y r ) + u 0 v = f y ( y r + y r ( k 1 r 2 + k 2 r 4 ) + p 2 x r ( 3 x r 2 + y r 2 ) + 2 p 1 x r y r ) + v 0 \begin{cases} u = f_x(x_r+x_r(k_1r^2+k_2r^4)+p_1x_r(3x_r^2+y_r^2)+2p_2x_ry_r)+u_0 \\ \ \\ v = f_y(y_r+y_r(k_1r^2+k_2r^4)+p_2x_r(3x_r^2+y_r^2)+2p_1x_ry_r)+v_0 \end{cases} ⎩⎪⎨⎪⎧u=fx(xr+xr(k1r2+k2r4)+p1xr(3xr2+yr2)+2p2xryr)+u0 v=fy(yr+yr(k1r2+k2r4)+p2xr(3xr2+yr2)+2p1xryr)+v0
针孔相机模型描述了单个相机的成像模型。然而,仅根据一个像素,我们是无法确定这个空间点的具体位置的。这是因为,从相机光心到归一化平面连线上的所有点,都可以投影至该像素上。只有当 P P P 的深度确定时(比如通过双目或 RGBD 相机),我们才能确切地知道它的空间位置。
测量像素距离(或深度)的方式有很多种,像人眼就可以根据左右眼看到的景物差异(或称视差)来判断物体与我们的距离。双目相机的原理亦是如此。通过同步采集左右相机的图像,计算图像间视差,来估计每一个像素的深度。双目相机一般由左眼和右眼两个水平放置的相机组成。当然也可以做成上下两个目,但我们见到的主流双目都是做成左右的。在左右双目的相机中,我们可以把两个相机都看作针孔相机。它们是水平放置的,意味两个相机的光圈中心都位于 x 轴上。它们的距离称为双目相机的基线(Baseline, 记作 b b b),是双目的重要参数。
现在,考虑一个空间点 P P P ,它在左眼和右眼各成一像,记作 P L P_L PL, P R P_R PR。由于相机基线的存在,这两个成像位置是不同的。理想情况下,由于左右相机只有在 x x x 轴上有位移,因此 P P P 的像也只在 x x x 上有差异。我们记它在左侧的坐标为 u L u_L uL ,右侧坐标为 u R u_R uR 。
z − f z = b − u L + u R b \frac{z-f}{z} = \frac{b-u_L+u_R}{b} zz−f=bb−uL+uR
稍加整理,得:
z = f b d , d = u L − u R z = \frac{fb}{d}, d=u_L-u_R z=dfb,d=uL−uR
这里 d d d 为左右图的横坐标之差,称为视差(Disparity)。根据视差,我们可以估计一个像素离相机的距离。视差与距离成反比:视差越大,距离越近 。同时,由于视差最小为一个像素,于是双目的深度存在一个理论上的最大值,由 f b fb fb确定。我们看到,当基线越长时,双目最大能测到的距离就会变远;反之,小型双目器件则只能测量很近的距离。