摄像几何及相机内外参数

摄像几何(坐标系的转换及相机内外参)

最近在使用 open3d 从 depth map 转点云时接触到了相机内外参的相关内容,但是查阅许久之后感觉查到的对于相机内外参的转换都说的不够明朗,于是决定自己写一篇摄像几何的相关内容来记录一下,这篇博客将包含某个点从世界坐标系,到摄像机坐标系,再到成像平面坐标系,最后到像素坐标系的转换,同时也包含了相机内外参的相关内容~😄

1. 坐标系定义

世界坐标系:描述相机和待测物体空间位置的三维直角坐标系。

摄像机坐标系:该坐标系原点为相机的光圈, $Z$ 轴为相机的光轴,其 $X$ 轴和 $Y$ 轴通常平行于成像坐标系的X轴和Y轴

成像坐标系:成像平面则是指物体通过摄像机成像后,该图像所在的平面,该平面以米为单位。该平面原点通常在摄像机坐标系的 $Z$ 轴上,且和相机光圈的距离是焦距 $f$ ,其 $X$ 和 $Y$ 轴平行于摄像机坐标的 $X$ 和 $Y$ 轴

像素坐标系:该平面以像素为单位,说白了就是一个单独的坐标系,该坐标系可以从成像坐标系将单位转换为像素后获得,至于为什么要转换呢?我们在计算机上看到的图片是以像素为单位的,而成像平面是以米为单位的,转换后当然是方便做计算。

2. 摄像机坐标系 到 成像平面坐标系的转换如上图所示,在摄像机坐标系下,我们将 $P(x,y,z)$ 经过成像原理投影到了成像平面上的 $P’(x’,y’)$ ,假设我们已知 $P$ 点坐标,我们现在想将 $P’$ 的坐标用 $x$ 和 $y$ 表示出来。

我们从摄像机坐标系 $i$ 轴方向看,可以看到 $P$ 和 $P’$ 的位置如下图所示:

其中 $f$ 即为相机焦距,$f$ 与相机有关,属于已知条件,根据相似三角形原理,可以得出以下关系:$y’=f\frac{y}{z}$ , 同理,从 $j$ 轴方向看,可得:$x’=f\frac{x}{z}$

那么 $P$ 到 $P’$ (这里的 $P’$ 表示成像平面坐标空间)的映射如下

3.成像平面坐标系 到 像素坐标系的转换3.1 偏置现在,我们已经将摄像机坐标系下的三维空间点映射到了二维成像平面上,但二维成像平面的单位是米,我们用于计算时并不方便,因此我们需要将二维成像平面坐标系上的点,再次映射到以像素为单位的像素平面坐标系上。

如上图所示,像素平面坐标系 $XY$ 的原点位于左下角,假设成像平面坐标系 $X^cY^c$ 的原点在像素平面坐标系上的坐标为 $(C_x,C_y)$ ,那么位于成像平面坐标系上的点 $(f\frac{x}{z},f\frac{y}{z})$ 映射到像素平面坐标系上时,其坐标为 $(f\frac{x}{z}+C_x,f\frac{y}{z}+C_y)$ ,这样就完成了吗?当然不是。

3.2 单位转换我们知道,不论是$f$,$x$ ,$y$ 还是 $z$ ,他们的单位都是米,而这里的$C_x$ 和 $C_y$ 的单位都是像素,肯定是不能直接使用加法操作将两者加到一起的,所以在加法操作之前,需要有一个单位转换的操作。

这里我们引入参数 $k$ 和 $l$ ,他们的单位是 $pixel/m$ ,他们代表的含义分别是在成像平面坐标系的 $x$ 和 $y$ 轴上,一米对应多少个像素宽度,这两个参数大小与相机的成像元器件有关,显然,值越大,越清晰,那么我们将 $k$ 和 $l$ 加入公式中,将 $f\frac{z}{z}$ 和 $f\frac{y}{z}$ 分别乘上 $k$ 和 $l$ ,就把单位从米转换到像素了。到目前为止,三维空间坐标转换到二维像素坐标表达如下:

注意,这里的$k$ 和 $l$ 可能相同也可能不相同

由于 $f$ , $k$ , $l$ 三者均为常数,因此 $fk$ 和 $fl$ 也是常数,我们可以简化一下,令 $\alpha = fk$ ,$\beta=fl$ ,易知$\alpha$,$\beta$ 单位为 $pixel$ ,因此,三维空间坐标到二位像素平面坐标转换表达如下

观察上述表达式可知,从$P(x,y,z)\to P’(x’,y’)$ ,(注意,这里的$P’$ 以及之后出现的$P’$ 均表示为像素坐标)即,从 $(x,y,z)$ 到 $(\alpha\frac{x}{z}+C_x,\beta\frac{y}{z}+C_y)$ ,对于 $x’=\alpha\frac{x}{z}+C_x$,$y’=\beta\frac{y}{z}+C_y$,这两个表达式是非线性的,因为我们改变 $x$ 和 $y$ 的同时,$z$ 也有可能会变化,但如果我们想将这个变化过程优化成线性的该怎么做呢?(转变为线性表达式可以简化后续任务)这里需要引入齐次坐标来解决问题。

