【自动驾驶】16.计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换

本篇博客为转载,我对其中的细节添加了一些说明。
原文链接:https://blog.csdn.net/chentravelling/article/details/53558096

0.前言

最近整理了“相机成像原理”和“视差与深度信息”相关的资料,然后做成了PPT,以备自己用,也提供给相关的图像、视觉方向的朋友参考。如有误,望海涵并指出。

1.正文

图像处理、立体视觉等等方向常常涉及到四个坐标系:世界坐标系、相机坐标系、图像坐标系、像素坐标系。例如下图:
zhz注:根据右手定则,下面的相机坐标系和世界坐标系的Y轴方向都反了,因为拇指指向X正方向,食指指向Y轴正方向,那么Z轴的正方向就是中指指向。下面的相机坐标系和世界坐标系都是左手坐标系。 这里写图片描述
构建世界坐标系只是为了更好的描述相机的位置在哪里,在双目视觉中一般将世界坐标系原点定在左相机或者右相机或者二者X轴方向的中点。
接下来的重点,就是关于这几个坐标系的转换。也就是说,一个现实中的物体是如何在图像中成像的。

1.1世界坐标系与相机坐标系

这里写图片描述

于是,从世界坐标系到相机坐标系,涉及到旋转和平移(其实所有的运动也可以用旋转矩阵和平移向量来描述)。绕着不同的坐标轴旋转不同的角度,得到相应的旋转矩阵,如下图所示:
这里写图片描述

那么从世界坐标系到相机坐标系的转换关系如下所示:
这里写图片描述

1.2相机坐标系与图像坐标系

从相机坐标系到图像坐标系,属于透视投影关系,从3D转换到2D。

  • p(x,y)是图像坐标系上的点(即相机坐标系上的点投影到图像坐标系的投影点),o是图像坐标系的中点,也是相机的焦点,f是相机的焦距。
  • 相机的成像平面 就是 图像坐标系所在平面(二维平面)。
  • P(Xc,Yc,Zc)是相机坐标系上的点,Oc是相机的光心。
    这里写图片描述

此时投影点p(x,y)的单位还是mm,并不是pixel,需要进一步转换到像素坐标系。

1.3图像坐标系与像素坐标系

像素坐标系和图像坐标系都在成像平面上,只是各自的原点和度量单位不一样。图像坐标系的原点为相机光轴与成像平面的交点,通常情况下是成像平面的中点或者叫主点(principal point)

图像坐标系的单位是mm,属于物理单位,而像素坐标系的单位是pixel,我们平常描述一个像素点都是几行几列。

所以这二者之间的转换如下:其中dxdy表示每一列和每一行分别代表多少mm,即1pixel=dx mm。就是说,
dx就是在水平方向上1个像素的长度(单位mm);
dy就是在竖直方向上1个像素的长度(单位mm)。

p(x,y)是图像坐标系上的点,O(u0,v0)是图像坐标系的中心点,u0,v0对应像素坐标系的u0pixelv0pixel,并非mm,如果像素平面的分辨率为W*H (单位pixel), 那么
u 0 = 1 / 2 ∗ W v 0 = 1 / 2 ∗ H u_0=1/2*W \\ v_0=1/2*H u0=1/2Wv0=1/2H

注意p(x,y)x,y是从图像坐标系中心点开始的偏移,单位是mm,所以:

  • x/dx是从p(x,y)到图像坐标系中心点的横向偏移;
  • y/dy是从p(x,y)到图像坐标系中心点的纵向偏移;
  • u0,v0为像素坐标系的中心点(不是原点,原点在左上角),等于图片像素的宽和高的一半;
  • 图像坐标系 x,y和像素坐标系u,v的量纲单位不一样,x,ymm, u,vpixel

一个点从相机坐标系投影到图像坐标系的点P(x,y),此时单位还是mm,点p(x,y)的坐标值x,y表示的是距离图像中心点,也是图像坐标系原点的距离(mm)。
由于图像坐标系和像素坐标系就是同一个平面,只是原点不一样。所以点P(x,y)在像素坐标系的坐标就变成了:
u = x d x + u 0 v = y d y + v 0 u=\frac{x}{d_x} +u_0 \\ \quad \\ v=\frac{y}{d_y}+v_0 u=dxx+u0v=dyy+v0

