基础知识
机器视觉四要素:相机、镜头、光源、目标物
1.相机靶面尺寸换算
2.相机的视差大小计算
- 物距,焦距,相机靶面尺寸
- 例:
- W = 靶面尺寸X * 物距 / 焦距
- H = 靶面尺寸Y * 物距 / 焦距
3.双目测量精度
- result=(Z * Z / f * b)* 像元尺寸 * 像素匹配精度 (单位mm)
- result:精度结果 Z:物距 f:焦距 b:基线距离
- 一代系统为例:result=(2000 * 2000 / 5 * 1200)* 3.45 * 10^-3次 * 1
4.图片大小的计算
图像占用空间的大小计算:
大小=分辨率 * 位深/8
- 分辨率=宽 * 高(如:1024 * 768,640 * 480)
- 位深:如24位,16位,8位——灰度范围:0-255位深就是8位2^(8)
- /8计算的是字节数,bit到byte字节
例如:
一幅图像分辨率:1024 * 768,24位,则其大小计算如下:
大小 = (1024 * 768 * 24)/ 8 = 2359296 byte = 2304 KB
- 大小:1920 x 1080 x 8 / 8 = 2073600字节 = 2025Kb = 1.98Mb
5.双目立体匹配
计算公式
- Z = f * b / d
- Z:距离
- f:焦距
- b:左右相机基线距离
- d:视差
1.极线约束
双目立体匹配在寻找同名点的过程中,若没有任何先验约束,则对左影像每个像素,需要在右影像全图空间中进行搜索,这种暴力搜索方法不仅效率非常低,而且很容易由于各种因素(如弱纹理、重复纹理等)搜索到错误的对应点,而利用核线几何约束则是减小搜索范围,提高匹配效率且降低错误匹配的一种有效方法。
作用:将对应像点的搜索区域从二维降到了一维。
2.深度与视差
- 通过三角形Ppp’和三角形POO相似,进行物距Z的求取。
3.立体匹配的步骤详解
1.匹配代价计算
匹配代价计算的目的是衡量待匹配像素与候选像素之间的相关性。两个像素无论是否为同名点,都可以通过匹配代价函数计算匹配代价,代价越小则说明相关性越大,是同名点的概率也越大。
每个像素在搜索同名点之前,往往会指定一个视差搜索范围D(Dmin ~ Dmax),视差搜索时将范围限定在D内,用一个大小为W×H×D(W为影像宽度,H为影像高度)的三维矩阵C来存储每个像素在视差范围内每个视差下的匹配代价值。矩阵C通常称为DSI(Disparity Space Image)。
匹配代价计算的方法
- 传统的摄影测量中:
- 灰度绝对值差(AD,Absolute Differences)
- 灰度绝对值差之和(SAD,Sum of Absolute Differences)、
- 归一化相关系数(NCC,Normalized Cross-correlation)
- 计算机视觉中:
- 互信息(MI,Mutual Information)法
- Census变换(CT,Census Transform)法
- Rank变换(RT, Rank Transform)法
- BT(Birchfield and Tomasi)法
- 传统的摄影测量中:
不同的代价计算算法都有各自的特点,对各类数据的表现也不尽相同,选择合适的匹配代价计算函数是立体匹配中不可忽视的关键步骤。
2.代价聚合
从全局进行考虑
代价聚合的根本目的是让代价值能够准确的反映像素之间的相关性。上一步匹配代价的计算往往只会考虑局部信息,通过两个像素邻域内一定大小的窗口内的像素信息来计算代价值,这很容易受到影像噪声的影响,而且当影像处于弱纹理或重复纹理区域,这个代价值极有可能无法准确的反映像素之间的相关性,直接表现就是真实同名点的代价值非最小。
而代价聚合则是建立邻接像素之间的联系,以一定的准则,如相邻像素应该具有连续的视差值,来对代价矩阵进行优化,这种优化往往是全局的,每个像素在某个视差下的新代价值都会根据其相邻像素在同一视差值或者附近视差值下的代价值来重新计算,得到新的DSI,用矩阵S来表示。
3.视差计算
视差计算即通过代价聚合之后的代价矩阵S来确定每个像素的最优视差值,通常使用赢家通吃算法(WTA,Winner-Takes-All)来计算,如图2所示,即某个像素的所有视差下的代价值中,选择最小代价值所对应的视差作为最优视差。这一步非常简单,这意味着聚合代价矩阵S的值必须能够准确的反映像素之间的相关性,也表明上一步代价聚合步骤是立体匹配中极为关键的步骤,直接决定了算法的准确性。
赢家通吃(WTA)算法示意图
4.视差优化
视差优化的目的是对上一步得到的视差图进行进一步优化,改善视差图的质量,包括剔除错误视差、适当平滑以及子像素精度优化等步骤,一般采用左右一致性检查(Left-Right Check)算法剔除因为遮挡和噪声而导致的错误视差;采用剔除小连通区域算法来剔除孤立异常点;采用中值滤波(Median Filter)、双边滤波(Bilateral Filter)等平滑算法对视差图进行平滑;另外还有一些有效提高视差图质量的方法如鲁棒平面拟合(Robust Plane Fitting)、亮度一致性约束(Intensity Consistent)、局部一致性约束(Locally Consistent)等也常被使用。
由于WTA算法所得到的视差值是整像素精度,为了获得更高的子像素精度,需要对视差值进行进一步的子像素细化,常用的子像素细化方法是一元二次曲线拟合法,通过最优视差下的代价值以及左右两个视差下的代价值拟合一条一元二次曲线,取二次曲线的极小值点所代表的视差值为子像素视差值。如图3所示。
局部匹配算法的步骤:1.匹配代价计算、2.代价聚合、3.视差计算三个步骤
全局匹配算法的步骤:1.匹配代价计算、2.视差计算、3.视差优化三个步骤,
半全局算法 SGM:1.匹配代价计算、2.代价聚合、3.视差计算、3.视差优化
半全局算法SGM介绍:
局部:一维搜索,高效率的局部算法,基于局部窗口视差相同的假设。在很多情况下不成立。
全局:二维搜索,通过二维相邻像素视差之间的约束(如平滑性约束)—相邻像素视差d在一定情况下是平滑的。而得到更好的匹配效果,但是对内存的占用量大,速度慢
半全局:采用全局的框架,在计算能量函数最小化的步骤时使用高效率的一维路径聚合方法来代替全局算法中的二维最小化算法,使用一维最优来近似二维最优,得到的视差图在效果上和全局算法没有太大的差别,但是算法效率却有非常大的提升。
半全局匹配代价计算的常用方法:
互信息(Mutual Information,MI)
- 熵
- 互信息是一种对影像明暗变化不敏感的相关性测度,它通过两张影像各自的熵H以及两者的联合熵来定义,熵代表影像的信息量,是基于灰度的概率分布所得到的统计量,图像的熵越大代表包含的像素灰度越丰富,灰度分布越均匀。互信息MI通过公式1来计算。
Census变换(汉明距离)
- SAD窗口内的像素灰度差异进行存储。将比较得到的布尔值映射到一个比特串中,最后用比特串的值作为中心像素的Census变换值