作者:SFXiang
首发:AI算法修炼营
双目视觉的视差与深度
人类具有一双眼睛,对同一目标可以形成视差,因而能清晰地感知到三维世界。因此,计算机的一双眼睛通常用双目视觉来实现,双目视觉就是通过两个摄像头获得图像信息,计算出视差,从而使计算机能够感知到三维世界。一个简单的双目立体视觉系统原理图如图 1 所示。
两个相机的投影中心的连线的距离为 b,也叫做基线,三维空间任意一点 P 在左相机的成像点为 PL,在右相机的成像点为PR。根据光的直线传播的原理可知,三维空间点 P 就是两个相机的投影中心点与成像点连线的交点。线段𝑥L和𝑥R分别是左右相机成像点到左成像面的距离,则点 P 在左右相机的视差可以定义如下:
两个成像点PL和PR之间的距离为:
根据相似三角形理论可以得出:
则可以得到点 P 到投影中心平面的距离Z
当点 P 在三维空间上移动时,点 P 在左右相机上的成像位置也会改变,从而视差也会发生相应变化,由上式可知,视差与三维空间上的点到投影中心平面的距离成反比。 因而,只要知道某点的视差,就可以知道该点的深度信息。
三维空间点 P 在相机的成像图如下图所示。由图可以看出,根据相似三角形原理, 有以下关系:
因此,当已知三维空间上任意一点的在不同图像上的视差,再根据相机的参数,就可以知道该点的三维坐标。
双目相机的相关坐标系
物体的三维信息都是通过二维图像推导而来的。要想明确物体在三维空间的具体位置,除了图像的信息,还需知道相机的具体参数。相机参数的确定过程就叫做相机的标定。在双目视觉系统中,除了对每个相机进行标定外,还需要知道相机间的相互关系以及相机与待测物体的坐标关系,这一过程叫做系统的标定。
从图像上的物体到三维空间上的物体的映射过程实际上是坐标系的变换。图像上的某一点,经过物理关系的转换可以得到现实的物理坐标,然后将图像平面映射成相机坐标系的某一平面,得到该点在相机坐标系的坐标,最后通过相机坐标系与世界坐标系的旋转平移变换就可以确定该点的实际三维坐标了。所以要想确定点的三维坐标,首先要了解这四个坐标系。
(1) 像素坐标系。在数字图像中,一幅图像就是一个 M 行 N 列的数组,数组中的每个数值就是该点的亮度。在图像的左上角建立直角坐标系 u、v, 每一像素的坐标(u, v)就是该像素在数 组中的行和列。以像素作为单位的坐标系就叫做像素坐标系。
(2) 图像坐标系。 要想知道物体在三维空间的具体位置,就需要建立与实际物理单位相关的坐标系,这样的坐标系叫做图像坐标系,该坐标系以图像内某一点作为坐标原点,其 x 轴和 y 轴分别与像素坐标系的 u 轴,v 轴平行。图像上任意一个像素在两个坐标系的映射关系为:
其中,单个像素在 x 轴和 y 轴的实际物理距离为 dx 和 dy,将上式转换成齐次方程式为:
(3) 相机坐标系。 图像坐标系虽建立起图像与现实世界的物理关系,但这只是二维关系,因此,需要建立与三维世界相关的相机坐标系。图像坐标系是相机坐标系的某一平面,相机坐标系 的 x 轴和 y 轴与图像坐标系对应轴平行,两个坐标系间的距离就是相机的焦距 f。其以相机光心为坐标原点,光轴为 z 轴,可以用(𝑋c, 𝑌c, 𝑍c )来表示。
(4) 世界坐标系。 相机坐标系是以相机为中心的描述现实世界的三维坐标系。在现实空间中,存在无数坐标系可以描述三维空间,为了确定三维空间点的具体位置,需要确定唯一一个基准坐标系来表述空间,这就是世界坐标系,用(𝑋w, 𝑌w, 𝑍w)来表示。
其中,R 为 3×3 单位正交矩阵,表示了坐标系的旋转操作;t 为三维平移向量,代表了坐标系的平移操作;0 表示三维零向量。
四个坐标系之间总的关系
双目相机的畸变系数
上述的线性模型并不能准确描述物体与图像的对应关系,这是因为光学镜头具有透视失真,会导致图像发生偏差,这是镜头的固有属性无法消除。 为了减少图像偏差,需要明确镜头的畸变系数,对图像进行校正。常见的畸变主要有径向畸变和切向畸变。
径向畸变是指图像像素以畸变中心为原点,沿着径向产生位置偏差,从而导致图像形变。其常用畸变原点周围的泰勒展开式的前两项 k1 和 k2 来表示,如果畸变较大,还可以增加使用第三项 k3 来描述,常用的描述公式为:
其中,(x, y)是校正后像素点的位置;(𝑥0, 𝑦0)是原图上的像素点位置;r 径向距离。
切向畸变是由于在安装时,产生安装偏差,使镜头不完全平行于镜头平面而造成的畸变,其可以使用 p1和 p2 两个参数来描述:
要消除镜头畸变,就是要同时消除径向畸变和切向畸变,所以要知道以下 5 个畸变参数的值
这 5 个参数可以在相机标定的过程中得到。明确这 5 个畸变系数以及相机的内外参数, 就可以完成相机的标定了。
双目相机的标定
相机的标定是根据像素坐标系与世界坐标系的关系,利用一定的约束条件,来求解相机的内外参数以及畸变系数的过程。相机标定方法可分为两种,第一种是需要参照物的传统标定方法;另一种则是不需参照物的相机自标定法。
传统的标定方法一般以棋盘格作为参照物,其中每个棋盘格的大小,尺寸以及棋盘格的数量都是已知的。标定过程就是,将棋盘格的顶点与图像上的对应点建立对应关系,利用棋盘格的已知信息来求得相机模型的内外参数和畸变系数。这种标定方法通常有张正友标定法和 Tasi 两步标定法等。这种方法容易受到标定物的制作精度的影响,但精度仍比另一种方法高。
相机自标定法是不需要参照物的,通常有基于 Kruppa 方程的标定法等。其根据多视图约束几何方程,在不同位置采集多幅同场景的图像,通过相机的约束信息以及对 应点的几何信息来完成相机参数的计算。其最大优点就是不需要制作标定参考物,比较灵活;但由于缺少标定物,鲁棒性和精度都有所欠缺。
张正友标定法
张正友标定法的基本步骤是:在不同角度下,对标定参考物(棋盘格)进行拍摄,然后提取出棋盘格的顶点,接着解析出相机的畸变系数和内外参数,最后再根据极大似然估计,对参数进行 优化。
其中,M1为相机内参矩阵。
设单应性矩阵 H 满足,其中 λ 是尺度因子,由 于𝑟1和𝑟2正交,所以可得以下约束条件:
由以上两式可以看出,ℎ1和ℎ2是可以通过单应性求解出来的,所以要求解的参数就变成 𝑀1矩阵中的未知的 5 个参数,可以通过三个单应性矩阵来求解这 5 个参数,三个单应性矩阵可以通过三张对同一标定板不同角度和高度的照片获得。
相机内参为:
相机外参为:
上述推导的结果都是在理想情况下得到的,没有任何噪声和干扰,但噪声是无法避免的。因此,在实际标定中,还需要使用极大似然法来对参数进行优化。 至此,单目相机就标定完成,但对于双目视觉系统,不仅要对每个相机进行标定,同时还要明确相机间的相互关系,因此还要对双目相机进行进一步的标定,即求取相机间的旋转矩阵和平移向量。
由第一式可知左右相机的对应关系,由式第二式和第三式可知,只需要知道每个相机的 外参数,就可以求得双目相机的旋转矩阵和平移向量。
双目立体匹配
当三维空间与图像的对应关系确定后,要想对视差进行计算,就必须知道三维空间的点在左右图像上的对应关系,这就是立体匹配的目的。通过立体匹配技术,就可以明确左右图像中的点的对应关系,从而得到视差,恢复点的三维信息。
1、立体匹配的基本约束条件
立体匹配技术是双目立体视觉中的重要技术,研究人员提出了许多实用的算法,其中也提出许多基本的约束条件。将这些约束条件运用到匹配算法中,就可以有效降低匹配的难度,提高立体匹配的速度和精度。常用的约束条件如下:
(1) 极线约束。 极线约束是最常用的约束条件。极线约束是指在左图像中的一点,它在右图像上的 对应匹配点必定在某一条直线上,这条直线就是极线。使用极线约束就可以让图像的搜索范围由二维下降至一维,只需要在一条直线上进行搜索,这就可以大大减少搜索的复杂度,并提高了匹配的精度。
(2) 相似性约束。 在进行立体匹配时,点、线、块等元素一定具有相同或相似的属性。
(3) 唯一性约束。 对于待匹配图像,在原图像中至多对应一个点。一幅图像上的每个点只能与另一幅 图像上的唯一一个点一一对应,这样图像上的点至多有一个视差值。
(4) 左右一致性约束。 若左图像上的一点 P,其在右图像上的对应点为 Q,则右图像上的点 Q 在左图像上的对应点应该是点 P,如果这两点不是一一对应的,则匹配会不满足唯一性条件,说明匹配失败。在进行立体匹配时,运用基本约束条件对匹配结果进行检验,可以有效排除很多误匹配的点,减小搜索范围,降低立体匹配计算的复杂度,提高立体匹配的速度和精度, 获得最好的匹配效果。
2、半全局立体匹配算法
半全局匹配算法是一种实用的计算视差图的匹配算法,其较好的中和了局部匹配和全局匹配的优缺点,在保持视差图效果相差不大的前提下,极大地提高了算法的效率,实现了更好的精度和效率的权衡,已广泛应用在现实中。半全局匹配算法可以得到视差图,并且可分为匹配代价计算、代价聚合、视差计算和视差优化四个步骤。
(1) 代价匹配。代价匹配是待匹配点与候选匹配点之间的相似度的衡量。按照匹配度量方式可以分为互相关性度量方法和差值度量方法。 互相关性度量越大,两个点间的相似度就越高, 两个像素点为对应匹配点的概率就越大,不然两个像素点就越不可能是对应匹配点;同样,差值度量越小,像素点的相似度越高,差值度量越大,像素点的相似度越小。
在搜索匹配点之前,对每个像素都会指定一个视差范围 D,将搜索范围局限在 D 内, 并会使用一个大小为 W×H×D(W, H 为图像的尺寸)的矩阵来记录每个像素与视差范围内的像素的匹配代价值。该矩阵存储了所有的匹配代价值,可以有效减少重复的计算, 提高计算效率。匹配代价计算的方法有很多,如灰度绝对值差,灰度绝对值差之和,归一化系数, 互信息和 Census 变换等。不同的匹配代价计算算法都有其独特的优点,对数据的表现也各不相同,其中,最常用的方法是互信息和 Census 变换。
(2) 代价聚合。在初始代价匹配中,其计算范围只限于局部窗口中,只考虑了局部的相关性,对噪声非常敏感。为了得到更优的匹配,必须进行代价聚合操作。在代价聚合中,半全局匹配算法采用了全局能量最优策略。该方法设定一个全局能量函数,通过对其进行不断的优化,使该函数逐渐取到最小值,从而保证每个像素是最优匹配。该函数的定义如下:
该函数分为三部分,第一部分是主要部分,主要是对上一步的代价 进行求和;第二,三部分是为了保证匹配满足连续性约束,若像素在一定范围内视差变 化过大,说明匹配出错概率较大,需要进行惩罚,避免这种情况出现。其中,第二部分 是针对视差变化较小的情况,因而其惩罚的参数 P1 的值较小;第三部分是针对相邻像素 视差变化较大的情况,因此,需要加大惩罚,P2 的值一般会比较大。
对邻域内不同的视差变化给予不一样的惩罚,有助于更好地应对各种不同的边缘情况。但由于视差大于 1 的范围很大,如果仅仅使用一个常数项对大视差变化进行惩罚往 往不够,因此,P2 的值需要动态调整,其调整公式如下:
通常,能量函数的最优化很难求得最优解,为了高效解决这个问题,半全局匹配算法提出了路径代价聚合的方法,只在固定的路径上计算匹配代价。对于某一像素,在其邻域内存在多条到达该像素的路径。该方法首先就某一条路径对匹配代价进行计算,然后对所有路径的匹配代价求和得到代价聚合值。
(3) 视差计算。在半全局匹配算法中,视差计算的操作较为简单,其采用赢家通吃的算法,即对每个像素来说,其代表的最优视差为最小代价聚合值。 在此步骤中,对每个像素都进行了 视差计算,因而可以得到以原图一样大小的视差图,代表了图像的匹配关系。
(4) 视差优化。 在视差计算步骤中,仅仅只是对代价聚合值进行选择,如果代价聚合不准确,会直接影响匹配结果,因此需要进行视差优化步骤,按照匹配的基本约束条件,对错误匹配 进行剔除并提高视差精度。视差优化常用的操作有剔除错误匹配,提高视差精度以及抑制噪声等。
错误匹配是指像素在代价聚合后得到的视差值并不是真实的最小的视差值。这种错误匹配的现象在实际中并不少见,图像的噪声、遮挡、弱纹理和重复纹理都会导致这一 现象产生。因此,为了提高匹配的精度,必须要对错误的匹配进行剔除。目前最常用的错误匹配的剔除方法是左右一致性法,它是根据匹配的唯一性约束条件指定的。匹配的 唯一性指出对于左图像的某一像素点,在右图像上至多只有一个像素点与之一一对应。左右一致法就是将左右图像的对应点的视差值进行比较,若两个视差值小于一定的阈值, 则认为匹配成功,否则认为该视差不满足唯一性将被剔除。除了左右一致性法外,常用的匹配剔除方法还有剔除小连通区和唯一性检测等方法。连通区是指连通区内的视差与其邻域的视差之差小于一定的阈值,剔除小连通区是指剔 除视差图中很小的连通区,因为这种连通区通常是由于误匹配造成的;唯一性检测是指 对每个像素,计算其最小代价值和次小代价值,如果它们的差小于一定的阈值,说明匹配不是很准确,应该剔除。每种剔除错误匹配方法,都有其无法识别的情况,在实际应 用中,可以将几种方法结合使用。
在视差计算中,得到的视差图都是整像素的,无法满足精度要求,为了提高视差精度,可以采用子像素优化技术,使用二次曲线内插的方法获得子像素。 具体做法是首先将像素点的所有视差标注出来,然后找到最优视差点,接着确定该点周围两个视差点, 按照 3 点确定一条二次曲线的原理,得到过这 3 点的抛物线, 该抛物线的顶点就是最优 子像素。
在计算像素的视差值时,都是基于小窗口进行的,容易产生噪声,因此可以使用中值滤波和均值滤波等图像滤波方式对视差图进行滤波,如果要保持较好的边缘精度,也可以考虑使用双边滤波。
参考
[1] 视觉SLAM十四讲
[2] 张正友算法标定原理详解(https://blog.csdn.net/u010128...)
推荐阅读
- 多目标跟踪 | FairMOT:统一检测、重识别的多目标跟踪框架,全新Baseline
- CVPR2020 | 3D目标检测点云检测新网络 PV-RCNN
- 华为诺亚方舟加拿大实验室提出BANet,双向视觉注意力机制用于单目相机深度估计
更多机器学习、深度学习、计算机视觉、自动驾驶、机器人等领域最新最前沿的科技请关注微信号AI算法修炼营。