计算p(x,y)投影到像素坐标系上的值:

这里写图片描述

那么通过上面四个坐标系的转换就可以得到世界坐标系中的一个点P(Xw,Yw,Zw)如何投影到像素坐标系中的一个点p(u,v)

这里写图片描述

前两个矩阵相乘,令fx=f/dx,fy=f/dy,得到的就是上图中标出的相机内参矩阵。其中,fxfy也叫等效焦距。
相机的内参和外参可以通过张正友标定获取(戳这里查看张正友标定的资料)。

相机内参矩阵K是一个3x3的上三角矩阵。

刚学的小伙伴们可能会有疑问了:为什么上面要把相机内参写成3x4矩阵形式,相机外参写成4x4的形式?
答:是因为在进行代码编程时,并不会使用(R*P+t)这种求法,而且求相反的变换时,涉及到求变换矩阵的逆,而求逆必须是对方阵求逆。所以这里要多加一行 [ 0 ⃗ 1 ∗ 3 , 1 ] [ \vec{0}_{1*3},1] [0 13,1]
对于内参矩阵有变成3x4,这里可不必纠结,因为当需要求逆时,我们会把旋转矩阵和平移向量写成齐次矩阵。我们注意看的话,会发现,上面的相机内参3x4其实只有2x3是有效的,其他的都是填充的,并且,里面的3x3已经是齐次了。他这里把相机内参矩阵扩展成3x4只是为了使等式维度吻合,才写成了3x4。实际编程中,只需要把相机内参矩阵取3x3的齐次矩阵,然后再与坐标点进行运算即可。

【自动驾驶】16.计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换_第1张图片

分析一下这几个空间变换:

如果把物点在相机坐标系下所在的平面叫做物平面。为了描述方便,我们这里以点 ( X C , Y C , Z C ) (X_C,Y_C,Z_C) (XC,YC,ZC)来描述物平面。那么从物平面 ( X C , Y C , Z C ) (X_C,Y_C,Z_C) (XC,YC,ZC)除以 Z c Z_c Zc变成归一化平面 ( X C / Z C , Y C / Z C , 1 ) (X_C/Z_C,Y_C/Z_C,1) (XC/ZC,YC/ZC,1)

相机坐标系 -> 图像坐标系:

[ x y 1 ] = [ f 0 0 0 f 0 0 0 1 ] [ X c / Z C Y c / Z c 1 ] \begin{bmatrix} x\\y\\1 \end{bmatrix} =\begin{bmatrix} f&0&0\\0&f&0\\0&0&1 \end{bmatrix} \begin{bmatrix} {X_c/Z_C}\\Y_c/Z_c\\1 \end{bmatrix} xy1=f000f0001Xc/ZCYc/Zc1
这里不是 f x f_x fx f y f_y fy,因为这里是相机坐标系到图像坐标系,单位还是mm,并没有变到像素坐标系中。变到像素坐标系中才需要 f f f除以 d x d_x dx d y d_y dy后变成 f x f_x fx f y f_y fy.


归一化平面 ( X C Z C , Y C Z C , 1 ) (\frac{X_C}{Z_C},\frac{Y_C}{Z_C},1) (ZCXC,ZCYC,1)乘以焦距 f f f变为成像平面 ( x , y ) (x,y) (x,y)

成像平面 ( x , y ) (x,y) (x,y),把长度m和像素直接进行缩放变化,并平移中心点到左上角,就变成像素平面 ( u , v ) (u,v) (u,v)

或者直接由归一化平面 ( X C Z C , Y C Z C , 1 ) (\frac{X_C}{Z_C},\frac{Y_C}{Z_C},1) (ZCXC,ZCYC,1)乘以相机内参矩阵K,变为像素平面,一步到位。

