为什么需要校准相机?
- 现实世界是三维的,照片是二维的
- 相机(
视为广义函数
):输入三维场景,输出为二维图片(灰度值) - 彩色图是
RGB
每个通道都可以被视为灰度图 函数(映射关系)是不可逆的
,也就是说,我们不能从二维照片中恢复三维世界(二维照片没有深度信息)
相机校准:使用带pattern为了解决相机参数的过程
- 用简化的数学模型代表复杂的三维到二维成像过程
- 相机参数包括:
相机内参
(焦距)、相机外参
(旋转、平移矩阵),镜头的畸变参数
用途:畸变矫正、双眼视觉、结构光、三维重建、SLAM
,所有相机都需要校准并获得相机参数才能应用
坐标系变换
小孔成像原理
- 简单没镜头
- 有一个小光源 (蜡烛)
- 真实世界的3D物体通过光圈(小孔)发出光线
- 相机的另一侧,像平面位置一样,得到倒立的图像
坐标系介绍
必知专用术语:
世界坐标系(World Coords)
:点在现实世界中,描述相机的位置,单位是m相机坐标系(Camera Coords):
以相机的sensor
中心为原点,简历相机坐标系,单位m图像物理坐标系:
小孔成像后获得的二维坐标系为单位mm,元旦坐标是图中的点 C C C像素坐标系(Pixel Coords)
: 相机中的成像点sensor
没有任何物理单位,上像素的行数和列数主点
:图中光轴与图像平面的交点p
世界坐标系和相机坐标系在双目或多目系统中不重合,旋转矩阵R和平移矩阵需要世界坐标系T,转换为相机坐标系
。
在上图的二维平面中, O i O_{i} Oi图像坐标系的原点, O d O_{d} Od与图像坐标系的原点相比,像素坐标系有些偏移。
(1)世界坐标系到相机坐标系
点p在不同坐标系中表示
- 世界坐标系(World Coords): P ( x w , y w , z w ) P(x_{w},y_{w},z_{w}) P(xw,yw,zw)
- 相机坐标系(World Coords): P ( x c , y c , z c ) P(x_{c},y_{c},z_{c}) P(xc,yc,zc)
世界坐标系与相机坐标系之间的转换矩阵:
- R R R:相机坐标系相对于世界坐标系的旋转矩阵
- T T T: 相机坐标系相对于世界坐标系的平移矩阵
转换关系数学表达: [ x c y c z c 1 ] = [ R 3 × 3 T 3 × 1 O 1 ] ⋅ [ x w y w z w 1 ] \begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \\ \end{bmatrix} = \begin{bmatrix} R_{3\times3} & T_{3\times1} \\ O & 1 \\ \end{bmatrix} \cdot \begin{bmatrix} x_w \\ y_w \\ z_w \\ 1 \\ \end{bmatrix} ⎣⎢⎢⎡xcyczc1⎦⎥⎥⎤=[R3×3OT3×11]⋅⎣⎢⎢⎡xwywzw1⎦⎥⎥⎤ 世界坐标系
通过旋转矩阵R
和偏移矩阵T
,转换为相机坐标系
,如果世界坐标系和相机坐标系重合,则R
是一个单位矩阵,T
是零矩阵,这样就可以把真实世界的点,转换为相机坐标系中的点
(2) 相机坐标系到图像坐标系
- 假设相机上的点 p ( x c , y c , z c ) p(x_c,y_c,z_c) p(xc,yc,zc) 在图像坐标系的成像点是 p ′ ( x , y ) p^{'}(x,y) p′(x,y)
- 基于小孔成像的原理
- 空间中一点成像在平面中,与 X c Y XcY XcY平面(镜头)平行,距离原点 f f f的平面
- 取一个截面 Z c Y ZcY ZcY,可以得到右图,右图中的黑点 ( z c , y c ) (z_c,y_c) (zc,yc),根据相似三角形关系可以计算得到: y y c = f z c \frac{y}{y_c}=\frac{f}{z_c} ycy=zcf
- 取一个截面 X c Y XcY XcY,根据相似三角形关系可以计算得到: x x c = y y c \frac{x}{x_c}=\frac{y}{y_c} xcx=ycy
- 结合两个三角变换关系,有: x x c = y y c = f z c \frac{x}{x_c}=\frac{y}{y_c}=\frac{f}{z_c} xcx=ycy=zcf
简化后可以得到: x = f z c ⋅ x c x=\frac{f}{z_c} \cdot x_{c} x=zcf⋅xc y = f z c ⋅ y c y=\frac{f}{z_c} \cdot y_{c} y=zcf⋅yc
- 写成矩阵形式: 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}\cdot \begin{bmatrix} x \\ y \\ 1 \\ \end{bmatrix} = \begin{bmatrix} f &0&0&0 \\ 0 &f&0&0 \\ 0 &0&1&0 \\ \end{bmatrix} \cdot \begin{bmatrix} x_c \\ y_c \\ z_c \\ 1 \\ \end{bmatrix} zc⋅⎣⎡xy1⎦⎤=⎣⎡f000f0001000⎦⎤⋅⎣⎢⎢⎡xcyczc1⎦⎥⎥⎤