相机模型、参数和各个坐标系(世界坐标系、相机坐标系、归一化坐标系、图像坐标系、像素坐标系之间变换)

说明

这篇博文介绍了描述相机的经典模型——针孔模型,以及镜头引起的畸变模型;以此给出了相机内参外参的定义,进而介绍了三维重建中很总要的坐标系转换,为后面的重建奠定基础。写这篇博文可太费劲了!又要画图又要手打公式(还是用LaTeX语法 😅)

一、相机模型

相机成像,即将三维世界中的坐标点(单位: m m m)映射到二维图像平面(单位: p i x e l pixel pixel)。这个过程可以用一个几何模型进行描述,其中最简单且有效的是针孔模型。同时,由于透镜的存在和相机制作工艺造成的误差会使得相机的成像产生畸变

1、针孔模型

​ 图一是针孔成像模型的几何模型,相机坐标系 O − x − y − z O-x-y-z Oxyz,设现实中的一点 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=XX=YY,其中负号表示倒像。

实际成像平面就应该是倒向,但是一般的数码相机呈现的图片都是正向的,这是因为数码相机 呈现的图像是经过翻转的。

那么我们也可以简化模型,将成像平面前移 2 f 2f 2f,如图十所示这样就可以去掉负号得到: Z f = X X ′ = Y Y ′ \frac{Z}{f} =\frac{X}{X^ {'}} = \frac{Y}{Y^ {'}} fZ=XX=YY

整理得: 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 Opixeluv像素坐标系 O i m a g e − x i m a g e − y i m a g e O_{image}-x_{image}-y_{image} Oimageximageyimage为图像坐标系。

​ 假设 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=fx000fy0cxcy1Z1XYZ

其中 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} Z1XYZ=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

在这里插入图片描述

图三

2、畸变

​ 由于相机镜头中透镜的存在,使得成像过程中光线的传播会产生新的影响:一、透镜形状对光线传播的影响,称为径向畸变,二、透镜位置对光线传播的影响,成为切向畸变。用极坐标的表示方法 [ r , θ ] T [r,\theta]^{T} [r,θ]T能更好的理解相机畸变模型,其中, r r r表示图像中的一点到原点的距离, θ \theta θ表示与过原点的水平线之间的夹角。径向畸变主要和 r r r有关,切向畸变主要和 θ \theta θ有关。

(1)径向畸变

​ 假设在没有透镜的针孔模型中,直线投影到像素平面还是一条直线。然而透镜的存在使得直线投影成曲线。穿过图像中心和光轴有交点的直线能保持形状不变,而越靠近图像边缘畸变越明显,由于透镜往往是中心对称的,这使得不规则的畸变通常径向对称。畸变类型主要有:桶形失真枕形失真,如图四所示。

在这里插入图片描述

图四
1)桶形畸变

​ 桶形畸变是由于图像的放大率随着与光轴之间的距离增加而减小,因此桶形畸变也称为负径向畸变。假设 ( 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

在这里插入图片描述

图五
2)枕形畸变

​ 枕形畸变是由于图像的放大率随着与光轴之间的距离增加而增加,因此枕形畸变也称为正径向畸变。假设 ( 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

(2)切向畸变

​ 在相机组装过程中由于不能使透镜和成像平面严格平行而引起的畸变成为切向畸变,切向畸变主要与 θ \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.

在这里插入图片描述

图七

在这里插入图片描述

图八

​ 径向畸变示意图如图八所示,看起来有点倾斜的样子。

(3)畸变小结

​ 从径向畸变和切向畸变的数学模型中,我们可以得到畸变在归一化平面上的一般模型:

{ 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=fx000fy0cxcy1xdistortedydistorted1

二、各坐标系之间的转换

​ 在相机的成像模型和三维重建原理中都存在坐标系的转换,我们可以从上面的相机模型中深刻的体会到这一点。坐标转换涉及的坐标系主要有:世界坐标系、相机坐标系、归一化坐标系、图像坐标系、像素坐标系这五大坐标系。

1、各坐标系的定义

在这里插入图片描述

图九

在这里插入图片描述

图十
  • 世界坐标系(world coordinate system):用户定义的三维世界的坐标系,坐标原点由用户自定义,为了描述目标物在真实世界里的位置而被引入。单位为 m m m。如图九中 O w − x w − y w − z w O_{w}-x_{w}-y_{w}-z_{w} Owxwywzw

  • 相机坐标系(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} Ocxcyczc

  • 归一化坐标系(scaled coordinate system):在 z z z轴正半轴上到原点距离为1,为了消去空间上某一点的深度信息,作为沟通世界坐标系和图像/像素坐标系的中间一环。单位为1。如图十中 O s − x s − y s O_{s}-x_{s}-y_{s} Osxsys

  • 图像坐标系(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} Oimageximageyimage

  • 像素坐标系(pixel coordinate system):为了描述物体成像后的像点在数字图像上(相片)的坐标而引入,是我们真正从相机内读取到的信息所在的坐标系。单位为 p i x e l pixel pixel。如图十中 O p i x e l − u − v O_{pixel}-u-v Opixeluv

2、各坐标系之间的相互转换模型

​ 按照下面的流程进行转换:

世界坐标系
相机坐标系
归一化坐标系
图像坐标系
像素坐标系

​ 假设真实世界中的一点 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β0cxcy1xy1=α000β0cxcy1f000f0001000Zc1XcYcZc1=α000β0cxcy1f000f0001000Zc1[R0Tt1]XwYwZw1

(1)世界坐标系–>相机坐标系

刚体变换(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]

(2)相机坐标系–>归一化坐标系

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=Zc1XcYcZc=Zc1Pc

(3)归一化坐标系–>像素坐标系

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β0cxcy1f000f0001

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=KZc1XcYcZc=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官方文档

相机标定后,将世界坐标系坐标转换为像素坐标坐标的步骤如下: 1. 确定相机内参矩阵K和畸变参数D。 2. 确定要转换的世界坐标系中的点P。 3. 将P从世界坐标系转换到相机坐标系中,得到相机坐标系中的点P_c = R*P_w + t,其中R是旋转矩阵,t是平移向量。 4. 将P_c乘以相机内参矩阵K,得到归一化平面上的坐标P_n = K*P_c。 5. 根据相机的畸变参数,对P_n进行畸变校正,得到畸变校正后的归一化平面上的坐标P_u。 6. 将P_u转换为像素坐标中的坐标,得到像素坐标P_p = (u,v),其中u和v分别是P_u的水平和垂直坐标。 下面是一个Python的示例代码: ```python import numpy as np import cv2 # 确定相机内参矩阵K和畸变参数D K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]]) D = np.array([k1, k2, p1, p2, k3]) # 确定要转换的世界坐标系中的点P P_w = np.array([x, y, z]) # 将P从世界坐标系转换到相机坐标系中 P_c = R.dot(P_w) + t # 将P_c乘以相机内参矩阵K,得到归一化平面上的坐标P_n P_n = K.dot(P_c) # 根据相机的畸变参数,对P_n进行畸变校正 P_u = cv2.undistortPoints(np.array([P_n]), K, D) # 将P_u转换为像素坐标中的坐标 u, v = P_u[0][0] ``` 其中,fx、fy、cx和cy分别是相机内参矩阵K的元素,k1、k2、p1、p2和k3分别是相机的畸变参数,R是旋转矩阵,t是平移向量,x、y和z是要转换的世界坐标系中的点的坐标。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值