相机坐标系 -> 像素坐标系:

[ u v 1 ] = [ f / d x 0 u 0 0 f / d y v 0 0 0 1 ] [ X c / Z C Y c / Z c 1 ] = [ f x 0 u 0 0 f y v 0 0 0 1 ] [ X c / Z C Y c / Z c 1 ] \begin{bmatrix} u\\v\\1 \end{bmatrix} =\begin{bmatrix} f/dx&0&u_0\\0&f/dy&v_0\\0&0&1 \end{bmatrix} \begin{bmatrix} {X_c/Z_C}\\Y_c/Z_c\\1 \end{bmatrix} =\begin{bmatrix} f_x&0&u_0\\0&f_y&v_0\\0&0&1 \end{bmatrix} \begin{bmatrix} {X_c/Z_C}\\Y_c/Z_c\\1 \end{bmatrix} uv1=f/dx000f/dy0u0v01Xc/ZCYc/Zc1=fx000fy0u0v01Xc/ZCYc/Zc1


Z c 值 求 解 : \color{red}Z_c值求解: Zc:

关于 Z c Z_c Zc值求解,可参考这篇博客:像素坐标转到世界坐标时相机坐标系中的Zc值求解,其中 R为旋转矩阵,K为相机内参矩阵,T为平移向量,均为已知值。 Z c Z_c Zc是世界坐标系的某点 P ( X w , Y w , Z w ) P(X_w,Y_w,Z_w) P(Xw,Yw,Zw)投影到相机坐标系的点的 Z Z Z方向坐标,该博客主要内容如下截图:
【自动驾驶】16.计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换_第2张图片
对于每个像素 ( u , v ) (u,v) (u,v),都有一个对应的 Z c Z_c Zc,所以,并不是对整张图的像素来说,只有一个 Z c Z_c Zc
当我们需要从2D像素点反投影到3D世界坐标系时,只需要知道像素坐标相机内参相机外参(即:相机到世界坐标系的旋转矩阵平移矩阵),就可以求得这个像素对应的深度 Z c Z_c Zc,进而可以通过前面的公式:

在这里插入图片描述
得到该像素对应的三维世界坐标系点。我们在自动驾驶开发项目中,一般会把世界坐标系设定为车身坐标系。对于地面上的车道线等,由于我们知道车身坐标系的原点离地面的高度,就知道了车身坐标系下的 Z w Z_w Zw,进而可以得到深度信息 Z c Z_c Zc,从而得到图像中车道线的该像素对应的三维车身坐标系点。

不过,对于高度未知的,就不能求出 Z c Z_c Zc了。

所以,通过最终的转换关系来看,一个三维中的坐标点,的确可以在图像中找到一个对应的像素点,但是反过来,通过图像中的一个点找到它在三维中对应的点就很成了一个问题,因为我们并不知道等式左边的 Z c Z_c Zc的值。
关于三维重建不是我的方向,但是深度值的获取是我项目中的一个需要解决的问题,这将涉及到后面的立体视觉知识。


上面的公式中省略了去畸变的步骤,该步骤是在使用相机内参矩阵进行变换前,在相机外参矩阵*世界坐标系,得到相机坐标系点(Xc,Yc,Zc),将其取前两维度除以【Zc】得到二维点(Xc/Zc,Yc/Zc),见下面公式:
【自动驾驶】16.计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换_第3张图片

把公式左右两边都除以Zc,然后进行去畸变运算,得到去畸变后的二维点(x,y),再将去畸变的二维点(x,y)经过【相机内参矩阵】计算,得到最终的像素点坐标(u,v),即
在这里插入图片描述

【PPT下载】

地址:http://download.csdn.net/detail/chentravelling/9833120

原文评论截图:

【自动驾驶】16.计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换_第4张图片


【自动驾驶】16.计算机视觉:相机成像原理:世界坐标系、相机坐标系、图像坐标系、像素坐标系之间的转换_第5张图片


在这里插入图片描述

你可能感兴趣的:(自动驾驶,计算机视觉,自动驾驶,人工智能)