> 文章列表 > 针孔相机模型

针孔相机模型

针孔相机模型

1. 针孔相机的成像原理

针孔相机模型

2. 相机的内参矩阵

针孔相机模型

针孔相机模型

这样,我们就可以建立三个坐标系

  1. 相机坐标系,三维,以相机光心为原点,水平向右为X轴,垂直向上为Y轴,视线向前为Z轴,符合右手规则。单位是米。
  2. 视平面坐标系,二维,相机靶面(即成像平面)的对称面所在的平面,靶心为原点,X轴和Y轴与相机坐标系同向。单位是米。
  3. 照片坐标系,二维,照片左上角为原点,水平向右为X轴,垂直向下为Y轴。单位是像素。

假设相机坐标系下一点的坐标是 ( X c , Y c , Z c ) (X_c,Y_c,Z_c) (Xc,Yc,Zc),对应到视平面坐标系下的坐标是 ( x , y ) (x,y) (x,y),则根据相似三角形,有:

Z c f = X c x = Y c y (1) \\frac{Z_c}{f}=\\frac{X_c}{x}=\\frac{Y_c}{y}\\tag{1} fZc=xXc=yYc(1)

也就是

{ x = f ∗ X c Z c y = f ∗ Y c Z c (2) \\begin{cases} x=f*\\frac{X_c}{Z_c} \\\\ y=f*\\frac{Y_c}{Z_c} \\end{cases}\\tag{2} {x=fZcXcy=fZcYc(2)

而视平面坐标系与照片坐标系之间是一个单纯的映射关系,首先我们要把米换算成像素,注意成像时,X,Y这两个方向的成像比例是不同的,假设X方向每米成像 a x a_x ax像素,Y方向每米成像 a y a_y ay像素,又假设照片的宽的 1 / 2 1/2 1/2 c x c_x cx,高的 1 / 2 1/2 1/2 c y c_y cy,则上面的视平面上的 ( x , y ) (x,y) (x,y)点对应在照片坐标系中的坐标是 ( u , v ) (u,v) (u,v),则有

{ u = a x ∗ x + c x v = − a y ∗ y + c y (3) \\begin{cases} u=a_x*x+c_x \\\\ v=-a_y*y+c_y \\end{cases}\\tag{3} {u=axx+cxv=ayy+cy(3)
综合式(2)和(3)我们有:

{ u = a x ∗ f ∗ X c Z c + c x v = − a y ∗ f ∗ Y c Z c + c y (4) \\begin{cases} u=a_x*f*\\frac{X_c}{Z_c}+c_x \\\\ v=-a_y*f*\\frac{Y_c}{Z_c}+c_y \\end{cases}\\tag{4} {u=axfZcXc+cxv=ayfZcYc+cy(4)

写成矩阵的形式就是:

[ u v 1 ] = [ a x ∗ f 0 c x 0 − a y ∗ f c y 0 0 1 ] ∗ [ X c Z c Y c Z c 1 ] (5) \\begin{bmatrix} u \\\\ v \\\\ 1 \\end{bmatrix} =\\begin{bmatrix} a_x*f & 0 &c_x \\\\ 0 & -a_y*f &c_y \\\\ 0 & 0 & 1 \\end{bmatrix}* \\begin{bmatrix} \\frac{X_c}{Z_c} \\\\ \\frac{Y_c}{Z_c} \\\\ 1 \\end{bmatrix} \\tag{5} uv1 = axf000ayf0cxcy1 ZcXcZcYc1 (5)

{ a x ∗ f = f x a y ∗ f = f y (6) \\begin{cases} a_x*f=f_x \\\\ a_y*f=f_y \\end{cases}\\tag{6} {axf=fxayf=fy(6)

则有
[ u v 1 ] = [ f x 0 c x 0 − f y c y 0 0 1 ] ∗ [ X c Z c Y c Z c 1 ] (7) \\begin{bmatrix} u \\\\ v \\\\ 1 \\end{bmatrix} =\\begin{bmatrix} f_x & 0 &c_x \\\\ 0 & -f_y &c_y \\\\ 0 & 0 & 1 \\end{bmatrix}* \\begin{bmatrix} \\frac{X_c}{Z_c} \\\\ \\frac{Y_c}{Z_c} \\\\ 1 \\end{bmatrix} \\tag{7} uv1 = fx000fy0cxcy1 ZcXcZcYc1 (7)
这就是由相机坐标系坐标转换为照片坐标系坐标的转换公式。
我们令
C = [ f x 0 c x 0 − f y c y 0 0 1 ] (8) C= \\begin{bmatrix} f_x & 0 &c_x \\\\ 0 & -f_y &c_y \\\\ 0 & 0 & 1 \\end{bmatrix}\\tag{8} C= fx000fy0cxcy1 (8)

这里面的各项参数都由相机本身来决定,成为相机的内参矩阵

因此(5)式可以写成
[ u v 1 ] = C ∗ [ X c Z c Y c Z c 1 ] (9) \\begin{bmatrix} u \\\\ v \\\\ 1 \\end{bmatrix} =C* \\begin{bmatrix} \\frac{X_c}{Z_c} \\\\ \\frac{Y_c}{Z_c} \\\\ 1 \\end{bmatrix} \\tag{9} uv1 =C ZcXcZcYc1 (9)

上面讲了,这是由相机坐标系坐标转换为照片坐标系坐标的转换公式。

由此我们也可以得到由照片坐标系坐标转换为相机坐标系坐标的转换公式:

[ X c Z c Y c Z c 1 ] = C − 1 ∗ [ u v 1 ] (10) \\begin{bmatrix} \\frac{X_c}{Z_c} \\\\ \\frac{Y_c}{Z_c} \\\\ 1 \\end{bmatrix} =C^{-1}* \\begin{bmatrix} u \\\\ v \\\\ 1 \\end{bmatrix} \\tag{10} ZcXcZcYc1 =C1 uv1 (10)

需要注意的是,我们只能得到 ( X c / Z c , Y c / Z c ) (X_c/Z_c, Y_c/Z_c) (Xc/Zc,Yc/Zc)的值,而不能得到 ( X c , Y c , Z c ) (X_c,Y_c,Z_c) (Xc,Yc,Zc)的值。

相机的外参矩阵

我们可以根据实际的应用场景根据右手规则定义恰当的世界坐标系。显然,在一般情况下世界坐标系和相机坐标系并不重合,它们之间的转换经过了X,Y,Z三个方向上的位移以及X,Y,Z三个方向上的旋转。因此我们可以定义由世界坐标系坐标转换为相机坐标系坐标的转换公式为:

[ X c Y c Z c 1 ] = [ W 00 W 01 W 02 W 03 W 10 W 11 W 12 W 13 W 20 W 21 W 22 W 23 0 0 0 1 ] ∗ [ X w Y w Z w 1 ] (11) \\begin{bmatrix} X_c \\\\ Y_c \\\\ Z_c \\\\ 1 \\end{bmatrix} =\\begin{bmatrix} W_{00} & W_{01} & W_{02} & W_{03} \\\\ W_{10} & W_{11} & W_{12} & W_{13} \\\\ W_{20} & W_{21} & W_{22} & W_{23} \\\\ 0 & 0 & 0 & 1 \\end{bmatrix}* \\begin{bmatrix} X_w \\\\ Y_w \\\\ Z_w \\\\ 1 \\end{bmatrix}\\tag{11} XcYcZc1 = W00W10W200W01W11W210W02W12W220W03W13W231 XwYwZw1 (11)

W = [ W 00 W 01 W 02 W 03 W 10 W 11 W 12 W 13 W 20 W 21 W 22 W 23 0 0 0 1 ] (12) W=\\begin{bmatrix} W_{00} & W_{01} & W_{02} & W_{03} \\\\ W_{10} & W_{11} & W_{12} & W_{13} \\\\ W_{20} & W_{21} & W_{22} & W_{23} \\\\ 0 & 0 & 0 & 1 \\end{bmatrix}\\tag{12} W= W00W10W200W01W11W210W02W12W220W03W13W231 (12)


[ X c Y c Z c 1 ] = W ∗ [ X w Y w Z w 1 ] (13) \\begin{bmatrix} X_c \\\\ Y_c \\\\ Z_c \\\\ 1 \\end{bmatrix} =W* \\begin{bmatrix} X_w \\\\ Y_w \\\\ Z_w \\\\ 1 \\end{bmatrix}\\tag{13} XcYcZc1 =W XwYwZw1 (13)

因此由相机坐标系坐标转换为世界坐标系坐标的转换公式为:

[ X w Y w Z w 1 ] = W − 1 ∗ [ X c Y c Z c 1 ] (14) \\begin{bmatrix} X_w \\\\ Y_w \\\\ Z_w \\\\ 1 \\end{bmatrix} =W^{-1}* \\begin{bmatrix} X_c \\\\ Y_c \\\\ Z_c \\\\ 1 \\end{bmatrix}\\tag{14} XwYwZw1 =W1 XcYcZc1 (14)

其中的矩阵 W W W是由相机在世界坐标系的位置以及相机在世界坐标系的X,Y,Z三个方向上的旋转来决定的,成为相机的外参矩阵

有了相机的外参矩阵和内参矩阵,对于一个世界坐标系坐标 ( X w , Y w , Z w ) (X_w,Y_w,Z_w) (Xw,Yw,Zw),我们就可以通过下面的算式将它转换为照片坐标系坐标:

先计算出相机坐标系坐标:
[ X c Y c Z c 1 ] = W ∗ [ X w Y w Z w 1 ] (15) \\begin{bmatrix} X_c \\\\ Y_c \\\\ Z_c \\\\ 1 \\end{bmatrix} =W* \\begin{bmatrix} X_w \\\\ Y_w \\\\ Z_w \\\\ 1 \\end{bmatrix}\\tag{15} XcYcZc1 =W XwYwZw1 (15)
然后再计算照片坐标系坐标:
[ u v 1 ] = C ∗ [ X c Z c Y c Z c 1 ] (16) \\begin{bmatrix} u \\\\ v \\\\ 1 \\end{bmatrix} =C* \\begin{bmatrix} \\frac{X_c}{Z_c} \\\\ \\frac{Y_c}{Z_c} \\\\ 1 \\end{bmatrix} \\tag{16} uv1 =C ZcXcZcYc1 (16)

(思考:怎样由照片坐标系坐标得到世界坐标系坐标呢?)

畸变矩阵

到目前为止,我们还没有考虑到相机的畸变。现在我们需要上述基本模型的基础上加上相机的畸变了。

相机的畸变有很多,主要的是径向畸变和切向畸变。

所谓径向畸变是沿径向产生的畸变,它产生的原因是光线在远离透镜中心的地方偏折更大,表现为桶形畸变或枕形畸变。

针孔相机模型

径向畸变的矫正公式为
{ 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 ) (17) \\begin{cases} x_{corrected}=x(1+k1r^2+k_2r^4+k_3r^6) \\\\ y_{corrected}=y(1+k1r^2+k_2r^4+k_3r^6) \\end{cases}\\tag{17} {xcorrected=x(1+k1r2+k2r4+k3r6)ycorrected=y(1+k1r2+k2r4+k3r6)(17)

切向畸变产生的原因是透镜不完全平行于图像平面。矫正公式为:

{ 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 ( r 2 + 2 y 2 ) + 2 p 2 x y ) (18) \\begin{cases} x_{corrected}=x+(2p_1xy+p_2(r^2+2x^2)) \\\\ y_{corrected}=y+(p_1(r_2+2y^2)+2p_2xy) \\end{cases}\\tag{18} {xcorrected=x+(2p1xy+p2(r2+2x2))ycorrected=y+(p1(r2+2y2)+2p2xy)(18)

这样,我们就得到了相机的5个畸变参数: D ( k 1 , k 2 , k 3 , p 1 , p 2 ) D(k_1,k_2,k_3,p_1,p_2) D(k1,k2,k3,p1,p2)

如果同时考虑两种畸变,则有:

{ x c o r r e c t e d = x + x ∗ ( k 1 ∗ r 2 + k 2 ∗ r 4 + k 2 ∗ r 6 ) + p 1 ∗ 2 ∗ x ∗ y + p 2 ∗ ( r 2 + 2 x 2 ) y c o r r e c t e d = y + y ∗ ( k 1 ∗ r 2 + k 2 ∗ r 4 + k 2 ∗ r 6 ) + p 1 ∗ ( r 2 + 2 y 2 ) + p 2 ∗ 2 ∗ x ∗ y (19) \\begin{cases} x_{corrected}=x+x*(k_1*r_2+k_2*r_4+k_2*r_6)+p_1*2*x*y+p_2*(r^2+2x^2) \\\\ y_{corrected}=y+y*(k_1*r_2+k_2*r_4+k_2*r_6)+p_1*(r_2+2y^2)+p_2*2*x*y \\end{cases}\\tag{19} {xcorrected=x+x(k1r2+k2r4+k2r6)+p12xy+p2(r2+2x2)ycorrected=y+y(k1r2+k2r4+k2r6)+p1(r2+2y2)+p22xy(19)
其中
r 2 = x 2 + y 2 r 4 = r 2 2 r 6 = r 2 3 (20) \\begin{aligned} r_2&=x^2+y^2 \\\\ r_4&=r_2^2\\\\ r_6&=r_2^3 \\end{aligned}\\tag{20} r2r4r6=x2+y2=r22=r23(20)

显然,畸变的矫正应该在视平面坐标系上完成:照片坐标系坐标转换为视平面坐标系坐标后,应用畸变矫正公式进行矫正,然后再转变为相机坐标系坐标;反之,在用相机坐标系坐标转换为视平面坐标系坐标后,应用上述矫正公式的逆过程进行畸变转换,然后再转变为照片坐标系坐标。

(思考:考虑畸变以后,怎样由照片坐标系坐标得到世界坐标系坐标呢?)