移动机器人相机模型:从相机移动到二维图像

​ 若是只是但愿获取图像上的一些信息(例如特征提取、拟合等),那么咱们不会对三维空间中相机的位置有所要求。但若是但愿经过二维的图像去理解三维空间中摄像机的信息,或者是图像中物体在三维空间中的信息,那么就不得不考虑成像过程当中三维变化为二维时的具体过程。而摄像机模型就是三维到二维的一种映射。本文简要总结了单目相机的成像过程,以便于读者将相机模型做为一种基础的工具理解更深层次的内容。git

​ 本文经过讲解三维世界坐标系下某一点是如何被映射到二维图像上的一点的完整流程来说解,如下为总体流程:github

\[World\ \to Camera\ \to Retinal\ \to Pixel\ \]

(世界坐标系——相机坐标系——成像平面坐标系——图像坐标系)ide

下面对这四个坐标系做出一个简要的介绍:工具

  • 世界坐标系 P_w:一般是三维空间中人为选择的一个参考坐标系。单位为物理单位,例如m。
  • 相机坐标系 P_c:三维空间中,一般以摄像机的光心做为原点,光轴做为z轴的一个坐标系。能够经过世界坐标系的平移和旋转来得到。单位为物理单位,例如m。
  • 成像平面坐标系 P:经过相机模型映射获得的一个二维坐标系。单位为物理单位,例如m。
  • 图像坐标系 P_uv:经过所成像转换得到的在计算机内部能够存储的矩阵图像上的坐标系。单位为像素。

1. World -> Camera

假如摄像头固定不动,那么世界坐标系和相机坐标系能够直接重合。但若是咱们要把摄像头放在一个可以移动的机器人身上,那么就有必要令一个固定的坐标系和一个跟着机器人走的相机坐标系。3d

​ 若是上述这句话你不太理解,那就说明你确实有必要阅读这篇文章,等到阅读结束后再回过头来思考这个问题。而如今,你只须要知道,咱们在这里考虑的是后面这种状况,即摄像头置于移动机器人上code

​ 做为一个移动机器人,它必然有所处位置坐标和一个朝向,咱们把机器人的位置和朝向称为位姿。若是它还没开始运动,咱们不妨将该位置做为世界坐标系原点,而相机朝向做为Z轴:视频

1

​ 机器人在空间中会进行移动和转向,因而咱们能够按照一样方式定义一个跟随着机器人进行移动的坐标系,称为相机坐标系。blog

​ 为了表示出这种移动和转向,咱们须要知道机器人相对于原来位置移动了多少,旋转了多少。get

​ 很天然的,咱们能够经过当前机器人在世界坐标系下的坐标,来表示机器人是如何从世界坐标系原点移动到当前位置。因而把该坐标,称为平移向量it

​ 而对于旋转,一般使用旋转矩阵R进行描述。对于如何理解旋转矩阵,我这里推荐看台大的机器人学视频P4(经过列空间变换和投影的方式去理解)。我这里直接使用单位正交基的方式进行描述,意思是一致的。总之,下式表示是在A看来B坐标系的姿态,或者能够把在B坐标系下的坐标表示经过左乘下列R转换成A坐标系下的坐标表示。

\[R_{AB}=\begin{bmatrix} |&|&|\\\hat X_B^A & \hat Y_B^A & \hat Z_B^A\\ |&|&|\\\end{bmatrix}=\begin{bmatrix}e_1^Ae_1^B & e_2^Ae_1^B & e_3^Ae_1^B\\ e_1^Ae_2^B & e_2^Ae_2^B & e_3^Ae_2^B\\e_1^Ae_3^B & e_2^Ae_3^B & e_3^Ae_3^B\\ \end{bmatrix} \]

​ 也就是说,旋转矩阵R除了表示在A看来B坐标系的姿态,也能够用来转换空间中某一点的坐标表示(而这正是咱们的相机模型最须要的)。即有:

\[P^A=R_{AB}P^B \]

​ 此外在机器人学中比较重要的一点是,R可以用来描述物体的旋转。例以下式就表示的是在A坐标系下点1经过一个R旋转至点2。

\[P_2^A=RP_1^A \]

​ 回到咱们的机器人上来。假定如今机器人在世界坐标系初始位置时看到了一点 P_W,而后通过一次旋转和平移,此时看到了同一个点,坐标为 P_C。经过上面的定义,咱们可以很天然的获得一个等式:

\[P_c=R_{cw}P_w+t_{cw} \]

​ 咱们一般把这里的 R t称为相机的外参

​ 为了矩阵运算上的便利,上式同时也能够表现成下面这样(注意使用的是齐次坐标的形式):

