由于摄像机与被摄物体可以放置在环境中任意位置,这样就需要在环境中建立一个三维直角坐标系,来表示相机和被摄物体的位置,这个坐标系就称为世界坐标系
相机坐标系也是一个三维直角坐标系,原点位于镜头光心处,X,Y轴分别与像平面的两边平行,Z轴为镜头光轴,与像平面垂直
绕X轴旋转,即X轴不变:
R ( X W , ψ ) = [ 1 0 0 0 c o s ψ − s i n ψ 0 s i n ψ c o s ψ ] \mathrm{R}(X_W,\psi)= \begin{bmatrix} 1 & 0 & 0\\ 0 & cos\psi & -sin\psi\\ 0 & sin\psi & cos\psi \end{bmatrix} R(XW,ψ)=⎣⎡1000cosψsinψ0−sinψcosψ⎦⎤
绕Y轴旋转,即Y轴不变:
R ( Y W , θ ) = [ c o s θ 0 s i n θ 0 1 0 − s i n θ 0 c o s θ ] \mathrm{R}(Y_W,\theta)= \begin{bmatrix} cos\theta & 0 & sin\theta\\ 0 & 1 & 0\\ -sin\theta & 0 & cos\theta \end{bmatrix} R(YW,θ)=⎣⎡cosθ0−sinθ010sinθ0cosθ⎦⎤
绕Z轴旋转,即Z轴不变:
R ( Z W , ϕ ) = [ c o s ϕ − s i n ϕ 0 s i n ϕ c o s ϕ 0 0 0 1 ] \mathrm{R}(Z_W,\phi)= \begin{bmatrix} cos\phi & -sin\phi & 0\\ sin\phi & cos\phi & 0\\ 0 & 0 & 1 \end{bmatrix} R(ZW,ϕ)=⎣⎡cosϕsinϕ0−sinϕcosϕ0001⎦⎤
然后我们把绕三个轴旋转的矩阵进行相乘:
R = R ( Z W , ϕ ) R ( Y W , θ ) R ( X W , ψ ) \mathrm{R}=\mathrm{R}(Z_W,\phi)\mathrm{R}(Y_W,\theta)\mathrm{R}(X_W,\psi) R=R(ZW,ϕ)R(YW,θ)R(XW,ψ)
R = [ r 11 r 12 r 13 r 21 r 22 r 23 r 31 r 32 r 33 ] \mathrm{R}=\begin{bmatrix} r_{11} & r_{12} & r_{13}\\ r_{21} & r_{22} & r_{23}\\ r_{31} & r_{32} & r_{33} \end{bmatrix} R=⎣⎡r11r21r31r12r22r32r13r23r33⎦⎤
t = [ t x t y t z ] \mathrm{t}=\begin{bmatrix} t_x \\ t_y\\ t_z \end{bmatrix} t=⎣⎡txtytz⎦⎤
[ X C Y C Z C ] = R [ X W Y W Z W ] + t \begin{bmatrix} X_C \\ Y_C\\ Z_C \end{bmatrix} =\mathrm{R}\begin{bmatrix} X_W \\ Y_W\\ Z_W \end{bmatrix}+\mathrm{t} ⎣⎡XCYCZC⎦⎤=R⎣⎡XWYWZW⎦⎤+t
写成齐次性矩阵:
[ X C Y C Z C 1 ] = [ R t 0 1 ] [ X W Y W Z W 1 ] \begin{bmatrix} X_C \\ Y_C\\ Z_C\\ 1 \end{bmatrix}=\begin{bmatrix} \mathrm{R} & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} X_W \\ Y_W\\ Z_W\\ 1 \end{bmatrix} ⎣⎢⎢⎡XCYCZC1⎦⎥⎥⎤=[R0t1]⎣⎢⎢⎡XWYWZW1⎦⎥⎥⎤
这样的目的是可以把坐标整合起来,变换矩阵第二行 [ 0 1 ] \begin{bmatrix} 0 & 1 \end{bmatrix} [01] 是为了让世界坐标系和相机坐标系统一为4维表示。
写到这里,我们就得到了相机外参(Camera Extrinsics) R , t \mathrm{R},\mathrm{t} R,t
Q: 为啥要把世界坐标系变到相机坐标系?
A: 因为我们的相机坐标系可以将世界点与图像联系起来
Q: 什么是世界点?
A: 一般情况下,我们是需要测量物体的距离和位置关系,因此世界坐标系一般定在相机工作的场景中
Q: 世界坐标系与相机坐标系的关系是什么?
A: 相机外参R,t
像素坐标系UOV(u,v)是一个二维直角坐标系,反映了相机CCD/CMOS芯片中像素的排列情况。原点o位于图像的左上角,u轴,v轴分别与像平面的两边平行。像素坐标系中坐标轴的单位是像素(整数)。
像素坐标系不利于坐标变换,因此需要建立图像坐标系XOY(x,y)也是一个二维直角坐标系。其坐标轴的单位通常为毫米(mm),原点是相机光轴与像平面的交点(称为主点),即图像的中心点。x轴,y轴分别与u轴,v轴平行,故两个坐标系实际上是平移关系,即可以通过平移就可以得到。
[ 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}{dX} & 0 & u_0\\ 0 & \frac{1}{dY} & v_0\\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} x \\ y\\ 1 \end{bmatrix} ⎣⎡uv1⎦⎤=⎣⎡dX1000dY10u0v01⎦⎤⎣⎡xy1⎦⎤
其中, d X dX dX、 d Y dY dY分别是像素在X,Y轴方向上的物理尺寸,通俗点说就是X,Y轴上一个像素单位(cell size)对应着图像坐标系上的长度(单位是mm),( u 0 u_0 u0, v 0 v_0 v0)为主点(图像坐标系的原点)在像素坐标系上的坐标。
如果还不够清晰的话,我们把矩阵乘法按行展开,可以得到
{ u = x d X + u 0 y = y d Y + v 0 1 = 1 \left\{ \begin{aligned} u & = \frac{x}{dX}+u_0 \\ y & = \frac{y}{dY}+v_0 \\ 1 & = 1 \end{aligned} \right. ⎩⎪⎪⎪⎨⎪⎪⎪⎧uy1=dXx+u0=dYy+v0=1
这样我们可以看到图像坐标系到像素坐标系变换关系其实就是一个伸缩+平移变换。
空间中任意一点 P \mathrm{P} P,点 P \mathrm{P} P在相机坐标系(Camera Coordinate) (图中的蓝色坐标系)中的坐标为( X C X_C XC, Y C Y_C YC, Z C Z_C ZC),连接点 P \mathrm{P} P与相机光心 o o o的连线为 o P o\mathrm{P} oP, o P o\mathrm{P} oP与像平面的交点为 p p p,这个点 p p p就是空间点 P \mathrm{P} P拍照出来对应的像平面上的投影,点 p p p在图像坐标系(图中的绿色坐标系)中的坐标为( x x x, y y y)。该过程为透视投影,计算方法由相似三角形关系得到如下变换矩阵
s [ x y 1 ] = [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ X C Y C Z C 1 ] s\begin{bmatrix} x \\ y\\ 1 \end{bmatrix}=\begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0\\ 0 & 0 & 1 &0 \end{bmatrix} \begin{bmatrix} X_C \\ Y_C\\ Z_C\\ 1 \end{bmatrix} s⎣⎡xy1⎦⎤=⎣⎡f000f0001000⎦⎤⎣⎢⎢⎡XCYCZC1⎦⎥⎥⎤
其中,s为比例因子(s不为0),它的值等于 Z C Z_C ZC,f为有效焦距(光心到图像平面的距离) o O oO oO。
接下来我们推导一下这个变换矩阵怎么得到的,将矩阵每一行展开为三个等式
{ s x = f X C ⟺ x X C = f s s y = f Y C ⟺ y Y C = f s s = Z C \left\{ \begin{aligned} sx & = fX_C &\iff \frac{x}{X_C} &=\frac{f}{s} \\ sy & = fY_C &\iff \frac{y}{Y_C} &=\frac{f}{s}\\ s &= Z_C \end{aligned} \right. ⎩⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎧sxsys=fXC=fYC=ZC⟺XCx⟺YCy=sf=sf
到此,我们可以看出这个变换是基于 △ o Z P \triangle oZP △oZP的边长坐标相似关系得出。
到目前为止,我们已经清晰推导了世界坐标系——>相机坐标系——>图像坐标系——>像素坐标系。那么想得到世界坐标系——>像素坐标系的公式,直接将上面三个变换过程集合到一起(即将三个变换矩阵相乘)。
s [ u v 1 ] = [ 1 d X 0 u 0 0 1 d Y v 0 0 0 1 ] [ f 0 0 0 0 f 0 0 0 0 1 0 ] [ R t 0 1 ] [ X W Y W Z W 1 ] = [ α x 0 u 0 0 0 α y v 0 0 0 0 1 0 ] [ R t 0 1 ] [ X W Y W Z W 1 ] = M 1 M 2 V ⃗ = M V ⃗ \begin{aligned} s\begin{bmatrix} u \\ v\\ 1 \end{bmatrix} &=\begin{bmatrix} \frac{1}{dX} & 0 & u_0\\ 0 & \frac{1}{dY} & v_0\\ 0 & 0 & 1 \end{bmatrix}\begin{bmatrix} f & 0 & 0 & 0 \\ 0 & f & 0 & 0\\ 0 & 0 & 1 &0 \end{bmatrix}\begin{bmatrix} \mathrm{R} & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} X_W \\ Y_W\\ Z_W\\ 1 \end{bmatrix}\\ &=\begin{bmatrix} \alpha_x & 0 & u_0 & 0 \\ 0 & \alpha_y & v_0 & 0\\ 0 & 0 & 1 &0 \end{bmatrix} \begin{bmatrix} \mathrm{R} & t \\ 0 & 1 \end{bmatrix} \begin{bmatrix} X_W \\ Y_W\\ Z_W\\ 1 \end{bmatrix}\\ &=\mathrm{M}_1 \mathrm{M}_2 \vec{V}\\ &=\mathrm{M}\vec{V} \end{aligned} s⎣⎡uv1⎦⎤=⎣⎡dX1000dY10u0v01⎦⎤⎣⎡f000f0001000⎦⎤[R0t1]⎣⎢⎢⎡XWYWZW1⎦⎥⎥⎤=⎣⎡αx000αy0u0v01000⎦⎤[R0t1]⎣⎢⎢⎡XWYWZW1⎦⎥⎥⎤=M1M2V=MV
α x = f d X \alpha_x=\frac{f}{dX} αx=dXf、 α y = f d Y \alpha_y=\frac{f}{dY} αy=dYf称为 u u u、 v v v轴的尺度因子
M 1 = [ α x 0 u 0 0 0 α y v 0 0 0 0 1 0 ] \mathrm{M}_1=\begin{bmatrix} \alpha_x & 0 & u_0 & 0 \\ 0 & \alpha_y & v_0 & 0\\ 0 & 0 & 1 &0 \end{bmatrix} M1=⎣⎡αx000αy0u0v01000⎦⎤称为相机的内部参数矩阵
M 2 = [ R t 0 1 ] \mathrm{M}_2=\begin{bmatrix} \mathrm{R} & t \\ 0 & 1 \end{bmatrix} M2=[R0t1]称为相机的外部参数矩阵
M \mathrm{M} M= M 1 \mathrm{M}_1 M1 M 2 \mathrm{M}_2 M2 称为投影矩阵
在几何光学和阴极射线管(CRT)显示中,畸变(Distortion) 也是对直线投影(Rectilinear Projection) 的一种偏移。简单来说,直线投影是场景内的一条直线投影到图片上也保持为一条直线,那畸变简单来说就是一条直线投影到图片上不能保持为一条直线了,这是一种光学畸变(Optical Aberration)。
畸变一般分为两大类,包括径向畸变(Radial Distortion)和切向畸变,径向畸变来自透镜形状,切向畸变来自整个摄像机的组装过程。畸变还有其他类型的畸变,但没有径向畸变和切向畸变这么显著。
实际摄像机的透镜,总是在成像仪的边缘产生显著的畸变,这种现象来源于透镜形状“筒形”或“鱼眼”的影响。光现在远离透镜中心的地方更加弯曲,光学中心的畸变为0。
切向畸变是由于透镜制造上的缺陷使得透镜本身与图像平面不平行而产生的
既然有畸变,就需要对畸变进行矫正
x c o r r = x d i s ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) x_{corr}=x_{dis}(1+k_1r^2+k_2r^4+k_3r^6) xcorr=xdis(1+k1r2+k2r4+k3r6)
y c o r r = y d i s ( 1 + k 1 r 2 + k 2 r 4 + k 3 r 6 ) y_{corr}=y_{dis}(1+k_1r^2+k_2r^4+k_3r^6) ycorr=ydis(1+k1r2+k2r4+k3r6)
其中, x d i s x_{dis} xdis, y d i s y_{dis} ydis表示有畸变的坐标, x c o r r x_{corr} xcorr, y c o r r y_{corr} ycorr表示修复后的坐标, k 1 k_1 k1, k 2 k_2 k2, k 3 k_3 k3表示径向畸变参数,r是跟相机径向相关的一个值
x c o r r = x d i s + [ 2 p 1 x y + p 2 ( r 2 + 2 x 2 ) ] x_{corr}=x_{dis}+[2p_1xy+p_2(r^2+2x^2)] xcorr=xdis+[2p1xy+p2(r2+2x2)]
y c o r r = y d i s + [ p 1 ( r 2 + 2 y 2 ) + 2 p 2 x y ] y_{corr}=y_{dis}+[p_1(r^2+2y^2)+2p_2xy] ycorr=ydis+[p1(r2+2y2)+2p2xy]
其中, x d i s x_{dis} xdis, y d i s y_{dis} ydis表示有畸变的坐标, x c o r r x_{corr} xcorr, y c o r r y_{corr} ycorr表示修复后的坐标, p 1 p_1 p1, p 2 p_2 p2表示切向畸变系数, x x x, y y y是跟像素位置相关的值
那么,最终得到的5个畸变参数为
D = ( k 1 , k 2 , k 3 , p 1 , p 2 ) D=(k_1,k_2,k_3,p_1,p_2) D=(k1,k2,k3,p1,p2)
经过以上讨论推导,对于一个单目相机而言,一共有16个相机参数
K = ( f , d x , d y , u 0 , v 0 ) K=(f,dx,dy,u_0,v_0) K=(f,dx,dy,u0,v0)
D = ( k 1 , k 2 , k 3 , p 1 , p 2 ) D=(k_1,k_2,k_3,p_1,p_2) D=(k1,k2,k3,p1,p2)
R = ( ψ , θ , ϕ ) R=(\psi,\theta,\phi) R=(ψ,θ,ϕ)
t = ( t x , t y , t z ) t=(t_x,t_y,t_z) t=(tx,ty,tz)
给定物体的参考点坐标 ( x , y , z ) (x,y,z) (x,y,z)和它的像素坐标 ( u , v ) (u,v) (u,v),确定相机内部的几何和光学特性(相机内部参数)以及相机坐标系与世界坐标系关系(相机外部参数)
在一定相机模型下,基于特定的实验条件,如形状、尺寸已知的参考物,进行图像处理、数学变换、技术方法,求取相机内外参数。包括利用最优化算法的标定方法,利用相机变换矩阵的标定方法,进一步考虑畸变补偿的两步法、张正友标定法。
假设标定棋盘位于世界坐标系中 Z W = 0 Z_W=0 ZW=0平面,
s [ u v 1 ] = [ f x γ u 0 0 f y v 0 0 0 1 ] [ r 1 r 2 t ] [ X W Y W 1 ] s\begin{bmatrix} u \\ v\\ 1 \end{bmatrix}= \begin{bmatrix} f_x & \gamma & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} r_1 & r_2 & t \end{bmatrix} \begin{bmatrix} X_W \\ Y_W\\ 1 \end{bmatrix} s⎣⎡uv1⎦⎤=⎣⎡fx00γfy0u0v01⎦⎤[r1r2t]⎣⎡XWYW1⎦⎤
其中 γ \gamma γ是径向畸变系数
来描述物体在世界坐标系和像素坐标系之间的位置映射关系。对应的变换矩阵称为单应性变换。单应性矩阵定义为
H = [ f x γ u 0 0 f y v 0 0 0 1 ] [ r 1 r 2 t ] H=\begin{bmatrix} f_x & \gamma & u_0 \\ 0 & f_y & v_0 \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} r_1 & r_2 & t \end{bmatrix} H=⎣⎡fx00γfy0u0v01⎦⎤[r1r2t]
其中, H H H为一个3*3的矩阵,并且有一个元素作为齐次坐标。因此,H有8个自由度。现在有8个自由度需要求解,所以需要四个对应点。也就是四个点就可以求出图像平面到世界平面的单应性矩阵H。
这是一种不依赖参考物的标定方法,利用相机本身参数之间的约束关系来标定,利用周围图像与图像之间的对应关系,与场景和相机运动无关。基于Krupa方程、分层逐步标定法、基于二次曲面自标定法。