4.齐次坐标4.1 欧氏空间坐标到齐次空间坐标 $E \to H$4.2 齐次坐标空间坐标到欧氏空间坐标 $H\to E$值得注意的是,对于同一个欧式坐标,可以有不同的齐次坐标,即两个空间的变换并不是一一对应,比如$\left[\begin{smallmatrix}1\\ 1\\ 1\end{smallmatrix}\right]$ 和 $\left[\begin{smallmatrix}2\\ 2\\ 2\end{smallmatrix}\right]$他们对应的欧式坐标,也就是二维空间坐标都是$(1,1,1)$,他们只是在齐次坐标上相差一个系数而已

5.将坐标转换优化为线性变换有了上述齐次坐标转换的基础后,我们可以将二维像素坐标下的点 $(\alpha\frac{x}{z}+C_x,\beta\frac{y}{z}+C_y)$ 表达为齐次坐标 $\left[\begin{smallmatrix}\alpha x+C_xz \\ \beta y+C_yz \\ z\end{smallmatrix}\right]$,而我们可以发现该齐次坐标矩阵有着如下关系:

其中$P_h’$ 表示像素平面坐标对应的齐次空间下的坐标,而矩阵$ \left[\begin{smallmatrix}x \\ y \\ z \\ 1\end{smallmatrix}\right] $ 又是我们三维空间坐标$(x,y,z)$ 对应的齐次坐标$P_h$,矩阵$\left[\begin{smallmatrix}\alpha & 0 & C_x & 0 \\ 0 & \beta & C_y & 0 \\ 0 & 0 & 1 & 0\end{smallmatrix}\right]$ (记为$M$)是固定不变的,因此在欧式空间下三维到二维的非线性变换 $(x,y,z)$ $\to$ $(x’,y’)=(\alpha\frac{x}{z}+C_x,\beta\frac{y}{z}+C_y)$ ,在齐次空间下,欧氏空间中的三维空间点到二维空间点有了线性变换$P_h’=MP_h$

6.摄像机内参矩阵而出于制造工艺的误差,有时候在欧氏空间下,我们的成像平面到像素平面的转换过程中,我们像素平面的像素不一定是直角方形的,可能是平行四边形的,假设两条边之间的夹角为 $\theta$ ,如下图所示

那么我们在齐次空间下坐标的变换修改成如下格式

在上面的这个表达式中,我们记$M=\left[\begin{smallmatrix}\alpha & -\alpha cot\theta & C_x & 0 \\ 0 & \beta /sin\theta & C_x & 0 \\ 0 & 0 & 1 & 0\end{smallmatrix}\right]$ 为投影矩阵,记 $K=\left[\begin{smallmatrix}\alpha & -\alpha cot\theta & C_x \\ 0 & \beta /sin\theta & C_x \\ 0 & 0& 1\end{smallmatrix}\right]$ 为摄像机内参矩阵,显然,摄像机内参矩阵决定了摄像机坐标系下空间点到图像点的映射,当我们的 $\theta$ 为 $90^\circ$ 时,$M$ 就是我们之前的矩阵 $\left[\begin{smallmatrix}\alpha & 0 & C_x & 0 \\ 0 & \beta & C_y & 0 \\ 0 & 0 & 1 & 0\end{smallmatrix}\right]$

7.世界坐标系到摄像机坐标系的变换以及摄像机外参矩阵到目前位置,我们已经知道了如何将一个摄像机坐标系下的三维空间点,通过齐次空间,转换为像素坐标系下的二维空间点,且该变换是线性的。而在实践中,我们往往拥有多个摄像机,那么同一个物体在多个摄像机坐标系下的位置是不相同的,因此我们需要将其统一,那么这里就需要运用到世界坐标系了,世界坐标系的原点我们可以根据情况自己定义。

在将世界坐标系下的点转换到摄像机坐标系下时,只需要通过平移和旋转来操作,而平移和旋转又能够通过齐次空间中的矩阵表示,这里不再赘述,因此,在齐次空间中,有如下关系:

其中 $R$ 和 $T$ 分别代表旋转矩阵和平移矩阵,世界坐标系下的点通过旋转和平移就能够得到摄像机坐标系下的点。

8.完整的摄像机模型我们已经知道 $P_h$ 和 $P_h’$ 的关系,那么最终,完整的摄像机模型,在齐次空间下,世界坐标系下的点转换到像素平面下的点的关系如下:

其中,我们称 $\left[\begin{smallmatrix}R & T\end{smallmatrix}\right]$ 为摄像机的外参矩阵,$K$ 为摄像机内参矩阵,$M$ 称为投影矩阵,再附上一张总结图如下

那么以上一连串的表达均是在齐次坐标系下完成,那么我们如何将 $P_h’$ 在欧式空间中表达呢? 我们只需要将最终的齐次矩阵 $MP_w$ 表达为欧氏空间下的矩阵即可,表达如下:

最右侧的坐标即为像素空间下的二维坐标