搞视觉SLAM的,如果对这个关系都不是很清楚的话,那说明你太忙了,忙于写着业务代码,却忘了原理才是我们业务的骨架,不搞清楚这些,升职加薪无望啊,那我们就来看看,这些极具价值的知识究竟是什么东西。
计算机视觉领域中常见的四个坐标系:像素坐标系、图像坐标系,相机坐标系,世界坐标系。
像素坐标系(u,v)(u,v)(u,v)
图像坐标系(x,y)(x,y)(x,y)
相机坐标系(Xc,Yc,Zc)(X_c,Y_c,Z_c)(Xc,Yc,Zc)
世界坐标系(Xw,Yw,Zw)(X_w,Y_w,Z_w)(Xw,Yw,Zw)
1. 像素坐标系
如下图所示,像素坐标系u-v的原点为O0O_0O0,横坐标u和纵坐标v分别是图像所在的行和列,在视觉处理库OpenCV中,u对应x,v对应y。
2. 图像坐标系
如图所示,图像坐标系x-y的原点是O1O_1O1,为像素坐标系的中点:
从上图可知,O1O_1O1在u-v坐标系下的坐标,假设dxd_xdx和dyd_ydy分别表示每个像素在横轴x和纵轴y的物理尺寸,单位为毫米/像素,O1O_1O1在图像坐标系和在像素坐标系的坐标的关系是:
u=xdx+u0(1)u=\frac{x}{d_x}+u_0\tag{1}u=dxx+u0(1)
v=ydy+v0(2)v=\frac{y}{d_y}+v_0\tag{2}v=dyy+v0(2)
假设物理坐标系中的单位为毫米,那么dx的单位为毫米/像素,dx,dyd_x,d_ydx,dy表示感光芯片上像素的实际大小,是连接像素坐标系和真实尺寸坐标系的。u0,v0u_0,v_0u0,v0表示的是图像的中心像素坐标和图像圆点像素坐标之间相差的横向和纵向像素数。得出这个公式后我们可以运用线性代数的知识把方程用矩阵形式表示:
[uv1]=[1dx0u001dyv0001][xy1](3)\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} \tag{3} ⎣⎡uv1⎦⎤=⎣⎡dx1000dy10u0v01⎦⎤⎣⎡xy1⎦⎤(3)
或者
[xy1]=[dx0−u0dx0dy−v0dy001][uv1](4)\begin{bmatrix} x\\y\\1 \end{bmatrix}= \begin{bmatrix} d_x&0&-u_0d_x\\0&d_y&-v_0d_y\\0&0&1 \end{bmatrix} \begin{bmatrix} u\\v\\1 \end{bmatrix} \tag{4} ⎣⎡xy1⎦⎤=⎣⎡dx000dy0−u0dx−v0dy1⎦⎤⎣⎡uv1⎦⎤(4)
3. 相机坐标系
相机坐标系与图像坐标系的关系如下图:
脑补各种三角形相似之后可得:
ABoC=XCx=AOCoOC=ZCf=PBpC=YCy(5)\frac{AB}{oC}= \frac{X_C}{x}= \frac{AO_C}{oO_C}= \frac{Z_C}{f}= \frac{PB}{pC}= \frac{Y_C}{y} \tag{5} oCAB=xXC=oOCAOC=fZC=pCPB=yYC(5)
结合公式(1)和(2),可以得到:
u=xdx+u0=XCZCdxf+u0⟹fxXCZC+u0(6)u=\frac{x}{d_x}+u_0=\frac{X_C}{Z_Cd_x}f+u_0\tag{6} \\\Longrightarrow f_x\frac{X_C}{Z_C}+u_0 u=dxx+u0=ZCdxXCf+u0⟹fxZCXC+u0(6)
v=ydy+v0=YCZCdyf+v0⟹fyYCZC+v0(7)v=\frac{y}{d_y}+v_0=\frac{Y_C}{Z_Cd_y}f+v_0\tag{7} \\\Longrightarrow f_y\frac{Y_C}{Z_C}+v_0 v=dyy+v0=ZCdyYCf+v0⟹fyZCYC+v0(7)
其中,fx、fyf_x、f_yfx、fy是相机焦距fff除以dx、dyd_x、d_ydx、dy得到的值,还记得前面说的吗?
dx、dyd_x、d_ydx、dy单位为毫米/像素,dx,dyd_x,d_ydx,dy表示感光芯片上像素的实际大小,是连接像素坐标系和真实尺寸坐标系的
,即有fx=fdx,fy=fdyf_x = \frac{f}{d_x},f_y = \frac{f}{d_y}fx=dxf,fy=dyf,这就是我们经常在内参矩阵中看到的fx、fyf_x、f_yfx、fy参数来源。把公式(6)、(7)写成矩阵的形式,可得:
[uv1]=[fx0u00fyv0001][XCZCYCZC1](8)\begin{bmatrix} u\\v\\1 \end{bmatrix}= \begin{bmatrix} f_x&0&u_0\\0&f_y&v_0\\0&0&1 \end{bmatrix} \begin{bmatrix} \frac{X_C}{Z_C}\\\frac{Y_C}{Z_C}\\1 \end{bmatrix} \tag{8} ⎣⎡uv1⎦⎤=⎣⎡fx000fy0u0v01⎦⎤⎣⎡ZCXCZCYC1⎦⎤(8)
接下来,是最后一个坐标系:世界坐标系。
4. 世界坐标系
默认两个坐标系都是右手坐标系,从相机坐标系到世界坐标系属于刚体变换,即物体不会发生形变,主要依靠旋转变换和平移变换。
关于这部分,我就不过多阐述了,感兴趣的童鞋可以参考二维平移旋转过程,最后得到世界坐标系和相机坐标系之间的关系是:
[XCYCZC]=R[XWYWZW]+T(9)\begin{bmatrix} X_C\\Y_C\\Z_C \end{bmatrix}= R \begin{bmatrix} X_W\\Y_W\\Z_W \end{bmatrix}+T \tag{9} ⎣⎡XCYCZC⎦⎤=R⎣⎡XWYWZW⎦⎤+T(9)
其中,XC,YC,ZCX_C,Y_C,Z_CXC,YC,ZC为相机坐标,XW,YW,ZWX_W,Y_W,Z_WXW,YW,ZW为世界坐标,RRR为旋转矩阵,TTT为平移矩阵。
5. 总结
综上,从像素坐标系到世界坐标系经过了三次变换:
像素与像平面投影关系相机与世界
从公式推导看,其公式为:
ZC[uv1]=[1dx0u001dyv0001][f0000f000010][Rt01][XCYCZC1](10)Z_C\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} f&0&0&0\\0&f&0&0\\0&0&1&0 \end{bmatrix} \begin{bmatrix} R&t\\0&1 \end{bmatrix} \begin{bmatrix} X_C\\Y_C\\Z_C\\1 \end{bmatrix} \tag{10} ZC⎣⎡uv1⎦⎤=⎣⎡dx1000dy10u0v01⎦⎤⎣⎡f000f0001000⎦⎤[R0t1]⎣⎢⎢⎡XCYCZC1⎦⎥⎥⎤(10)
对应如上变换,其关系如下:
转换成我们常用的形式,就是:
ZC[uv1]=[fx0u000fyv000010]⏟内参[Rt01]⏟外参[XCYCZC1](11)Z_C\begin{bmatrix} u\\v\\1 \end{bmatrix}= \underbrace{ \begin{bmatrix} f_x&0&u_0&0\\0&f_y&v_0&0\\0&0&1&0 \end{bmatrix} }_{\text{内参}} \underbrace{ \begin{bmatrix} R&t\\0&1 \end{bmatrix} }_{\text{外参}} \begin{bmatrix} X_C\\Y_C\\Z_C\\1 \end{bmatrix} \tag{11} ZC⎣⎡uv1⎦⎤=内参⎣⎡fx000fy0u0v01000⎦⎤外参[R0t1]⎣⎢⎢⎡XCYCZC1⎦⎥⎥⎤(11)
6. 关系图
大家还有疑问的话,可以认真研究下图,懂了之后能解决很多心里的疑问(点击查看高清大图):
7. Jacobian
现有内参矩阵是K,K是:
K=[fx0cx0fycy001]K= \begin{bmatrix} fx & 0 & cx\\ 0 & fy & cy\\ 0 & 0 & 1 \end{bmatrix} K=⎣⎡fx000fy0cxcy1⎦⎤
现有三维坐标点p=[pxpypz]Tp=\begin{bmatrix} px & py & pz \end{bmatrix} ^Tp=[pxpypz]T,其在相机平面上投影的像素坐标点是(u,v)(u,v)(u,v),投影函数设为hhh,则hhh可表示成:
h(p)=h[pxpypz]=[cx+fx∗px/pzcy+fy∗py/pz]h(p)=h\begin{bmatrix} px \\ py \\ pz \end{bmatrix}=\begin{bmatrix} cx+fx*px/pz \\ cy+fy*py/pz \end{bmatrix} h(p)=h⎣⎡pxpypz⎦⎤=[cx+fx∗px/pzcy+fy∗py/pz]
其Jacobian矩阵是:
∂h(p)∂p=[fx/pz0−fx∗px/pz20fy/pz−fy∗py/pz2]\frac{\partial h(p)}{\partial p} = \begin{bmatrix} fx/pz&0&-fx*px/pz^2 \\ 0&fy/pz&-fy*py/pz^2 \end{bmatrix} ∂p∂h(p)=[fx/pz00fy/pz−fx∗px/pz2−fy∗py/pz2]
参考:
1.世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换
2.世界坐标系和相机坐标系,图像坐标系的关系
3.单目和多目视觉统一标定
4.LaTeX 特殊符号、加帽子符号、横线和波浪线