针孔相机、鱼眼相机模型推导

针孔相机、鱼眼相机模型

一、针孔相机模型

空间的三维物体要成像到相机的 CMOS/CCD 上面,形成了图像。图像上的每个点对应空间上的一个点。
将世界坐标系上的一点 (x,y,z)映射到CMOS/CCD图像坐标系上,只要两步:

  1. 世界坐标系的坐标转化到相机坐标系。
  2. 相机坐标系坐标转化到图像坐标系。

1.1 世界坐标系到相机坐标系

针孔相机、鱼眼相机模型推导
即要将世界坐标系上的点(Xw,Yw,Zw)T(X_w,Y_w,Z_w)^T 转化成相机坐标系上的点(Xc,Yc,Zc)T(X_c,Y_c,Z_c)^T
根据线性代数(计算机图形学)的知识可以知道,坐标系的转化只需要将原坐标乘以一个旋转矩阵再加上一个平移矩阵即可。公式如下:
[XcYcZc]=[R11R12R13R21R22R23R31R32R33][XwYwZw]+[t1t2t3]\left[ \begin{array}{l}{X_{c}} \\ {Y_{c}} \\ {Z_{c}}\end{array}\right]=\left[ \begin{array}{lll}{R_{11}} & {R_{12}} & {R_{13}} \\ {R_{21}} & {R_{22}} & {R_{23}} \\ {R_{31}} & {R_{32}} & {R_{33}}\end{array}\right] \left[ \begin{array}{l}{X_{w}} \\ {Y_{w}} \\ {Z_{w}}\end{array}\right]+\left[ \begin{array}{c}{t_{1}} \\ {t_{2}} \\ {t_{3}}\end{array}\right]
写成齐次矩阵的形式如下:
[XcYcZc1]=[R11R12R13t1R21R22R23t2R31R32R33t30001][XwYwZw1] \left[ \begin{array}{c}{X_{c}} \\ {Y_{c}} \\ {Z_{c}} \\ {1}\end{array}\right]=\left[ \begin{array}{cccc}{R_{11}} & {R_{12}} & {R_{13}} & {t_{1}} \\ {R_{21}} & {R_{22}} & {R_{23}} & {t_{2}} \\ {R_{31}} & {R_{32}} & {R_{33}} & {t_{3}} \\ {0} & {0} & {0} & {1}\end{array}\right] \left[ \begin{array}{c}{X_{w}} \\ {Y_{w}} \\ {Z_{w}} \\ {1}\end{array}\right]
平移矩阵有三个参数,分别是相机坐标系x,y,z轴相对于世界坐标系的位移
旋转矩阵也有三个参数,分别是相机坐标系x,y,z轴相对于世界坐标系的旋转角度
其中,旋转矩阵的具体形式如下:
[cos(β)cos(θ)cos(β)sin(θ)sin(β)cos(α)sin(θ)+sin(α)sin(β)cos(θ)cos(α)cos(θ)+sin(α)sin(β)sin(θ)sin(α)cos(β)sin(α)sin(θ)+cos(α)sin(β)cos(θ)sin(α)cos(θ)+cos(α)sin(β)sin(θ)cos(β)] \left[ \begin{array}{ccc}{\cos (\beta) \cos (\theta)} & {\cos (\beta) \sin (\theta)} & {-\sin (\beta)} \\ {-\cos (\alpha) \sin (\theta)+\sin (\alpha) \sin (\beta) \cos (\theta)} & {\cos (\alpha) \cos (\theta)+\sin (\alpha) \sin (\beta) \sin (\theta)} & {\sin (\alpha) \cos (\beta)} \\ {\sin (\alpha) \sin (\theta)+\cos (\alpha) \sin (\beta) \cos (\theta)} & {-\sin (\alpha) \cos (\theta)+\cos (\alpha) \sin (\beta) \sin (\theta)} & {\cos (\beta)}\end{array}\right]

α\alpha:x轴的旋转量. β\beta:y轴的旋转量. θ\theta:z轴的旋转量

相机的外参就是旋转矩阵的三个参数加上平移矩阵的三个参数。代表了相机相对于世界坐标系的位姿

1.2 相机坐标系坐标转化到图像坐标系

