视觉里程计系列(3):什么是视觉里程计(visual odometry)及相机模型
视觉里程计的主要任务是根据图像对相机的运动(包括旋转和平移)进行估计。它根据图像序列序列,估计相机的运动轨迹和场景的空间结构,而SLAM需要再此基础上通过后端进一步优化,通过闭环检测改善飘移的情况,从而构建地图。
VO是什么?
视觉里程计的主要任务是根据图像对相机的运动(包括旋转和平移)进行估计。它根据图像序列序列,估计相机的运动轨迹和场景的空间结构,而SLAM需要再此基础上通过后端进一步优化,通过闭环检测改善飘移的情况,从而构建地图。
相机成像模型
(1)世界坐标系(World Coordinate System)。用户定义的三维世界的坐标系,以某个点为原点,为了描述物体在真实世界中的位置而被引入,单位为m。(Xw,Yw,Zw)(X_{w},Y_{w},Z_{w})(Xw,Yw,Zw)
(2)相机坐标系(Camera Coordinate System)。以相机为原点建立的坐标系,为了从相机的角度描述物体的位置而被定义,作为沟通世界坐标系和图像坐标系的一环。单位为m。(Xc,Yc,Zc)(X_{c},Y_{c},Z_{c})(Xc,Yc,Zc)
(3)图像坐标系(Image Coordinate System)。为了描述成像过程中物体从相机坐标系到图像坐标系的投影透视关系而被引入,方便进一步得到像素坐标系下的坐标。单位为m。(x,y)(x,y)(x,y)
(4)像素坐标系(Pixel Coordinate System)。为了描述物体成像后的像点在数字图像上的坐标而被引入,是我们真正从相机内读取到的图像信息所在的坐标系。单位为像素。(u,v)(u,v)(u,v)
相机坐标系的Z轴和光轴重合,且垂直于图像坐标系平面并通过图像坐标系的原点;像素坐标系和图像坐标系平面重合,但图像坐标系的原点位于图像的正中心,而像素坐标系的原点位于图像的左上角,这是因为虽然成像时是以图像中点为原点的,但是图像数据是从左上角以二维数组的形式存储的,如一张宽度为640像素,高度为480像素分辨率的灰度图,即为480×640480 \times 640480×640,第一个表示行(高),第二个表示列(宽)。
坐标系之间的转化
1、从世界坐标系到相机坐标系
世界坐标系用来描述相机相对于世界坐标系原点的位置。
假设世界坐标系下的一个三维点 Pw=(Xw,Yw,Zw)P_{w}=(X_{w},Y_{w},Z_{w})Pw=(Xw,Yw,Zw),通过旋转矩阵RRR和平移向量ttt组成的变化矩阵 TcwT_{cw}Tcw 变换到相机坐标系下,得到相机坐标系下的三维点 Pc=(Xc,Yc,Zc)P_{c}=(X_{c},Y_{c},Z_{c})Pc=(Xc,Yc,Zc)。
TcwT_{cw}Tcw表示从世界坐标系到相机坐标系的变化,它的定义是
Tcw=[RtO1] T_{cw}=\left [ \begin{matrix} R & t\\ O & 1 \end{matrix} \right ] Tcw=[ROt1]
使用齐次坐标系表示
[XcYcZc1]=[RtO1][XwYwZw1] \left [ \begin{matrix} X_{c}\\ Y_{c}\\ Z_{c}\\ 1 \end{matrix} \right ] = \left [ \begin{matrix} R & t\\ O & 1 \end{matrix} \right ] \left [ \begin{matrix} X_{w}\\ Y_{w}\\ Z_{w}\\ 1 \end{matrix} \right ]
XcYcZc1
=[ROt1]
XwYwZw1
2、从相机坐标系到图像坐标系
针孔相机成像模型(小孔成像),从相机坐标系下的三维点 Pc=(Xc,Yc,Zc)P_{c}=(X_{c},Y_{c},Z_{c})Pc=(Xc,Yc,Zc) 在相机成像平面上成的像为 (x,y)(x,y)(x,y),具体推导步骤:
记相机的焦距为 fff,根据相似三角形,有
fZc=xXc=yYc \frac{f}{Z_{c}}= \frac{x}{X_{c}}=\frac{y}{Y_{c}} Zcf=Xcx=Ycy
整理后得
x=fXcZcy=fYcZc x=f\frac{X_{c}}{Z_{c}} \\ y=f\frac{Y_{c}}{Z_{c}} x=fZcXcy=fZcYc
3、从图像坐标系到像素坐标系
记 cx,cyc_{x},c_{y}cx,cy 分别代表两个坐标平移,一般是图像长度和宽度的一般,u,vu,vu,v 都是像素坐标系下的坐标,则有
{u=αx+cxv=βy+cy \left\{\begin{matrix} u=\alpha x+c_{x} \\ v=\beta y+c_{y} \end{matrix}\right. {u=αx+cxv=βy+cy
其中,α、β\alpha 、\betaα、β 指图像坐标系到像素坐标系的缩放比例,单位为 m/像素m/像素m/像素,fff 的单位是 mmm。将2整理后的公式代入上式,有
{u=αfXcZc+cxv=βfYcZc+cy \left\{\begin{matrix} u=\alpha f\frac{X_{c}}{Z_{c}}+c_{x} \\ v=\beta f\frac{Y_{c}}{Z_{c}}+c_{y} \end{matrix}\right. {u=αfZcXc+cxv=βfZcYc+cy
记 fx=αff_{x}=\alpha ffx=αf, fy=βff_{y}=\beta ffy=βf,上式改写为
{u=fxXcZc+cxv=fyYcZc+cy \left\{\begin{matrix} u=f_{x}\frac{X_{c}}{Z_{c}}+c_{x} \\ v=f_{y}\frac{Y_{c}}{Z_{c}}+c_{y} \end{matrix}\right. {u=fxZcXc+cxv=fyZcYc+cy
用矩阵表示
[uv1]=1Zc[fx0cx0fycy001][XcYcZc]=1ZcKPc \left [ \begin{matrix} u \\ v \\ 1 \end{matrix} \right ] =\frac{1}{Z_{c}}\begin{bmatrix} f_{x} & 0 & c_{x} \\ 0 & f_{y} & c_{y} \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_{c}\\ Y_{c}\\ Z_{c} \end{bmatrix}=\frac{1}{Z_{c}}KP_{c}
uv1
=Zc1
fx000fy0cxcy1
XcYcZc
=Zc1KPc
其中,最左侧的像素坐标 Puv=[u,v,1]TP_{uv}=[u,v,1]^{T}Puv=[u,v,1]T 是像素齐次坐标, 三维点 Pc=[Xc,Yc,Zc]TP_{c}=[X_{c},Y_{c},Z_{c}]^{T}Pc=[Xc,Yc,Zc]T 是非齐次坐标。
矩阵 KKK 是内参矩阵(相机出厂后固定,不会在使用过程中发生变化),PcP_{c}Pc 是相机坐标系下的点。
最右侧有一个系数 1Zc\frac{1}{Z_{c}}Zc1, ZcZ_{c}Zc 是相机坐标系下三维点 PcP_{c}Pc 在 zzz 轴上的坐标,将 1Zc\frac{1}{Z_{c}}Zc1 与 Pc=(Xc,Yc,Zc)P_{c}=(X_{c},Y_{c},Z_{c})Pc=(Xc,Yc,Zc) 相乘,得到相机坐标系下 PcP_{c}Pc 的归一化坐标 $\tilde{P_{c}}=(X_{c}/Z_{c},Y_{c}/Z_{c},1) $,位于相机前方 z=1z=1z=1 的平面上,可写为
Puv=KPc~ P_{uv}=K\tilde{P_{c}} Puv=KPc~
结合前面世界坐标到相机坐标系的变换,得到从世界坐标系到像素坐标系的变换,如下
[uv1]=1Zc[fx0cx0fycy001]3×3[IO]3×4[RtO1]4×4[XwYwZw1]4×1 \left[\begin{array}{c}u \\ v \\ 1\end{array}\right]=\frac{1}{Z_c}\left[\begin{array}{ccc}f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1\end{array}\right]_{3 \times 3}\left[\begin{array}{ll}\boldsymbol{I} & \boldsymbol{O}\end{array}\right]_{3 \times 4}\left[\begin{array}{cc}\boldsymbol{R} & \boldsymbol{t} \\ \boldsymbol{O} & 1\end{array}\right]_{4 \times 4}\left[\begin{array}{c}X_w \\ Y_w \\ Z_w \\ 1\end{array}\right]_{4 \times 1}
uv1
=Zc1
fx000fy0cxcy1
3×3[IO]3×4[ROt1]4×4
XwYwZw1
4×1
其中,III 表示 3×33 \times 33×3 的单位矩阵。
一个三维点投影到图像平面上的二维像素坐标是一个从三维到二维的降维过程,这是不可逆的。
相机畸变模型
为了获得更好的效果,会在相机的前方加上透镜,透镜会对成像过程中的光线传播造成影响:
- 透镜自身的形状对光线传播的影响
- 在机械组装过程中,透镜和成像平面不可能完全平行,这也会使光线穿过透镜投影到成像平面时的位置发生变化
径向畸变
产生原因与透镜形状相关。
图像畸变程度在以图像中心点 OOO 为圆心,距离 OBOBOB 为半径的圆上都是相同的。(在入射光线和透镜光轴夹角保持相同的情况下,不管光线是从哪个方向入射,折射率都是一样的,即在图像平面上的成像点距离图像中心点的半径 OBOBOB 也是固定的)
桶形畸变呈现中间凸起的趋势,凸起程度随着与图像几何中心距离的增大而减小;
枕形畸变呈现中间凹下的趋势。
切向畸变
产生原因是由透镜和成像传感器的安装位置引起的。
畸变模型
假设径向畸变或切向畸变可以用多项式来描述,假设归一化平面上的任意一点 ppp,其坐标为 [x,y]⊤[x,y]^{\top}[x,y]⊤,用极坐标表示为 [r,θ]⊤[r,\theta]^{\top}[r,θ]⊤,rrr 表示半径,θ\thetaθ 表示与水平坐标系的夹角。
- 径向畸变可以看成坐标点沿着长度方向发生了变化,也就是其距离原点的长度发生了变化;
- 切向畸变可以看成坐标点沿着切线方向发生了变化,也就是水平夹角发生了变化。
通常假设这些畸变呈多项式关系,即
径向畸变模型可以描述为
xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6) 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}) xdistorted=x(1+k1r2+k2r4+k3r6)ydistorted=y(1+k1r2+k2r4+k3r6)
切向畸变模型可以描述为
xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2x2)+2p2xy x_{distorted}=x+2p_{1}xy+p_{2}(r^{2}+2x^{2})\\ y_{distorted}=y+p_{1}(r^{2}+2x^{2})+2p_{2}xy xdistorted=x+2p1xy+p2(r2+2x2)ydistorted=y+p1(r2+2x2)+2p2xy
其中,[xdistorted,ydistorted]⊤[x_{distorted},y_{distorted}]^{\top}[xdistorted,ydistorted]⊤ 是畸变后点的归一化坐标。k1,k2,k3,p1,p2k_{1},k_{2},k_{3},p_{1},p_{2}k1,k2,k3,p1,p2 是畸变模型中的参数。
对于相机坐标系下的一点 PPP,通过5个畸变系数找到这个点在像素平面上的正确位置:
- 将三维空间点投影到归一化图像平面。设它的归一化坐标为 [x,y]⊤[x,y]^{\top}[x,y]⊤。
- 对归一化平面上的点计算径向畸变和切向畸变
xdistorted =x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted =y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy \begin{aligned} & x_{\text {distorted }}=x\left(1+k_1 r^2+k_2 r^4+k_3 r^6\right)+2 p_1 x y+p_2\left(r^2+2 x^2\right) \\ & y_{\text {distorted }}=y\left(1+k_1 r^2+k_2 r^4+k_3 r^6\right)+p_1\left(r^2+2 y^2\right)+2 p_2 x y\end{aligned} xdistorted =x(1+k1r2+k2r4+k3r6)+2p1xy+p2(r2+2x2)ydistorted =y(1+k1r2+k2r4+k3r6)+p1(r2+2y2)+2p2xy
- 将畸变后的点通过内参矩阵投影投影到像素平面,得到该点在图像上的正确位置。
u=fxxdistorted+cxv=fxydistorted+cy u=f_{x} x_{distorted}+c_{x} \\ v=f_{x} y_{distorted}+c_{y} u=fxxdistorted+cxv=fxydistorted+cy
更多推荐
所有评论(0)