本文所包含的内容:
讲述了bumblebee 立体视觉的原理
讲述了bumblebee Demo 程序中各项参数的含义及如何调整
讲述了为什么在深度图像和重构的3D 图像中有无效的像素
本文的阅读方法:
红色字体是关键的地方
立体视觉
本文将试着去阐述立体视觉技术。
阅读完本文后你将对数据如何在系统中流动和其间所有可调整的参数有一个更深入的了解。
这将使你可以量身定做自己的系统来完成特殊的任务。
立体视觉的基本原理
立体视觉的任务是完成空间的测量,这种测量是基于空间上存在偏移的相机所采集到的图像的。
立体视觉的处理过程可分为如下三步:
建立从不同观测角度所获得的同一场景图像特征的相关。
计算每幅图像中相同特征的相对位移
根据相机的几何结构,决定特征相对于相机的3D 位置
考虑如下两幅图片。
这两幅图片取自一对存在水平偏移的Triclops 相机模型。
我们可以在两幅图片中分别定义两个点A 和B 。
点left A 对应于点right A ,同样的,点left B 对应于点right B 。
使用一把尺子,如果你测量一个点到图像边缘的水平距离,你会发现左图的这个距离比右图中对应点到图像边缘的水平距离要大。
例如,左图中边缘到电话听筒的距离要大于右图中边缘到电话听筒的距离。
我们就可以根据这个距离(也被叫做视差)来确定电话听筒到相机模型的距离。
我们把左图和右图中相同特征在各自坐标系中的值的差定义为视差。
你会发现在两幅图中,图像上端到所匹配的特征的距离完全相同,这是因为相机是水平排列的,因此只有水平的位移。
于是特征A 的视差被定义成D(A) = x(A left ) – x(A right ),B 的则为D(B) = x(B left ) – x(B right ),其中x(A left )是A left 点的x 轴坐标。
如果你去计算D(A) 和D(B),你会发现 D(A) <D(B),这说明在这个场景当中点A 比点B 要远。
建立相关
Triclops 库使用绝对相关偏差和的方法来建立图像间的相关。
这种方法的原理如下: 对于图像中的中每一个像素
在参照图像中,按照给定的正方形尺寸选择一个邻域
将这个邻域沿着同一行与另一幅图像中的一系列邻域相比较
找到最佳的匹配
结束
邻域的比较方法如下面的公式所示:
]][[]][[22
22max min min j y d i x I j y i x I left right j i d d d m m
m m
+++−++∑∑−=−== 其中:
min d 和max d 是最小和最大视差(disparity )
m 是模板尺寸(mask size )
right I 和left I 是右面的图像和左面的图像
计算距离
物体到相机的距离可由视差和相机的几何结构确定。
所匹配的特征的距离是视差,镜头焦距的长度,CCD 的分辨率和基线长度(两相机间的距离)的函数。
Triclops 库提供了深度映射转化为距离图像的函数。
下面的方程给出了视差与距离的关系以及单个相机中世界坐标与像坐标的关系:
d bf Z =;f u Z X =;f
v Z Y = 其中:
(X ,Y ,Z )是3D 点在世界坐标系中的位置
f 是相机的焦距
(u ,v )是像坐标
d 是视差值
b 是相机间的基线长度
Triclops 库中的数据流程
Triclops 库中的数据流程如下图所示。
系统首先从相机模型中获得raw 格式的图像,最终将其处理成深度图像。
在系统中有两个主要的处理模块。
第一个处理模块是一个应用了低通滤波、图像校正和边缘检测的预处理模块。
第二个处理模块用来做立体匹配、结果确认和亚像素插值。
最后的处理结果就是一幅深度图像。
预处理(Pre-processing )
为了校正一幅图像,事先对其进行平滑是非常重要的。
所以如果要校正一幅图像,事先将低通滤波器打开是很好的方法。
当然不使用低通滤波器同样可以校正图像,但校正后的图像可能会出现混淆的现象。
如果要提高处理速度,可以将低通滤波器关掉。
校正(Rectification)
校正是用来修正镜头所产生的畸变的。
在原始图像中可以看到镜头所带来的这种畸变。
例如,场景中的一条直线在原始图像中会变成一条曲线,这种效果在图像的边角处尤为明显。
校正就是为了修正这种类型的畸变。
进一步来讲,如果没有正确的校正,那么沿着行或者列所做的特征搜索将可能产生错误的结果。
边缘检测(Edge detection)
边缘检测是一项任选的特性,它使用亮度的变化来匹配特征。
当系统中的相机具有自动增益功能时,这项功能是非常有用的。
如果每个相机的自动增益的变化是不一致的,那么图像间的绝对亮度是不一致的,而虽然绝对亮度是不一致的,但亮度的变化却是一个常数。
因此边缘检测适用于光照有很大变化的环境当中。
虽然边缘检测可以改善检测的结果,但这相当于又引入了另外的处理步骤,因此要权衡结果的改善状况和速度之间的关系来使用这项功能。
注意,确认功能仅在边缘检测模式下有效。
立体处理(Stereo processing)
立体处理使用前面所讲过的绝对相关偏差和的算法。
视差范围(Disparity range)
视差范围是立体算法为了在两幅图像中搜寻最佳匹时,所搜寻的像素的范围。
在Triclops系统中0个像素的视差代表了无穷远处的物体。
最大的视差定义了能被检测到的最近的物体。
我们需要根据实际的任务来设置合适的视差范围。
减小视差范围可以加快系统的运行速度,并降低误匹配的几率。
相关模板(Correlation mask)
相关模板是围绕着一个像素的一个正方形邻域,这个像素就是系统想要为其寻找匹配的像素。
我们可以设定这个相关模板的尺寸。
大的模板会产生更密集更平滑的深度图像,然而,在识别不连续深度位置的精度上会有所欠缺。
另一方面,小的模板所产生的图像较为稀疏且会有更多的噪声,但在定位不连续深度的时候会有上佳的表现。
为了生成相同的结果,模板的尺寸要与被处理图像的分辨率成一定的比例。
就是说为了得到具有可比性的结果,对于160x120图像的5x5的模板,对于320x240图像的时候模板要增大到9x9。
模板的尺寸必须是奇数。
3x3,5x5,7x7是有效的模板尺寸,而4x4,6x6,8x8则是无效的模板尺寸。
Triclops提供了最大为15x15和最小为1x1的模板。
另外,Triclops中提供了一个新的用于实验的函数:troclopsSetAnyStereoMask,这个函数允许用户设置任意尺寸的相关模板。
确认(Validation)
在一些情况下,例如封闭的缺乏变化的质地,是无法建立图像之间的相关的。
如果相关建立的不正确,那么测量的结果也就是不正确的了。
为了避免不正确的测量,系统引入了两个确认的方法:
质地确认(Texture validation)是基于相关模板的质地的水平的,它决定了视差值是否有效。
如果质地的水平不足以产生一个正确的匹配,这个像素就会被声明为无效。
唯一性确认(Uniqueness validation)是指对于一个特定像素的最佳匹配和这个相关模板下的其他匹配比起来是不是足够好。
即使相关模板的质地满足要求,由于封闭的原因,可能还是
用户可以设定两个阈值来控制确认的严格程度——一个是质地另一个是唯一性。