这篇博文介绍了描述相机的经典模型——针孔模型,以及镜头引起的畸变模型;以此给出了相机内参和外参的定义,进而介绍了三维重建中很总要的坐标系转换,为后面的重建奠定基础。写这篇博文可太费劲了!又要画图又要手打公式(还是用LaTeX语法 )
相机成像,即将三维世界中的坐标点(单位: m m m)映射到二维图像平面(单位: p i x e l pixel pixel)。这个过程可以用一个几何模型进行描述,其中最简单且有效的是针孔模型。同时,由于透镜的存在和相机制作工艺造成的误差会使得相机的成像产生畸变。
图一是针孔成像模型的几何模型,相机坐标系为 O − x − y − z O-x-y-z O−x−y−z,设现实中的一点 P P P的坐标为 [ X , Y , Z ] T [X,Y,Z]^{T} [X,Y,Z]T,经过小孔O投影到相机物理成像平面 P ′ P^{'} P′点,其坐标为 [ X ′ , Y ′ , f ] T [X^{'},Y^{'},f]^{T} [X′,Y′,f]T, f f f为相机焦距,根据相似三角形原理可以得到 Z f = − X X ′ = − Y Y ′ \frac{Z}{f} =-\frac{X}{X^ {'}} = -\frac{Y}{Y ^{'}} fZ=−X′X=−Y′Y,其中负号表示倒像。
实际成像平面就应该是倒向,但是一般的数码相机呈现的图片都是正向的,这是因为数码相机 呈现的图像是经过翻转的。
那么我们也可以简化模型,将成像平面前移 2 f 2f 2f,如图十所示这样就可以去掉负号得到: Z f = X X ′ = Y Y ′ \frac{Z}{f} =\frac{X}{X^ {'}} = \frac{Y}{Y^ {'}} fZ=X′X=Y′Y
整理得: X ′ = f X Z , Y ′ = f Y Z X^{'}=f\frac{X}{Z},Y^{'}=f\frac{Y}{Z} X′=fZX,Y′=fZY
图二在二维坐标系下解释了针孔模型的过程,其中归一化成像平面是指距离原点 O O O的距离为单位1的坐标。设 P s P_{s} Ps为 P P P点在归一化成像平面上的投影点,其坐标为 [ X s , Y s , 1 ] T [X_{s},Y_{s},1]^{T} [Xs,Ys,1]T,有: Z 1 = X X s = Y Y s \frac{Z}{1} =\frac{X}{X_{s}}=\frac{Y}{Y_{s}} 1Z=XsX=YsY
整理得: X s = X Z , Y s = Y Z X_{s}=\frac{X}{Z},Y_{s}=\frac{Y}{Z} Xs=ZX,Ys=ZY
我们知道,相机拍摄的数字图像在计算机中都是以二维矩阵储存的,它的坐标以像素为单位,而且坐标原点一般在图像的左上角,而实际物理图像的坐标原点在图像中心,坐标单位为米。其关系如图三所示, O p i x e l − u − v O_{pixel}-u-v Opixel−u−v为像素坐标系, O i m a g e − x i m a g e − y i m a g e O_{image}-x_{image}-y_{image} Oimage−ximage−yimage为图像坐标系。
假设 x x x轴方向有 1 ( m ) = α ( p i x e l ) 1(m)=\alpha(pixel) 1(m)=α(pixel), y y y轴方向有 1 ( m ) = β ( p i x e l ) 1(m)=\beta(pixel) 1(m)=β(pixel)那么 P ′ P^{'} P′点的像素坐标 ( u , v ) (u,v) (u,v)有下面的关系:
{ u = α X ′ = α f X Z , v = β X ′ = β f Y Z . \begin{cases} u=\alpha X^{'}=\alpha f\frac{X}{Z},\\v=\beta X^{'}=\beta f\frac{Y}{Z}.\end{cases} {u=αX′=αfZX,v=βX′=βfZY.令 { f x = α f , f y = β f . \begin{cases} f_{x}=\alpha f,\\f_{y}=\beta f.\end{cases} {fx=αf,fy=βf.则写成矩阵形式有: [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] 1 Z [ X Y Z ] \begin{bmatrix} u\\v\\ 1\\ \end{bmatrix}=\begin{bmatrix} f_{x} & 0 &c_{x}\\0 & f_{y} &c_{y}\\ 0&0&1\\\end{bmatrix} \frac{1}{Z}\begin{bmatrix} X\\Y\\ Z\\ \end{bmatrix} ⎣⎡uv1⎦⎤=⎣⎡fx000fy0cxcy1⎦⎤Z1⎣⎡XYZ⎦⎤
其中 1 Z [ X Y Z ] = [ X s Y s 1 ] = P s \frac{1}{Z}\begin{bmatrix}X\\Y\\ Z\\\end{bmatrix}=\begin{bmatrix}X_{s} \\ Y_{s} \\ 1 \end{bmatrix}=P_{s} Z1⎣⎡XYZ⎦⎤=⎣⎡XsYs1⎦⎤=Ps,令 K = [ f x 0 c x 0 f y c y 0 0 1 ] K= \begin{bmatrix}f_{x} & 0 &c_{x}\\0 & f_{y} &c_{y}\\ 0&0&1\\\end{bmatrix} K=⎣⎡fx000fy0cxcy1⎦⎤,那么K为相机的内参矩阵,它为归一化坐标与像素坐标的隐射关系: P p i x e l = K P s P_{pixel}=KP_{s} Ppixel=KPs
由于相机镜头中透镜的存在,使得成像过程中光线的传播会产生新的影响:一、透镜形状对光线传播的影响,称为径向畸变,二、透镜位置对光线传播的影响,成为切向畸变。用极坐标的表示方法 [ r , θ ] T [r,\theta]^{T} [r,θ]T能更好的理解相机畸变模型,其中, r r r表示图像中的一点到原点的距离, θ \theta θ表示与过原点的水平线之间的夹角。径向畸变主要和 r r r有关,切向畸变主要和 θ \theta θ有关。
假设在没有透镜的针孔模型中,直线投影到像素平面还是一条直线。然而透镜的存在使得直线投影成曲线。穿过图像中心和光轴有交点的直线能保持形状不变,而越靠近图像边缘畸变越明显,由于透镜往往是中心对称的,这使得不规则的畸变通常径向对称。畸变类型主要有:桶形失真和枕形失真,如图四所示。
桶形畸变是由于图像的放大率随着与光轴之间的距离增加而减小,因此桶形畸变也称为负径向畸变。假设 ( x d i s t o r t e d , y d i s t o r t e d ) (x_{distorted},y_{distorted}) (xdistorted,ydistorted)为畸变后的坐标, ( x , y ) (x,y) (x,y)为未畸变的坐标,它们之间的关系有: { x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) , y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) . \begin{cases} x_{distorted}=x(1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6}),\\y_{distorted}=y(1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6}).\end{cases} {xdistorted=x(1+k1r2+k2r4+k3r6),ydistorted=y(1+k1r2+k2r4+k3r6).
图五给出畸变示意图,其中 A ′ , B ′ , C ′ A^{'},B^{'},C^{'} A′,B′,C′为桶形畸变图像的三个点, o ( x 0 , y 0 ) o(x_{0},y_{0}) o(x0,y0)为图像原点, r 0 , r 1 r_{0},r_{1} r0,r1为校正后直线上的 A , B , C A,B,C A,B,C点到原点的距离。假设 K = k 1 r 2 + k 2 r 4 + k 3 r 6 K=k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6} K=k1r2+k2r4+k3r6,那么根据下图所示有 K < 0 K<0 K<0。
枕形畸变是由于图像的放大率随着与光轴之间的距离增加而增加,因此枕形畸变也称为正径向畸变。假设 ( x d i s t o r t e d , y d i s t o r t e d ) (x_{distorted},y_{distorted}) (xdistorted,ydistorted)为畸变后的坐标, ( x , y ) (x,y) (x,y)为未畸变的坐标,它们之间的关系有: { x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) , y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) . \begin{cases} x_{distorted}=x(1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6}),\\y_{distorted}=y(1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6}).\end{cases} {xdistorted=x(1+k1r2+k2r4+k3r6),ydistorted=y(1+k1r2+k2r4+k3r6).
图六给出畸变示意图,其中 A ′ , B ′ , C ′ A_{'},B_{'},C_{'} A′,B′,C′为枕形畸变图像的三个点, o ( x 0 , y 0 ) o(x_{0},y_{0}) o(x0,y0)为图像原点, r 0 , r 1 r_{0},r_{1} r0,r1为 A , B , C A,B,C A,B,C点到原点的距离。假设 K = k 1 r 2 + k 2 r 4 + k 3 r 6 K=k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6} K=k1r2+k2r4+k3r6,那么根据下图所示有 K > 0 K>0 K>0。
对于径向畸变而言,一般它的系数只取 k 1 , k 2 k_{1},k_{2} k1,k2,对于畸变很大的镜头(如鱼眼镜头),才增加 k 3 k_{3} k3。
在相机组装过程中由于不能使透镜和成像平面严格平行而引起的畸变成为切向畸变,切向畸变主要与 θ \theta θ有关,其模型如图七所示。
描述径向畸变的数学模型为: { x d i s t o r t e d = x + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) , y d i s t o r t e d = y + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y . \begin{cases} x_{distorted}=x+2p_{1}xy+p_{2}(r^{2}+2x^{2}),\\y_{distorted}=y+p_{1}(r^{2}+2y^{2})+2p_{2}xy.\end{cases} {xdistorted=x+2p1xy+p2(r2+2x2),ydistorted=y+p1(r2+2y2)+2p2xy.
径向畸变示意图如图八所示,看起来有点倾斜的样子。
从径向畸变和切向畸变的数学模型中,我们可以得到畸变在归一化平面上的一般模型:
{ x d i s t o r t e d = x ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) , y d i s t o r t e d = y ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) + p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y . \begin{cases} x_{distorted}=x(1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6})+2p_{1}xy+p_{2}(r^{2}+2x^{2}),\\y_{distorted}=y(1+k_{1}r^{2}+k_{2}r^{4}+k_{3}r^{6})+p_{1}(r^{2}+2y^{2})+2p_{2}xy.\end{cases} {xdistorted=x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2),ydistorted=y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy.
其中需要标定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,这五个参数不一定全部使用,可以根据实际情况合理选择,如只选择 k 1 , k 2 , p 1 k_{1},k_{2},p{1} k1,k2,p1作为畸变模型。
畸变校正一般有两种方法:1、整个图像去畸变处理后再讨论空间坐标;2、逐点去畸变处理然后逐点讨论空间坐标。一般采用第一种方法。
考虑畸变后的像素坐标为: [ u v 1 ] = [ f x 0 c x 0 f y c y 0 0 1 ] [ x d i s t o r t e d y d i s t o r t e d 1 ] \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} x_{distorted}\\y_{distorted}\\ 1\\ \end{bmatrix} ⎣⎡uv1⎦⎤=⎣⎡fx000fy0cxcy1⎦⎤⎣⎡xdistortedydistorted1⎦⎤
在相机的成像模型和三维重建原理中都存在坐标系的转换,我们可以从上面的相机模型中深刻的体会到这一点。坐标转换涉及的坐标系主要有:世界坐标系、相机坐标系、归一化坐标系、图像坐标系、像素坐标系这五大坐标系。
世界坐标系(world coordinate system):用户定义的三维世界的坐标系,坐标原点由用户自定义,为了描述目标物在真实世界里的位置而被引入。单位为 m m m。如图九中 O w − x w − y w − z w O_{w}-x_{w}-y_{w}-z_{w} Ow−xw−yw−zw
相机坐标系(camera coordinate system):在相机上建立的坐标系,以光心为坐标原点,光轴为 z z z轴为了从相机的角度描述物体位置而定义,作为沟通世界坐标系和图像/像素坐标系的中间一环。单位为 m m m。如图九中 O c − x c − y c − z c O_{c}-x_{c}-y_{c}-z_{c} Oc−xc−yc−zc
归一化坐标系(scaled coordinate system):在 z z z轴正半轴上到原点距离为1,为了消去空间上某一点的深度信息,作为沟通世界坐标系和图像/像素坐标系的中间一环。单位为1。如图十中 O s − x s − y s O_{s}-x_{s}-y_{s} Os−xs−ys
图像坐标系(image coordinate system):为了描述成像过程中物体从相机坐标系到图像坐标系的投影透射关系而引入,方便进一步得到像素坐标系下的坐标。 单位为 m m m。如图九中 O i m a g e − x i m a g e − y i m a g e O_{image}-x_{image}-y_{image} Oimage−ximage−yimage
像素坐标系(pixel coordinate system):为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系。单位为 p i x e l pixel pixel。如图十中 O p i x e l − u − v O_{pixel}-u-v Opixel−u−v
按照下面的流程进行转换:
假设真实世界中的一点 P P P在各坐标系下的坐标分别为 P w , P c , P s , P i , P p P_{w},P_{c},P_{s},P_{i},P_{p} Pw,Pc,Ps,Pi,Pp,其中:
P w = [ X w Y w Z w ] P_{w}=\begin{bmatrix} X_{w} \\ Y_{w} \\ Z_{w} \end{bmatrix} Pw=⎣⎡XwYwZw⎦⎤, P c = [ X c Y c Z c ] P_{c}=\begin{bmatrix} X_{c} \\ Y_{c} \\ Z_{c} \end{bmatrix} Pc=⎣⎡XcYcZc⎦⎤, P s = [ X s Y s 1 ] P_{s}=\begin{bmatrix} X_{s} \\ Y_{s} \\ 1 \end{bmatrix} Ps=⎣⎡XsYs1⎦⎤, P i = [ X i Y i 1 ] P_{i}=\begin{bmatrix} X_{i} \\ Y_{i} \\ 1 \end{bmatrix} Pi=⎣⎡XiYi1⎦⎤, P p = [ u v 1 ] P_{p}=\begin{bmatrix} u \\ v \\ 1 \end{bmatrix} Pp=⎣⎡uv1⎦⎤。
[ u v 1 ] = [ α 0 c x 0 β c y 0 0 1 ] [ x y 1 ] = [ α 0 c x 0 β c y 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] 1 Z c [ X c Y c Z c 1 ] = [ α 0 c x 0 β c y 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] 1 Z c [ R t 0 T 1 ] [ X w Y w Z w 1 ] \begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=\begin{bmatrix} \alpha & 0 &c_{x} \\ 0 & \beta & c_{y} \\ 0 & 0& 1 \end{bmatrix}\begin{bmatrix} x \\ y \\ 1 \end{bmatrix}=\begin{bmatrix} \alpha & 0 &c_{x} \\ 0 & \beta & c_{y} \\ 0 & 0& 1 \end{bmatrix}\begin{bmatrix} f & 0 & 0 & 0\\ 0 & f & 0 & 0\\ 0 & 0& 1 & 0\end{bmatrix}\frac{1}{Z_{c}}\begin{bmatrix} X_{c} \\Y_{c} \\Z_{c} \\ 1 \end{bmatrix}=\begin{bmatrix} \alpha & 0 &c_{x} \\ 0 & \beta & c_{y} \\ 0 & 0& 1 \end{bmatrix}\begin{bmatrix} f & 0 & 0 & 0\\ 0 & f & 0 & 0\\ 0 & 0& 1 & 0\end{bmatrix}\frac{1}{Z_{c}}\begin{bmatrix} R & t \\ 0^{T}& 1 \end{bmatrix}\begin{bmatrix} X_{w} \\Y_{w} \\Z_{w} \\ 1 \end{bmatrix} ⎣⎡uv1⎦⎤=⎣⎡α000β0cxcy1⎦⎤⎣⎡xy1⎦⎤=⎣⎡α000β0cxcy1⎦⎤⎣⎡f000f0001000⎦⎤Zc1⎣⎢⎢⎡XcYcZc1⎦⎥⎥⎤=⎣⎡α000β0cxcy1⎦⎤⎣⎡f000f0001000⎦⎤Zc1[R0Tt1]⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤
刚体变换(regidbody motion):三维空间中,当物体不发生形变时,对一个几何物体作旋转 R R R, 平移 t t t 的运动,称之为刚体变换。世界坐标系到相机坐标系的变化就是刚体变换,又因为 R R R和 t t t与相机无关,所有又称其为相机外参。
[ X c Y c Z c 1 ] = [ R t 0 T 1 ] [ X w Y w Z w 1 ] \begin{bmatrix} X_{c} \\Y_{c} \\Z_{c} \\ 1 \end{bmatrix}=\begin{bmatrix} R & t \\ 0^{T}& 1 \end{bmatrix}\begin{bmatrix} X_{w} \\Y_{w} \\Z_{w} \\ 1 \end{bmatrix} ⎣⎢⎢⎡XcYcZc1⎦⎥⎥⎤=[R0Tt1]⎣⎢⎢⎡XwYwZw1⎦⎥⎥⎤, T = [ R t 0 T 1 ] T=\begin{bmatrix} R & t \\ 0^{T}& 1 \end{bmatrix} T=[R0Tt1]
P i = [ X i Y i 1 ] = 1 Z c [ X c Y c Z c ] = 1 Z c P c P_{i}=\begin{bmatrix} X_{i} \\ Y_{i} \\ 1 \end{bmatrix}=\frac{1}{Z_{c}}\begin{bmatrix} X_{c} \\Y_{c} \\Z_{c} \end{bmatrix}=\frac{1}{Z_{c}}P_{c} Pi=⎣⎡XiYi1⎦⎤=Zc1⎣⎡XcYcZc⎦⎤=Zc1Pc
K = [ f x 0 c x 0 f y c y 0 0 1 ] = [ α 0 c x 0 β c y 0 0 1 ] [ f 0 0 0 f 0 0 0 1 ] K=\begin{bmatrix} f_{x} & 0 &c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0& 1 \end{bmatrix}=\begin{bmatrix} \alpha & 0 &c_{x} \\ 0 & \beta & c_{y} \\ 0 & 0& 1 \end{bmatrix}\begin{bmatrix} f & 0 & 0 \\ 0 & f & 0 \\ 0 & 0& 1 \end{bmatrix} K=⎣⎡fx000fy0cxcy1⎦⎤=⎣⎡α000β0cxcy1⎦⎤⎣⎡f000f0001⎦⎤
P p = [ u v 1 ] = K 1 Z c [ X c Y c Z c ] = K P i P_{p}=\begin{bmatrix} u \\ v \\ 1 \end{bmatrix}=K\frac{1}{Z_{c}}\begin{bmatrix} X_{c} \\Y_{c} \\Z_{c} \end{bmatrix}=KP_{i} Pp=⎣⎡uv1⎦⎤=KZc1⎣⎡XcYcZc⎦⎤=KPi
综上所述,相机需要标定内参矩阵 K K K,外参矩阵 T T T,以及畸变参数 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。
在这里补充一下:
在一些文献中相机内参 K = [ f x γ c x 0 f y c y 0 0 1 ] = [ α γ c x 0 β c y 0 0 1 ] K=\begin{bmatrix} f_{x} & \gamma &c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0& 1 \end{bmatrix}=\begin{bmatrix} \alpha & \gamma &c_{x} \\ 0 & \beta & c_{y} \\ 0 & 0& 1 \end{bmatrix} K=⎣⎡fx00γfy0cxcy1⎦⎤=⎣⎡α00γβ0cxcy1⎦⎤
其中 γ \gamma γ表示轴倾斜程度的参数,默认为0。所谓轴倾斜程度是指成像平面的x轴和y轴的的倾斜程度,如果 γ \gamma γ不等于0,意味着x轴和y轴不垂直,那么成像平面就是平行四边形,那么得到的像也会扭曲。
这里给出相机内参外参变化时像随之变化的demo。感兴趣的同学可以进去看一下,会有一个比较直观的感受。
视觉SLAM十四讲_哔哩哔哩
视觉SLAM十四讲:从理论到实践 ——高翔等
CSDN相关博文
Opencv官方文档