在上一讲《Coursera自动驾驶课程第7讲:Vehicle Lateral Control》中我们了解了如何对汽车进行横向控制
。
本课程第一个篇章就暂时告一段落了,接下来我们开始学习新的篇章。 课程第二个篇章是状态估计和定位模块
。不过在这里我做了一下调整,我们先学习视觉感知
模块,即计算机视觉
在自动驾驶中是如何应用的。
B站视频链接:https://www.bilibili.com/video/BV1PE411D72p
文章目录
- 1. The Camera Sensor
- 1.1 Overview
- 1.2 Pinhole Camera Model
- 1.3 Modern Day Cameras
- 2. Camera Projective Geometry
- 2.1 Projection: World to Image
- 2.2 Computing the Projection
- 2.3 The Digital Image
- 3. Camera Calibration (重点)
- 3.1 Problem Formulation
- 3.2 Linear Methods
- 3.3 Factoring and Factorizing the P matrix
- 3.4 Calibration Tools – SUPPLEMENTAL MATERIALS
- 4. Visual Depth Perception - Stereopsis (重点)
- 4.1 Overview
- 4.2 Stereo Camera Model
- 4.3 Computing 3D Point Coordinates
- 5. Visual Depth Perception - Computing the Disparity
- 5.1 Overview
- 5.2 Disparity Computation
- 5.3 Stereo Matching
- 6. Image Filtering
- 6.1 Overview
- 6.2 Cross-Correlation
- 6.3 Convolution
- 6.4 Applications
1. The Camera Sensor
1.1 Overview
从这一讲开始,我们将学习新的篇章。我们将会了解计算机视觉领域的一些主要概念,包括相机模型及其校准,单目和立体视觉,投影几何和卷积运算
等。
目前自动驾驶行业中的大多数公司在其车辆传感器套件中都将摄像头作为其主要传感器
。摄像头是一个丰富的传感器,可以捕获有关车辆周围的环境细节。
摄像头捕获的外界信息对于场景理解任务(例如对象检测,分割和识别)
特别有帮助。 外界信息使我们能够区分道路标志
或交通信号灯
状态,跟踪转向信号并将重叠的车辆分解为单独的实例。 由于其高分辨率输出,与自动驾驶中使用的其它传感器相比,该摄像机能够收集并提供丰富的信息,同时价格相对也不高。
下面提供两个图片数据链接:https://www.shutterstock.com/image-photo/busy-traffic-during-rush-houramsterdam-
1069610642?src=bLnVCTgF8bcUNe81sHDlVw-1-39
摄像机链接:https://www.shutterstock.com/zh/video/clip-1022389735-camerarepair-sensor-digital-close-up-matrix
1.2 Pinhole Camera Model
下面我们介绍针孔相机模型
,用于描述外界中的某个点与其在图像平面上投影之间的关系。
针孔相机模型中两个最重要的参数
是针孔与图像平面之间的距离
,我们称为焦距
,焦距定义了投射到图像上的物体的尺寸,并且在相机对焦时起着重要作用。针孔中心的坐标,我们称为相机中心
。尽管针孔摄像头模型非常简单,但是它在表示图像创建过程中却表现出色。
通过确定特定相机配置的焦距
和相机中心
,我们可以数学描述世界上某个物体发出的光线撞击图像平面的位置。针孔摄像机模型的一个历史示例是摄像机暗箱
。它的结构简单,在成像表面的前面有一个针孔,可以很容易地重建图像,实际上,如果倾斜的话,这是观看日食的方法。
1.3 Modern Day Cameras
自从相机暗箱发明以来,相机发展走了很长一段路。当前的相机使我们能够收集极高分辨率的数据。
相机传感器的分辨率和灵敏度不断提高,使相机成为地球上最普遍使用的传感器之一。你拥有几台相机呢?如果你停止统计所有这些,你会感到惊讶。你的手机,汽车,笔记本电脑中都配备摄像头,这些摄像头几乎无处不在。
2. Camera Projective Geometry
2.1 Projection: World to Image
如下左图所示,我们对交通信号灯进行投影,会得到一个翻转的图像。但这不是我们最终想要的结果,为了解决这个问题,通常在相机中心前面会定义一个虚拟图像平面
,我们将这个虚拟图像平面称为相机模型
。
将相机模型进行简化,需要开发一个模型,将世界坐标上的点(X,Y,Z)(X,Y,Z)(X,Y,Z)转换为图像坐标(u,v)(u,v)(u,v)。
我们可以定义一个平移矢量
ttt和一个旋转矩阵
RRR来模拟世界坐标系与另一个坐标系之间的转换,将相机姿态参数称为外部参数
,因为它们在相机外部,并且特定于相机在世界坐标系中的位置。我们将图像坐标系定义为从光学中心发出的虚拟图像平面的坐标系
。但是,图像像素坐标系附加到虚拟图像平面的左上角。接下来,我们定义焦距
fff为相机和图像坐标系之间沿相机坐标系的zzz轴距离。
2.2 Computing the Projection
我们将投影简化为两个步骤。首先需要从世界坐标投影到相机坐标
,然后从相机坐标投影到图像坐标
。
现在介绍一些投影转换用到的专业术语。
首先,是世界坐标投影到相机坐标
。这是通过使用刚体变换矩阵TTT执行的,包括旋转矩阵RRR和平移向量ttt。
然后是将相机坐标转换为图像坐标
。为了执行此转换,定义内参矩阵KKK,是相机的固有参数。
由于这两个变换都进行了矩阵相乘操作,因此我们可以将矩阵P定义为P=K[R∣t]P=K[R|t]P=K[R∣t],即世界坐标到图像坐标的变换矩阵。
现在我们来看一个例子,将世界坐标中的点OworldO_{world}Oworld转换为图像坐标oimageo_{image}oimage,让我们看看在计算此方程式时缺少什么。我们注意到无法执行矩阵乘法。为了解决这个问题,我们将点O的坐标转换为齐次坐标
。
oimage=[xyz]=K[R∣t][XYZ1]o_{\text {image}}=\left[\begin{array}{l}x \\ y \\ z\end{array}\right]=K[R \mid t]\left[\begin{array}{l}X \\ Y \\ Z \\ 1\end{array}\right]oimage=⎣⎡xyz⎦⎤=K[R∣t]⎣⎢⎢⎡XYZ1⎦⎥⎥⎤
现在,我们需要执行最后一步,将图像坐标转换为像素坐标。我们可以通过将xxx和yyy除以zzz来获得图像平面中的像素坐标。
[xyz]→[uv1]=1z[xyz]\left[\begin{array}{l}x \\ y \\ z\end{array}\right] \rightarrow\left[\begin{array}{l}u \\ v \\ 1\end{array}\right]=\frac{1}{z}\left[\begin{array}{l}x \\ y \\ z\end{array}\right]⎣⎡xyz⎦⎤→⎣⎡uv1⎦⎤=z1⎣⎡xyz⎦⎤
2.3 The Digital Image
我们已经完成了投影变换,现在我们定义图像中的坐标值。我们先从灰度图像开始。首先将图像的宽度NNN和高度MMM定义为图像的列数和行数。 在灰度图像中,亮度信息以无符号的八位整数
形式写入每个像素。
对于彩色图像,我们具有值为3的三维尺寸,我们称之为深度
。此深度的每个通道代表图像中存在多少特定颜色。可以使用许多其他颜色表示,但是在这里我们使用RGB表示,即红色,绿色,蓝色。总之,图像由三个像素阵列以M×N数字表示,每个像素代表3D点在2D图像平面上的投影。
3. Camera Calibration (重点)
3.1 Problem Formulation
让我们回忆到目前为止我们已经学到的投影方程。可以使用包含外部和固有参数
的相机投影矩阵PPP将3D空间中点OOO的齐次坐标转换为图像坐标。
相机标定
问题的定义是找到这些未知的内在和外在相机参数,此处给定nnn个已知3D点坐标及其在图像平面上的对应投影,以红色显示。我们的方法将包括首先获取PPP矩阵,然后将其分解为内在参数KKK和外在旋转参数RRR和平移参数ttt。
为了进行标定,我们使用已知几何形状的场景从2D图像中获取3D点的位置,通过测量图像中观察到的点之间的实际3D距离来解决比例尺问题。
最常用的示例是3D棋盘
,其已知大小的正方形提供了要观察的固定点位置。我们以黄色定义坐标框架
,然后计算3D点坐标及其在图像中的投影。可以手动完成3D点与2D投影的关联(例如,通过单击紫色点,或使用棋盘检测器自动完成)。然后,我们可以建立方程组来求解PPP的未知参数。现在,让我们形成需要求解的线性方程组。
首先,我们通过矩阵乘法将投影方程扩展为三个方程。
su=p11X+p12Y+p13Z+p14sv=p21X+p22Y+p23Z+p24s=p31X+p32Y+p33Z+p34\begin{aligned} s u &=p_{11} X+p_{12} Y+p_{13} Z+p_{14} \\ s v &=p_{21} X+p_{22} Y+p_{23} Z+p_{24} \\ s &=p_{31} X+p_{32} Y+p_{33} Z+p_{34} \end{aligned}susvs=p11X+p12Y+p13Z+p14=p21X+p22Y+p23Z+p24=p31X+p32Y+p33Z+p34
为了使这些方程式的右侧为零,我们将每个方程式的右侧移到左侧。然后,将第三个方程式代入方程式一和方程式二,最后每一点有两个方程式。
p31Xu+p32Yu+p33Zu+p34u−p11X−p12Y−p13Z−p14=0p31Xv+p32Yv+p33Zv+p34v−p21X−p22Y−p23Z−p24=0p_{31} X u+p_{32} Y u+p_{33} Z u+p_{34} u-p_{11} X-p_{12} Y-p_{13} Z-p_{14}=0\\p_{31} X v+p_{32} Y v+p_{33} Z v+p_{34} v-p_{21} X-p_{22} Y-p_{23} Z-p_{24}=0p31Xu+p32Yu+p33Zu+p34u−p11X−p12Y−p13Z−p14=0p31Xv+p32Yv+p33Zv+p34v−p21X−p22Y−p23Z−p24=0
因此,如果我们有nnn个点,则我们有2n2n2n个相关方程。将这些方程式以矩阵形式给出我们所示的齐次线性系统。由于这是齐次线性系统,因此我们可以使用奇异值分解
来获得最小二乘解。
[X1Y1Z110000−u1X1−u1Y1−u1Z1−u10000X1Y1Z11−v1X1−v1Y1−v1Z1−v1⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮⋮XNYNZN10000−uNXN−uNYN−uNXN−uN0000XNYNZNX1−vNXN−vNYN−vNYN−uN][p11p12p13p14p21p22p23p24p31p32p33p34]=0\left[\begin{array}{ccccccccccc}X_{1} & Y_{1} & Z_{1} & 1 & 0 & 0 & 0 & 0 & -u_{1} X_{1} & -u_{1} Y_{1} & -u_{1} Z_{1} & -u_{1} \\ 0 & 0 & 0 & 0 & X_{1} & Y_{1} & Z_{1} & 1 & -v_{1} X_{1} & -v_{1} Y_{1} & -v_{1} Z_{1} & -v_{1} \\ \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots & \vdots \\ X_{N} & Y_{N} & Z_{N} & 1 & 0 & 0 & 0 & 0 & -u_{N} X_{N} & -u_{N} Y_{N} & -u_{N} X_{N} & -u_{N} \\ 0 & 0 & 0 & 0 & X_{N} & Y_{N} & Z_{N} & X_{1} & -v_{N} X_{N} & -v_{N} Y_{N} & -v_{N} Y_{N} & -u_{N}\end{array}\right]\left[\begin{array}{c}p_{11} \\ p_{12} \\ p_{13} \\ p_{14} \\ p_{21} \\ p_{22} \\ p_{23} \\ p_{24} \\ p_{31} \\ p_{32} \\ p_{33} \\ p_{34}\end{array}\right]=0⎣⎢⎢⎢⎢⎢⎡X10⋮XN0Y10⋮YN0Z10⋮ZN010⋮100X1⋮0XN0Y1⋮0YN0Z1⋮0ZN01⋮0X1−u1X1−v1X1⋮−uNXN−vNXN−u1Y1−v1Y1⋮−uNYN−vNYN−u1Z1−v1Z1⋮−uNXN−vNYN−u1−v1⋮−uN−uN⎦⎥⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡p11p12p13p14p21p22p23p24p31p32p33p34⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤=0
3.2 Linear Methods
简单的线性标定方法具有多个优点。
- 易于制定。
- 具有封闭形式的解决方案。
其缺点是:
- 无法直接获取内部和外部相机参数。
- 我们的线性模型没有考虑复杂的情况,例如径向和切向畸变。
- 最后,由于我们是通过线性最小二乘法进行求解的,无法对我们的解决方案施加约束,例如要求焦距为非负值。
3.3 Factoring and Factorizing the P matrix
相机投影矩阵PPP本身可用于将3D点投影到2D中,但是它有几个缺点。它不会告诉相机的姿势,也不会告诉相机的内部几何形状。幸运的是,我们可以使用称为RQRQRQ分解的线性代数运算,将PPP分解为内在参数矩阵KKK和外部旋转参数RRR和平移参数$$t。
让我们看看我们如何执行这种分解。首先,将PPP的表示形式更改为相机中心CCC的函数。CCC是与P相乘时投影为零的点。我们将KKK乘以矩阵以形成两个子矩阵KRKRKR和−KRC-KRC−KRC。我们将KKK和RRR的组合称为MMM矩阵。
PC=0K[R∣t]C=0K(RC+t)=0t=−RCP=K[R∣−RC]P=[KR∣−KRC]P C=0 \\K[R \mid t] C=0 \\K(R C+t)=0 \\t=-R C \\P=K[R \mid-R C] \\P=[K R \mid-K R C]PC=0K[R∣t]C=0K(RC+t)=0t=−RCP=K[R∣−RC]P=[KR∣−KRC]
现在我们可以将投影矩阵PPP表示为MMM和−MC-MC−MC。已知可以将任何矩阵分解为上三角矩阵RRR和正交基,将MMM分解为上三角R和正交基Q
。在线性代数中,此过程称为RQ分解
,即QR分解的一种更常见的变体。在QR分解中,我们首先有正交Q,然后是上三角R。请注意,RQ分解的输出与旋转矩阵R是不同的变量,不要混淆它们。
现在,让我们看看如何通过对齐这两个表达式来使用矩阵M的RQ
因式分解的输出来检索K,R和t
。
固有校准矩阵K是RQ分解的输出R。旋转矩阵R是正交基Q
。
M=RQ=KRM=\mathcal{R} Q=K RM=RQ=KR
最后,我们可以直接从P矩阵最后一列的K中提取转换向量。
t=−K−1P[:,4]=−K−1MCt=-K^{-1} P[:, 4]=-K^{-1} M Ct=−K−1P[:,4]=−K−1MC
3.4 Calibration Tools – SUPPLEMENTAL MATERIALS
下面是相机标定常用的软件工具。
- OpenCV: https://docs.opencv.org/master/d4/d94/tutorial_camera_calibration.html
- Matlab: https://www.mathworks.com/help/vision/ug/single-camera-calibrator-app.html
- ROS: http://wiki.ros.org/camera_calibration
4. Visual Depth Perception - Stereopsis (重点)
4.1 Overview
自动驾驶汽车需要具备十分准确的深度感知
能力,以确保汽车安全运行。如果不知道前方汽车有多远,那么在开车时如何避免它们呢?激光雷达和毫米波雷达通常被认为是可用于感知任务的3D传感器。但是,我们也可以使用多视图几何结构
从两个或多个摄像机获得深度信息,在自动驾驶汽车中常用到立体摄影机
。
立体视觉最早是在1838年由Charles Wheatstone所提出。他提出,因为每只眼睛从略微不同的水平位置观看世界,所以每只眼睛看到的图像彼此并不相同。由于两眼的水平位置不同,从而给出了水平视差的深度提示,也称为双眼视差
。但是,在历史上,立体视觉的发现要早于此。实际上,莱昂纳多·达·芬奇(Leonardo da Vinci)的一些图纸也通过立体视觉描绘了精确的深度几何形状。
现在,我们深入研究立体声传感器的几何形状。立体声传感器通常由具有平行光轴的两个摄像机组成,通常也会称为双目相机
。
4.2 Stereo Camera Model
已知两个摄像机之间的旋转和平移
关系以及3D3D3D点OOO在两个摄像机上的投影,像素位置分别为OLOLOL和OROROR,我们可以计算出点OOO的3D3D3D坐标。
为了使计算更容易,我们做一些假设。
- 首先,假设用于构造立体声传感器的两个摄像机是相同的。
- 其次,假设在制造立体声传感器时,尽最大努力使两个摄像机的光轴对齐。
现在让我们定义立体声传感器的一些重要参数。焦距
仍然是相机中心与图像平面之间的距离。其次,基线
为左右相机中心之间的距离。
为方便处理,我们将投影图转换为鸟瞰图以便于可视化。如下所示,我们得到了两个相似三角形,根据三角形相似,我们得到两个方程:
Zf=XxL\frac{Z}{f}=\frac{X}{x_{L}}fZ=xLX
Zf=X−bxR\frac{Z}{f}=\frac{X-b}{x_{R}}fZ=xRX−b
通过以上方程,我们就可以得到深度信息。
4.3 Computing 3D Point Coordinates
现在我们计算3D坐标,我们将视差
ddd定义为左右图像中同一像素的图像坐标之间的差。视差公式为:
d=xL−xRd=x_{L}-x_{R}d=xL−xR
根据上一小节建立的相机模型,深度Z为:
Z=fbd\\Z=\frac{f b}{d}Z=dfb
然后我们也可以到到XXX和YYY:
X=ZxLf,Y=ZyLfX=\frac{Z x_{L}}{f}, \quad Y=\frac{Z y_{L}}{f}X=fZxL,Y=fZyL
现在,我们已经知道了如何从立体传感器计算3D坐标。这里出现了两个小问题。
- 首先,我们需要计算
焦距
,基线
。也就是说,我们需要标定立体摄像机
。 - 其次,我们需要找到每个左右图像像素对之间的对应关系,以便能够计算它们的视差,这部分可以通过
视差估计算法
得到。
5. Visual Depth Perception - Computing the Disparity
5.1 Overview
为了计算视差
,我们需要能够在左右立体摄像机图像中找到相同的点。 对于此类问题,最直接的解决办法是穷举法
,即在左边的图像中确定像素位置,然后在右边图像中搜寻所有像素,找到与之相匹配的。 但时这种方法效率极低,通常不会用于自动驾驶汽车。
5.2 Disparity Computation
让我们重新看一下立体相机的设置,看看为什么这样的简化处理是有效的。我们已经确定了如何将单个点投影到两个摄像机。
现在,沿着连接3D点和左侧摄像机中心的线移动它。它在左摄像机图像平面上的投影不变
。但是,注意到右摄像机平面上的投影,该投影沿水平线移动
。这条水平线被称为对极线
。我们可以将对应搜索限制在对极线上,从而将搜索范围从2D2D2D减少到1D1D1D,即从平面搜索变为线段搜索。
要注意的一件事是,水平对极线仅在两个摄像机的光轴平行时才会出现。在不平行的光轴的情况下,对极线偏斜。在这种情况下,我们将不得不得出多视图几何图形,这超出了本课程的介绍范围。在经过两次校准的情况下(例如我们的立体声相机),倾斜的对极线不是一个大问题。实际上,我们可以通过称为立体整流
的过程使光轴平行。校正后,我们回到水平极线。这里将不介绍如何执行校正,因为标准计算机视觉软件包(例如OpenCV和MATLAB)中提供了实现方式。
5.3 Stereo Matching
现在我们将介绍我们的第一个基本立体匹配算法。对于每条对极线,在左侧图像上取一个像素,将这些左图像像素与同一对极线上的右图像中的每个像素进行比较。接下来,选择最接近左像素的右图像像素,这可以通过最小化成本来实现。
例如,这里的成本可以是像素强度的平方差
。最后,我们可以通过从左边减去右边的图像位置来计算视差。
关于立体匹配问题,这里给出了一个一个调查链接,感兴趣的读者可以看看。
6. Image Filtering
6.1 Overview
现在让我们开始探讨为什么要使用图像滤波
。图像形成过程容易受到许多不同噪声的影响。在下图有一位摄影师,这是麻省理工学院的一张非常著名的照片,用于测试计算机视觉算法。
现在,让我们通过随机将某些像素变为白色而将其他像素变为黑色,来向该图像添加噪声。我们如何从如此嘈杂的图像中检索出原始图像的合理视觉外观呢?图像滤波是消除噪声的简单有效的方法。您还将看到,根据过滤器的不同,可以有效地对图像执行各种操作。但首先,让我们看看如何进行图像过滤有助于降低噪声。
如果查看图像阵列,则会注意到噪声通常会导致像素值异常,高值邻域中的低值像素或低值邻域中的高值像素
。减少这种噪声的一种方法是计算整个邻域的平均值,并用该平均值替换离群值像素
。让我们将GGG定义为滤波操作的输出。这里,2k+12k+12k+1是滤波器的大小。在这种情况下,我们邻域的大小为3。 uuu和vvv是中心像素图像坐标。计算平均值得出右上部邻域为80,左下部邻域为10。最后一步是用相应的均值替换每个邻域的中心像素。至此,我们成功地降低了噪声并平滑了该邻域中的图像阵列值。
6.2 Cross-Correlation
权重矩阵
HHH称为核
。这种通用形式称为互相关
,因为它定义了每个彼此像素之间以及附近其他像素彼此之间的相关性 。对于上面定义的均值滤波器,我们现在使用以下内核表示。一个3×33\times33×3的矩阵,t充为1。另一个用作降噪的内核是高斯内核
,其中中心的权重大于相邻的权重,权重依次按高斯分布。
现在,让我们将这些内核嵌入我们的图像,下面是两种滤波器效果。均值滤波器导致图像有些模糊,我们可以通过调整滤波器的特定参数来减少这种模糊。
6.3 Convolution
现在,我们将定义另一个用于图像过滤的有用操作:卷积
。
关于卷积知识的介绍可以看看吴恩达老师的深度学习课程或文章《4.1)深度卷积网络:卷积神经网络基础》。
6.4 Applications
现在让我们介绍互相关
和卷积运算
的一些重要应用。互相关可用于模板匹配
。模板匹配是我们已知图案或模板,我们想在图像中找到其对应位置的问题。这可以通过在模板和图像之间找到互相关输出的最高值的位置来完成。
为了更好地可视化此效果,让我们将互相关的彩色输出叠加在目标图像之上。在这里,红色是较高的互相关响应,而蓝色是非常低的响应。这样,模板和图像的位置就是互相关输出中具有最高值的像素的u,vu,vu,v坐标。我们可以通过将模板叠加在刚刚找到的u,vu,vu,v坐标上来检查我们的相关性是否正确。
可以使用卷积执行的另一个重要应用是图像梯度计算
。可以通过与执行有限差分
的内核进行卷积来计算图像梯度。图像梯度对于边缘和拐角的检测非常有用,例如在自动驾驶中广泛用于图像特征和物体检测。
总结,在本讲中我们学到了:
- 如何表示数字图像。
- 3D点如何与图像中的像素相关。
- 如何从一对图像计算3D点坐标,
- 如何使用互相关和卷积运算处理图像。