针孔相机、鱼眼相机模型推导针孔相机、鱼眼相机模型推导
相机坐标系上的点(X,Y,Z)T(X,Y,Z)^T 转化成图像坐标系上将会变成
(fXZ,fYZ)T\left(\frac{f X}{Z}, \frac{f Y}{Z}\right)^{T}
用齐次坐标表示相当于(X,Y,Z,1)T(fX,fY,Z)T(\mathrm{X}, \mathrm{Y}, \mathrm{Z}, 1)^{T} \rightarrow(f X, f Y, Z)^{T}
用矩阵乘法来表示:
(fX,fY,Z)T=(f0000f000010)(XYZ1) (f X, f Y, Z)^{T}=\left( \begin{array}{cccc}{f} & {0} & {0} & {0} \\ {0} & {f} & {0} & {0} \\ {0} & {0} & {1} & {0}\end{array}\right) \left( \begin{array}{l}{X} \\ {Y} \\ {Z} \\ {1}\end{array}\right)
如果相机的CMOS/CCD的位置不在像面的中心位置,则要添加两个参数pxp_xpyp_y
(fX+Zpx,fY+Zpy,Z)T=(f0px00fpy00010)(XYZ1) \left(f X+Z p_{x}, f Y+Z p_{y}, Z\right)^{T}=\left( \begin{array}{cccc}{f} & {0} & {p_{x}} & {0} \\ {0} & {f} & {p_{y}} & {0} \\ {0} & {0} & {1} & {0}\end{array}\right) \left( \begin{array}{l}{X} \\ {Y} \\ {Z} \\ {1}\end{array}\right)
现在我们能得到空间上的点在图像坐标系上的坐标位置,但是该坐标的单位是米,我们需要将其转化成像素单位,所以要有比例因子mxm_xmym_y
(fmxX+ZmxpxfmyY+ZmypyZ)=(fmx0mxpx00fmymypy00010)(XYZ1) \left( \begin{array}{c}{f m_{x} X+Z m_{x} p_{x}} \\ {f m_{y} Y+Z m_{y} p_{y}} \\ {Z}\end{array}\right)= \left( \begin{array}{cccc}{f_{m_{x}}} & {0} & {m_{x} p_{x}} & {0} \\ {0} & {f m_{y}} & {m_{y} p_{y}} & {0} \\ {0} & {0} & {1} & {0}\end{array}\right) \left( \begin{array}{l}{X} \\ {Y} \\ {Z} \\ {1}\end{array}\right)
如果相机CMOS的x轴和y轴不垂直,还要有一个参数ss
K=(αxSx00αyy0001) K=\left( \begin{array}{ccc}{\alpha_{x}} & {S} & {x_{0}} \\ {0} & {\alpha_{y}} & {y_{0}} \\ {0} & {0} & {1}\end{array}\right)
这就是相机的内参数矩阵。
空间的点PwP_w左乘一个旋转矩阵RR,加上旋转矩阵tt,得到了该点在相机坐标系上的坐标。再左乘相机的内参数矩阵KK就得到了该点在图像坐标系上的像素坐标。
P~c=[XYZ]=K(RPw+t) \tilde{P}_{c}=\left[ \begin{array}{c}{X} \\ {Y} \\ {Z}\end{array}\right]=K\left(R P_{w}+t\right)
至此,针孔相机模型推导完成。

二、鱼眼相机模型

针孔相机的模型为:rd=ftan(θ)r_{d}=f \tan (\theta)
鱼眼相机模型的公式表示为:rd=fθr_{d}=f \theta

鱼眼相机模型有多种,此处只选择了其中一种

类似针孔相机模型的推导,鱼眼相机成像也很简单。
首先,我们用上面的方法可以得到空间上的点在相机坐标系上的表示。
[XcYcZc1]=[R11R12R13t1R21R22R23t2R31R32R33t30001][XwYwZw1] \left[ \begin{array}{c}{X_{c}} \\ {Y_{c}} \\ {Z_{c}} \\ {1}\end{array}\right]=\left[ \begin{array}{cccc}{R_{11}} & {R_{12}} & {R_{13}} & {t_{1}} \\ {R_{21}} & {R_{22}} & {R_{23}} & {t_{2}} \\ {R_{31}} & {R_{32}} & {R_{33}} & {t_{3}} \\ {0} & {0} & {0} & {1}\end{array}\right] \left[ \begin{array}{c}{X_{w}} \\ {Y_{w}} \\ {Z_{w}} \\ {1}\end{array}\right]
简单推导可得:
θ=arctan[(Xc2+Yc2)1/2Zc] \theta=\arctan \left[\left(X_{c}^{2}+Y_{c}^{2}\right)^{1 / 2} \over Z_{c}\right]
这样,就可以得到该点在鱼眼相机图像坐标系上的位置了。
Xfish=ftan(θ)Xc(Xc2+Yc2)12 X_{fish} = ftan(\theta){X_c \over (X_{c}^{2}+Y_{c}^{2})^{1\over2}}
Yfish=ftan(θ)Yc(Xc2+Yc2)12 Y_{fish} = ftan(\theta){Y_c \over (X_{c}^{2}+Y_{c}^{2})^{1\over2}}