【立体视觉(一)】之成像原理与相机畸变
- 一、成像原理
- 一)针孔模型
- 二)坐标系转换
- 1. 世界坐标系到相机坐标系
- 2. 相机坐标系到图像坐标系
- 3. 图像坐标系到像素坐标系
- 4. 相机坐标系到像素坐标系
- 5. 世界坐标系到像素坐标系
- 二、相机畸变
- 一)径向畸变
- 径向畸变矫正
- 二)切向畸变
- 切向畸变校正
- 三)总畸变校正
此为个人学习笔记,在各处借鉴了不少好图好文(参考文献在文末),主要是对相关知识进行梳理,以期形成自己的体系。文字表述东拼西凑,符号公式手动输入,若有错误烦请指出。
一、成像原理
一)针孔模型
在科学研究中,一个现象内部的过程总是复杂而难以清晰看透,而聪明的学者们总会用最简单的模型去做初始描述,提出一个相对简单的模型。成像过程亦不例外,他们将三维世界中的坐标点映射到二维图像平面的过程用一个几何模型进行描述,这个模型有很多种,其中最简单的称为针孔模型。
注意,在探究成像过程中,常使用虚拟成像平面进行分析。
二)坐标系转换
从真实世界(世界坐标系)中一点到相片(像素坐标系)上的成像点涉及以下四个坐标系间的转换。
- 世界坐标系(World Coordinate System, WCS):点在真实世界中的位置,描述相机位置,单位m。
- 相机坐标系(Camera Coordinate System, CCS):相机sensor中心为原点,建立相机坐标系,单位m。
- 图像坐标系(Film Coordinate System, FCS):以主点为原点的二维坐标系,单位mm。
- 像素坐标系(Pixel Coordinate System, PCS):原点为相片左上角的二维坐标系,单位无或pixel。
接下来按以下步骤介绍相机成像过程中某点在各个坐标系间的变换。
1. 世界坐标系到相机坐标系
世界坐标系到相机坐标系(World to Camera,W2C),就是简单的三维坐标系转换(三个坐标轴方向与原点的变化)。世界坐标系上一点 P w ( U , V , W ) {P_{w}(U,V,W)} Pw(U,V,W) 到相机坐标系上一点 P c ( X , Y , Z ) {P_{c}(X,Y,Z)} Pc(X,Y,Z):
[ X Y Z ] = [ R 3 × 3 T 3 × 1 ] [ U V W 1 ] \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix}= \begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ \end{bmatrix} \begin{bmatrix} {U}\\ {V}\\ {W}\\ {1}\\ \end{bmatrix} XYZ =[R3×3T3×1] UVW1
或使用其次矩阵表达:
[ X Y Z 1 ] = [ R 3 × 3 T 3 × 1 O 1 ] [ U V W 1 ] \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ {O}&{1}\\ \end{bmatrix} \begin{bmatrix} {U}\\ {V}\\ {W}\\ {1}\\ \end{bmatrix} XYZ1 =[R3×3OT3×11] UVW1
其中, [ R 3 × 3 T 3 × 1 ] \begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ \end{bmatrix} [R3×3T3×1] (或 [ R 3 × 3 T 3 × 1 O 1 ] \begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ {O}&{1}\\ \end{bmatrix} [R3×3OT3×11])被称为相机的外参矩阵(Extrinsic Matrix),描述的是世界坐标中相机的位置( T 3 × 1 T_{3\times1} T3×1),及其指向方向( R 3 × 3 R_{3\times3} R3×3)。
2. 相机坐标系到图像坐标系
相机坐标系到图像坐标系( Camera to Film,C2F),这里由三维坐标 P c ( X , Y , Z ) {P_{c}(X,Y,Z)} Pc(X,Y,Z) 降维到二维坐标 p ( x , y ) {p(x,y)} p(x,y) 。
根据相似三角,得:
x X = y Y = f Z \frac{x}{X}=\frac{y}{Y}=\frac{f}{Z} Xx=Yy=Zf
则:
[ x y 1 ] = [ f Z 0 0 0 f Z 0 0 0 1 Z ] [ X Y Z ] \begin{bmatrix} {x}\\ {y}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {\frac{f}{Z}}&{0}&{0}\\ {0}&{\frac{f}{Z}}&{0}\\ {0}&{0}&{\frac{1}{Z}}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix} xy1 = Zf000Zf000Z1 XYZ
3. 图像坐标系到像素坐标系
图像坐标系到像素坐标系(Film to Pixel,F2P)是一个简单的仿射变换 (Affine Transformation)过程,主要包括原点的移动和尺度的变换。
有:
u = x d x + u 0 , v = y d y + v 0 u=\frac{x}{d_x}+u_0, v=\frac{y}{d_y}+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 ] \begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {\frac{1}{d_x}}&{0}&{u_0}\\ {0}&{\frac{1}{d_y}}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {x}\\ {y}\\ {1}\\ \end{bmatrix} uv1 = dx1000dy10u0v01 xy1
4. 相机坐标系到像素坐标系
现在开始回溯,接上一步,相机坐标系到像素坐标系(Camera to Film, C2F)有:
[ u v 1 ] = [ 1 d x 0 u 0 0 1 d y v 0 0 0 1 ] [ f Z 0 0 0 f Z 0 0 0 1 Z ] [ X Y Z ] = 1 Z [ f d x 0 u 0 0 f d y v 0 0 0 1 ] [ X Y Z ] \begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {\frac{1}{d_x}}&{0}&{u_0}\\ {0}&{\frac{1}{d_y}}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {\frac{f}{Z}}&{0}&{0}\\ {0}&{\frac{f}{Z}}&{0}\\ {0}&{0}&{\frac{1}{Z}}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix}=\frac{1}{Z} \begin{bmatrix} {\frac{f}{d_x}}&{0}&{u_0}\\ {0}&{\frac{f}{d_y}}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix} uv1 = dx1000dy10u0v01 Zf000Zf000Z1 XYZ =Z1 dxf000dyf0u0v01 XYZ
其中, f d x 、 f d y \frac{f}{d_x}、\frac{f}{d_y} dxf、dyf 即焦距除以像素尺寸,单位为pixel,表示焦距在两个像元方向上的像素单位值。由于在相机标定过程中 f 、 d x 、 d y {f}、{d_x}、{d_y} f、dx、dy 是不能直接测量的,而其组合值 f d x 、 f d y \frac{f}{d_x}、\frac{f}{d_y} dxf、dyf 可通过标定得到,故可用 f x = f d x 、 f y = f d y {f_x}=\frac{f}{d_x}、{f_y}=\frac{f}{d_y} fx=dxf、fy=dyf 来表示两个组合值。那么:
[ u v 1 ] = 1 Z [ f x 0 u 0 0 f y v 0 0 0 1 ] [ X Y Z ] \begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \frac{1}{Z} \begin{bmatrix} {f_x}&{0}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix} uv1 =Z1 fx000fy0u0v01 XYZ
若像素坐标系中两坐标轴不垂直(此时像元不是矩形,而是平行四边形),那么相机内参中还有一个偏斜系数 s s s(skew coefficient), s = f x t a n ( α ) s=f_x tan(\alpha) s=fxtan(α),有兴趣可以推导一下。
此时:
[ u v 1 ] = 1 Z [ f x s u 0 0 f y v 0 0 0 1 ] [ X Y Z ] \begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \frac{1}{Z} \begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix} uv1 =Z1 fx00sfy0u0v01 XYZ
其中, [ f x s u 0 0 f y v 0 0 0 1 ] \begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} fx00sfy0u0v01 为相机的内参矩阵(Intrinsics Matrix),描述相机坐标系到像素坐标系的变换关系,反应了相机自身的属性,通常用符号 K K K表示(注意,很多版本里的内参矩阵不含偏斜系数,即默认其为0)。在相机坐标系中, Z Z Z 对应为三维点的深度,常被称为尺度因子 λ \lambda λ,则相机坐标系到像素坐标系:
λ [ u v 1 ] = [ f x s u 0 0 f y v 0 0 0 1 ] [ X Y Z ] \lambda\begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix} λ uv1 = fx00sfy0u0v01 XYZ
令:
K = [ f x s u 0 0 f y v 0 0 0 1 ] K=\begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} K= fx00sfy0u0v01
有:
λ p = K P c \lambda p=KP_c λp=KPc
补充: Z = 1 Z=1 Z=1 的平面称为归一化平面,归一化平面上的坐标称为归一化坐标。
5. 世界坐标系到像素坐标系
世界坐标系到像素坐标系(World to Pixel,W2P),整个串起来:
λ [ u v 1 ] = [ f x s u 0 0 f y v 0 0 0 1 ] [ X Y Z ] = [ f x s u 0 0 f y v 0 0 0 1 ] [ R 3 × 3 T 3 × 1 ] [ U V W 1 ] \lambda\begin{bmatrix} {u}\\ {v}\\ {1}\\ \end{bmatrix}= \begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix} \begin{bmatrix} {X}\\ {Y}\\ {Z}\\ \end{bmatrix}=\begin{bmatrix} {f_x}&{s}&{u_0}\\ {0}&{f_y}&{v_0}\\ {0}&{0}&{1}\\ \end{bmatrix}\begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ \end{bmatrix} \begin{bmatrix} {U}\\ {V}\\ {W}\\ {1}\\ \end{bmatrix} λ uv1 = fx00sfy0u0v01 XYZ = fx00sfy0u0v01 [R3×3T3×1] UVW1
世界坐标系到像素坐标系的转换实际上表达的是透视投影中空间点到像点的投影关系,所以把该转换矩阵叫做投影矩阵(Projection Matrix),常用 M M M表示 ,通过矩阵运算可知投影矩阵是一个3x4的矩阵,它是内参矩阵和外参矩阵的乘积。
λ p = K [ R 3 × 3 T 3 × 1 ] [ P w 1 ] = M [ P w 1 ] \lambda {p}=K \begin{bmatrix} {R_{3\times3}}&{T_{3\times1}}\\ \end{bmatrix} \begin{bmatrix} {P_w}\\ {1}\\ \end{bmatrix}=M\begin{bmatrix} {P_w}\\ {1}\\ \end{bmatrix} λp=K[R3×3T3×1][Pw1]=M[Pw1]
另外,若使用其次矩阵表达,矩阵维度会有所变化。
二、相机畸变
由于相机透镜的固有特性(凸透镜汇聚光线、凹透镜发散光线)导致成像直线会变成曲线。
相机畸变主要有径向畸变(radial distortion)和切向畸变 (tangential distortion)。
畸变特性:
- 径向畸变主要由于透镜的几何形状改变了直线的形状。
- 切向畸变主要由于透镜安装的时候没有与图像平面完美平行。
- 实际经验中,图像几何更加关注径向畸变,因此有时候畸变图像校正的过程可能会忽略切向畸变。
一)径向畸变
径向畸变主要包括:
- 桶形畸变 (barrel distortion)
- 枕形畸变 (pincushion distortion)
- 八字胡畸变 (mustache distortion)
可以看出,径向畸变图像的特点是:
- 中心对称
- 直线变曲
畸变 | 特点 | 场景 |
---|---|---|
桶形畸变 | 中心放大了,离光心越远,图像放大率越小 | 鱼眼镜头,广角/全景图片 |
枕形畸变 | 枕形畸变挤压了图片,(就像压扁的枕头) | 长焦镜头经常会出现枕形畸变,以消除球体效应 |
八字胡畸变 | 上述两种类型的混合,它开始时是靠近光轴的桶形畸变,然后逐渐向图像边缘枕形畸变 |
径向畸变矫正
一般情况下,图像的径向畸变可用一个低阶多项式模型来表示:
x u n d i s t = x d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y u n d i s t = y d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) x_{undist}=x_{dist}(1+k_1r^2+k_2r^4+k_3r^6) \\ y_{undist}=y_{dist}(1+k_1r^2+k_2r^4+k_3r^6) xundist=xdist(1+k1r2+k2r4+k3r6)yundist=ydist(1+k1r2+k2r4+k3r6)
其中 r 2 = x d i s t 2 + y d i s t 2 r^2=x_{dist}^2+y_{dist}^2 r2=xdist2+ydist2, ( x d i s t , y d i s t ) (x_{dist},y_{dist}) (xdist,ydist) 是归一化后的相机坐标系的点,即坐标原点已经移到主点,并且像素坐标除以焦距, x d i s t = X Z = u − u o f x x_{dist}=\frac{X}{Z}=\frac{u-u_o}{f_x} xdist=ZX=fxu−uo , y d i s t = Y Z = v − v o f y y_{dist}=\frac{Y}{Z}=\frac{v-v_o}{f_y} ydist=ZY=fyv−vo,可以从畸变的图像中得到。 k 1 、 k 2 、 k 3 k_1、k_2、k_3 k1、k2、k3 是径向畸变参数(一般可使用多项式前两项,如鱼眼等畸变较大的相机会使用第三项,默认用三项总是没错的),可以用过棋盘格标定得到。
二)切向畸变
切向畸变由相机senser与透镜不平行导致。
切向畸变校正
图像的切向畸变也可用一个低阶多项式模型来表示:
x undist = x dist + [ 2 p 1 x dist y dist + p 2 ( r 2 + 2 x dist 2 ) ] y undist = y dist + [ p 1 ( r 2 + 2 y dist 2 ) + 2 p 2 x dist y dist ] x_{\text {undist }}=x_{\text {dist }}+\left[2 p_{1} x_{\text {dist }} y_{\text {dist }}+p_{2}\left(r^{2}+2 x_{\text {dist }}^{2}\right)\right]\\y_{\text {undist }}=y_{\text {dist }}+\left[p_{1}\left(r^{2}+2 y_{\text {dist }}^{2}\right)+2 p_{2} x_{\text {dist }} y_{\text {dist }}\right ] xundist =xdist +[2p1xdist ydist +p2(r2+2xdist 2)]yundist =ydist +[p1(r2+2ydist 2)+2p2xdist ydist ]
p 1 p_1 p1 和 p 2 p_2 p2 为切向畸变参数。
三)总畸变校正
同时考虑径向畸变和切向畸变:
x u n d i s t = x d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ 2 p 1 x d i s t y d i s t + p 2 ( r 2 + 2 x d i s t 2 ) ] y u n d i s t = y d i s t ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + [ p 1 ( r 2 + 2 y d i s t 2 ) + 2 p 2 x d i s t y d i s t ] x_{{undist }}=x_{dist}(1+k_1r^2+k_2r^4+k_3r^6)+\left[2 p_{1} x_{{dist }} y_{{dist }}+p_{2}\left(r^{2}+2 x_{dist }^{2}\right)\right]\\ y_{ {undist }}=y_{dist}(1+k_1r^2+k_2r^4+k_3r^6)+\left[p_{1}\left(r^{2}+2 y_{{dist }}^{2}\right)+2 p_{2} x_ {dist }y_{ {dist }}\right] xundist=xdist(1+k1r2+k2r4+k3r6)+[2p1xdistydist+p2(r2+2xdist2)]yundist=ydist(1+k1r2+k2r4+k3r6)+[p1(r2+2ydist2)+2p2xdistydist]
共有5个畸变参数 k 1 、 k 2 、 k 3 、 p 1 、 p 2 k_1、k_2、k_3、p_1、p_2 k1、k2、k3、p1、p2,这5个畸变参数与内参矩阵一起,都是需要进行相机标定。但是在OpenCV相机标定时输出顺序是 k 1 、 k 2 、 p 1 、 p 2 、 k 3 k_1、k_2、p_1、p_2、k_3 k1、k2、p1、p2、k3,因为 k 3 k_3 k3 不重要,很多情况下不需要。(是不是很真实?)
参考:
[1] CSE/EE486 Computer Vision I
[2] 一文详解相机标定算法原理
[3] 立体视觉入门指南(1):坐标系与相机参数
[4] 相机标定(Camera calibration)原理及步骤