贾振堂, 王计元
(上海电力学院 电子与信息工程学院, 上海 200090)
安防是社会生活中的一个重要话题,目前市场上可以买到各种各样的防盗报警系统,包括红外线感应、电磁感应、视频监控系统等。视频监控系统具有安装简便、监控范围大等诸多优点,因此得到了广泛的应用。
在视频监控的视野范围内,并不是所有的区域都需要设防,画面中的有些部分属于公共区域,如果不加区分,则会频繁发生误报警。因此,现有的视频监控中,普遍支持敏感区域的划分(可以让用户在监控画面中指定一定的范围,作为敏感区域)。只有在敏感区域中发现运动目标时才予以报警,可以大大提高系统的可用性和可靠性。然而,目前的视频监控系统只能对画面进行“平面分割”,不能进行三维空间的判别。例如商铺里面的摄像头,对准门口进行视频监控,如果是玻璃门,则可能检测到玻璃门外马路上的行人,从而发生误报。安装在阳台上的摄像头,也可能将外边大街上的行人和车辆当做可疑目标而误报警。
尽管目前的视频监控技术增加了很多智能化的处理[1],并采用了多种视频传输的技术手段[2],但是目前鲜有在三维空间上实施监控的报道。本文采用双目摄像机来构建三维立体视频监控系统,并设计了快速视差计算方法,从而可在三维空间中划出敏感区域,实时检测到目标与警戒面的距离,实现立体空间的监控和入侵报警。
(1)
敏感区域可以是一个较大的连通区域,也可以是由若干互不连通的子区域组成,即
R=R1∪R2∪R3∪…∪RN
(2)
其中,R1,R2,R3,…,RN为N个独立的子区域。
图1为一个应用的实例,院墙内部为敏感区域,即这里只有一个敏感区域(N=1),而院墙外为非敏感区域。
图1 视频监控敏感区域的划分
然而,以上这些区域都是二维的,即把监控画面看作一个平面,而没有考虑不同像素的深度层次。这在有些场合下是不适用的,例如图2的监控画面。图2中,摄像头对阳台实施入侵监控,以防窃贼从阳台爬入。显然,图2中圈出的在地面上施工的人员和车辆会被监控系统检测为运动目标。目前的二维监控系统无法区分画面当中的运动目标是在阳台上还是远离阳台。其特点是敏感区域和非监控对象在不同深度层次上叠加在一起,极易引起误报警。
图2 敏感区域中包含非敏感对象
为此,本文采用双目立体摄像机构建了三维空间的视频监控系统。立体摄像机能够计算物体的距离,并在此基础上建立面向三维空间的入侵检测系统。
采用固定的平行摄像机,焦距固定、摄像机间距也固定。由于入侵监测并不需要真实的世界坐标,因此在摄像机坐标系内完成报警计算,或者说就是将摄像机坐标(Xc,Yc,Zc)作为世界坐标(X,Y,Z)。这样可以在设备安装前,预先对立体摄像机系统进行内部参数标定并予以存储。调用OpenCV实现对摄像机的立体标定。
在图像得到矫正的情况下,立体标定后的两个摄像机等效于一套理想的平行摄像系统[3]。根据平行立体摄像系统的原理,可将图像坐标点p(x,y)反投影到三维空间坐标点P(X,Y,Z),计算公式为
(3)
式中:d——视差,单位为像素;
B——两摄像机之间的物理距离;
F——立体矫正后的理想焦距,单位为像素。
其中,图像坐标均以校正后的图像中心为原点。
由式(3)可见,在摄像机参数F和B确定的情况下,像素的视差d和距离Z成单调的反比例关系。因此,在进行入侵判别时,并不需要计算目标的真实距离,而只需要做视差比较即可,即设置一个特定的视差平面作为警戒面,并检测目标视差是大于警戒面视差还是小于警戒面视差。
当监控系统采用立体视觉技术时,敏感区域将不再限定于二维坐标平面(x,y) 上,而可以扩展到三维坐标空间(X,Y,Z)中。图3(a)为基于摄像机坐标系的立体敏感区域模型,图3(b)为对应的真实三维空间区域边界(警戒面),即敏感区域被设定为阳台护栏所在的警戒面以内,之外的则不作为敏感区域。
图3 三维敏感区域
三维敏感区域Ω是由若干独立的三维空间子区域组成的,理论上可以是若干个任意形状的三维子空间所组成的并集。
Ω=Ω1∪Ω2∪Ω3∪…∪ΩN
(4)
其中,Ω1,Ω2,Ω3,…,ΩN为N个独立的子空间。为了方便,将每个子空间Ωi的形状简化为从摄像机光心发出的椎体,椎体的截面就是警戒面,如图3(a)中的两个面α和β。当运动目标区域O位于任何一个或多个三维子空间内,则报警(AO=1),否则不报警(AO=0),即
(5)
敏感区域和非敏感区域采用空间平面来分界,便于报警判别。平面以内为报警区域。摄像机的视野已经确定了一个立体角,因此只需要设置摄像机视野前方的界面即可,如图3中的平面α和β。
系统安装完成后,首先由人工在监控图像上设置警戒面的角点,然后由软件自动计算这些角点的视差,并予以存储。为了提高准确度,如果角点处没有明显的纹理,可在这些点所对应的真实空间位置上粘贴特定的图案,并在计算视差后予以清除。
为了便于描述和存储,软件自动将警戒平面分解为一系列空间三角形,称为警戒三角形平面(Warning Triangle Plane,WTP)。三维报警区域由多个WTP围合而成。
如果发生越界的像素数量大于一定的阈值T,则予以报警,那么式(5)就具体化为
(6)
显然,计算可疑目标的视差是实施三维立体空间入侵检测的关键技术环节。立体视差的计算有多种方法,主要分为局部算法和全局算法两大类[4]。全局视差算法一般是对视差构建某种全局能量函数,通过反复的迭代过程使得能量函数最小化。全局算法效果较好,但是时间复杂度更高。相比之下,虽然局部算法的效果不如全局算法,但是局部算法的计算速度往往比较快。局部算法的一般步骤是:计算代价空间,然后进行代价空间的聚合操作,最后做视差计算。为了剔除错误视差,通常还需要分别计算左视差和右视差,并进行一致性检测。
为了择优,本文设计了两种局部视差算法:算法1,面向像素,采用以上的全部基本步骤,包括代价空间计算、代价聚合、利用动态规划计算视差,以及左右视差的一致性检测等步骤[1];算法2,着重考虑计算速度。相对于算法1,算法2的改进主要在于以下3个方面:
(1) 采用基于图像块的下采样代价空间,视差的计算以块为单位,降低计算量;
(2) 免去代价聚合操作,直接在代价空间上采用动态规划算法计算最终视差;
(3) 动态规划算法采用了“局部动态规划”,以加快速度。
因为算法1是常规的处理过程,不再赘述,后面实验部分直接给出结果。下面着重对算法2做详细介绍。
假设左图像和右图像的大小相等,宽度和高度分别为W和H,并经过了立体矫正。以左图像为基准,把左图像划分成宽度和高度分别为m和n的不重叠小图像块,为每一块图像计算一个视差值,将原图像中的一个图像块映射到视差图中作为一个点。这样,视差图的宽度和高度分别为w=W/m和h=H/n。
视差代价平面和动态规划(Dynamic Program,DP)的视差曲线如图4所示。视差计算每次处理一行图像块,这样对于内存空间的要求比较小。考察左图像中的某一行图像块,例如第y行,对其中的每个图块(例如第x块)在右图像中做水平匹配搜索,搜索过程中以单像素为移动步长,搜索的移动范围为0~dmax,dmax为可能的最大视差。这样,得到该块行的一个代价平面C(x,d),代价平面的一个维度为块序号x,另一个为视差d。这里为了描述简洁,省略了行变量y,则计算公式为
0≤x≤w-1,0≤d≤dmax
(7)
式中:B(x)——左图像中该块行的第x块子图;
IL(i,j),IR(i,j)——左右图像中坐标为(i,j)点的像素。
图4 视差代价平面和动态规划的视差曲线
显然,这里用平均绝对差来表示左右图像的匹配程度。代价平面C(x,d)是二维的,需要针对每一个x值,寻找一个视差最优值,使得C(x,d)最小。一个简单的方法是在所有可能的视差中直接搜寻C(x,d)的最小值。这样计算量很小,但是因为没有考虑图像块之间的相关性约束,容易受噪声干扰。
因此,接下来采用动态规划来计算视差。代价聚集的过程,实际上等效于在代价空间上的滤波过程[5-6]。相对于基于像素匹配的代价空间,下采样块匹配所产生的代价空间相当于已经做了一定的滤波处理,因此,本文免去代价聚合操作,直接在代价空间上采用动态规划算法计算视差。
动态规划常被用来处理多阶段决策问题。一行像素的视差计算是逐个依次计算的,属于多阶段决策问题,因此动态规划也常被用于视差计算[7]。其基本方法这里不再赘述。如果直接引用常规的DP算法,在C(x,d)的更新计算过程中需要考察前一像素块x-1处的全部可能d值,其搜索过程为
(8)
式中:d(-1)——前一图像块的视差值,取值范围为0~dmax。
式(8)中大括号里面是两项的和,第一项表示代价最小化,第二项表示视差的连续性约束,a和(1-a)表示前后两项的权重。
由于对前一图像块的可能视差值d(-1)做了全搜索,因此会消耗较长的时间。实际上,相邻图像块在视差上具有连续性,通常变化不大。鉴于此,受文献[8]的启发,本文对算法作了改进,将全搜索改为局部搜索。这样可降低计算复杂度,搜索范围从(0,dmax)缩小为(d1,d2),代价平面的计算公式为
(9)
其中
式中:Δd——预设的视差偏移量门限,为dmax的1/4~1/3。
(12)
(13)
将其与式(9)的结果比较,在二者之中择优,用于替代式(8)的搜索过程,即
C(x,d)=min{cmin(x,d),C(x,d)}
(14)
首先,采用标准立体测试图像对视差算法进行测试,以便比较视差算法的效果。用C++编写程序,程序为直接的算法原理实现,暂时没有做任何代码优化。测试了tsukuba,cones,teddy,venus等4对图像,测试结果如表1,图5,图6所示。
表1 算法1和算法2的用时比较 ms
图5 算法1的测试结果
图6 算法2的测试结果
由测试结果可以看到,算法1的结果比较好,各个物体的棱角比较清晰,然而计算时间比较长;而对于算法2,尽管结果比较粗糙,但整体上看视差的层次依然分明,并且速度提高了30倍左右。
根据上面的测试结果,在效果尚可的情况下,算法2的速度有明显优势,因此在实际监控系统中,暂时采用了算法2。对算法2做初步的代码级优化,在分辨率为320×240像素画面下,可以达到15帧/s。图7展示了视差测试结果。图7中一个人从门外(较远处)走过来,直到跨进门来。可以看出,当人由远及近走来时,视差的变化是明显的。
图7 实际摄像画面及视差计算结果
由于视差计算并不是面向像素的,因此视差图有些粗糙。考虑到视频监控通常只需要检测运动对象,因此结合运动检测来弥补这一不足,从而实现较为准确的报警判决。
常规的视频监控系统中,根据画面目标的运动特征实施报警是一个基本的功能。本文将运动检测与视差检测结合起来,实现三维空间的入侵检测和报警。首先,进行运动目标检测,确定运动目标的区域;然后,针对运动区域计算视差,即进一步减少了视差的计算量。
图像差分法是运动目标检测的最直接方法,可以采用相邻帧之间的差分来检测运动,也可以采用当前图像与背景图像的差分来检测。鉴于视频监控多为静态背景,本文采用与背景差分的方法来检测。其中,背景的生成是关键环节,需要在视频监控的过程中自动生成。混合高斯模型的效果更好,但是计算量更大。考虑到本文应用情景的实际情况,选择时间平均法来生成背景,背景的更新过程为
Bt=(1-α)Bt-1+αIt
(15)
式中:Bt,Bt-1——当前时刻和前一时刻的背景图矩阵;
It——当前时刻图像矩阵;
α——比例系数,取一个比较小的值,本文取0.01,以适应基本静止的背景。
图8为将运动目标检测结果叠加在视差图上的效果。尽管视差图有部分毛刺以及不准确的地方,比如图8(a)中门框部分以及人腿边缘的锯齿,但是通过对运动区域检测,如图8(b)中虚线所示,并提取对应区域视差后,基本上消除了其他部分的视差影响,效果如图8(c)所示。据此可以准确计算出运动物体的视差。
图8 结合运动区域检测的运动对象视差提取
以图7中大门、玻璃窗等为三维空间的检测界面,大门或玻璃窗之内为敏感区域,根据以上算法原理,通过反复实验,证明绝大多数场合都能准确判别,可以达到实用的要求。个别误报主要发生在逆光的情况下,这时人体外观的纹理很不明显,视差计算有较大的误差。
本文提出了一种在三维空间中检测运动目标入侵的算法。采用了双目平行摄像系统,在对视频图像做实时立体矫正的基础上,通过快速的下采样块匹配以及局部动态规划来计算视差图,最后结合运动区域检测提取目标视差区域,并直接在视差图像上进行入侵判别。通过验证,绝大多数场合下都可以准确判别。然而对于逆光的情况,目前的视差结果有较大的误差,需要采用动态范围更大的摄像头或者外加滤光处理,在以后的工作中将做进一步的测试和算法上的改进。