\[\begin{bmatrix} x_w\\y_w\\z_w\\1 \end{bmatrix} = \begin{bmatrix} R & t \\ 0^t & 1 \end{bmatrix} \begin{bmatrix} x_c\\y_c\\z_c\\1 \end{bmatrix} \]

​ 常将中间由R和t组成的矩阵写做变换矩阵T,因而能够表示成下列形式:

\[P_c=T_{cw}P_w \ldots\ldots0 \]

​ 此式子即为世界坐标系转换为相机坐标系的变换式。它揭示了两个很简单的道理:1. 知道 R_cw t_cw,那就可以将点在两个坐标系下进行转换。2. 若是知道多个点在两个坐标系下的坐标表示,那就能够求解得到 R_cw t_cw

2. Camera -> Retinal

​ 好了,如今咱们已经可以知道如何把世界坐标系下的点转换成相机坐标系下的点了,如今咱们要考虑的是三位空间下的点是如何转换到二维平面上。此刻咱们考虑的几何模型才是真正的相机模型。

​ 相机模型一般会考虑两种:针孔模型透镜模型。

​ 通常来讲,考虑针孔模型就够了,由于透镜模型不过是将针孔模型的焦距f进行修改。

​ 首先先考虑针孔模型(图源):

​ 如上图所示,针孔模型能够简单看做,位于三维空间中的某一点P通过相机坐标系的中心点O映射至像平面坐标系上的P'的一个过程。因而乎,咱们能够把这一模型视做一个类似三角形模型:

​ 很容易看出来左边X成像是倒的,对于坐标系来讲这样的倒会引入负号,所以咱们在O点右侧也画一个X‘,这样就能消除这个负号。而对于引入的橙色X’所在平面,咱们称为归一化成像平面。因而成像过程就有以下式子:

\[X' = f \cfrac {X_c} {Z_c} \ldots \ldots 1 \]

\[Y' = f \cfrac {Y_c} {Z_c}\ldots\ldots 2 \]

3. Retinal -> Pixel

​ 由上面的推导,咱们很清楚,它们都是在物理层面进行转换的,所以单位都是m。而真正拿到咱们手中的是一张张由像素点构成的矩阵图像。所以在成像平面坐标系到图像坐标系还须要进行采样和量化。而同时咱们也清楚,图像坐标的原点一般在图像左上角,x轴朝向图像右边,y轴竖直向下。而成像平面坐标系的原点则是在像的中间。所以要把成像平面坐标系转换至像素坐标系,须要进行一次缩放和原点平移

​ 所以,成像平面坐标系的坐标P’到像素坐标[u,v]有以下关系:

\[u = aX'+c_x\ldots\ldots3 \]

\[v = aY'+c_y\ldots\ldots4 \]


​ 至此,咱们已经完成了每个局部过程的推导。可是,咱们不可能每次都这样一次一次进行部分运算,若是咱们但愿直接把相机坐标系下的点转换到像素坐标系下,该怎么转换?又或者,咱们但愿从世界坐标系下的点开始转换呢?下面就会对这样的过程进行讲解。

Camera -> Pixel

​ 在上面,咱们已经得到了 Camera -> Retinal Retinal -> Pixel的式子,所以能够将 X',Y'消去(即把1和2带入3和4),获得下列式子:

\[u = af \cfrac {X_c} {Z_c}+c_x \]

\[v = bf \cfrac {Y_c} {Z_c}+c_y \]

​ 一般地,咱们会令 f_x = aff_y = bf(这是因为a的单位为pixel/m,而f的单位为m,相乘从而将量纲统一到pixel):

\[u = f_x \cfrac {X_c} {Z_c}+c_x \]

\[v = f_y \cfrac {Y_c} {Z_c}+c_y \]

​ 将上式化做矩阵形式:

\[\begin{bmatrix} u\\v\\1 \end{bmatrix} = \frac 1 {Z_c} \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_x & c_y \\ 0 & 0 & 1 \end{bmatrix} \begin{bmatrix} X_c\\Y_c\\Z_c \end{bmatrix}\ldots\ldots5 \]

​ 一般咱们会将中间的3*3矩阵做为内参矩阵K,咱们很清楚,前面的f是固定的,a是采样过程固定的,所以f_x也是固定的,也就是说内参矩阵K也是从出厂开始就是固定的:

\[K = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_x & c_y \\ 0 & 0 & 1 \end{bmatrix} \]

​ 5式一般又能够写做下列形式:

\[ZP_{uv} = KP_c\ldots\ldots6 \]

World -> Pixel

​ 因为咱们的机器人的运动,致使相机也不断在运动,所以咱们能够把0式代入到6式中:

\[ZP_{uv}=KT_{cw}P_w \]

​ 至此,咱们已经完成了整个过程的推导。

相关文章
相关标签/搜索