上一篇整理了人脸检测,这篇讲一下移动目标检测。
目前逐渐形成三种运动目标的检测算法:
1)帧间差分法是采用视频序列中的相邻两帧图像做差的方法,来检测视频序列中 的移动目标。但是受运动目标和背景变化的影响,检测过程中有可能出现伪目标或者目标中 出现“空洞”,在目标运动不是太快时可以有效的检测到目标。
2)背景减除法首先在没有目标的场景中获取背景图像,然后利用实时视频序列和背 景图像做差,来实现地移动目标的检测。如何获得背景是背景减除法的关键。
3)光流法是通过给图像中每个像素点赋予一个速度矢量的方法建立光流场,利用光 流场中矢量运动的连续性来检测移动目标。该方法的计算量通常很大,难以实现实时性的检测。
其中侦差法比较简单,可操作性较强。
一、侦差法原理
侦差法是通过两帧相邻图像间做差,并选取合适的阈值对图像进行二值化,从而选取出运动的物体。设 f(x,y)为灰度差分图像,gk(x,y)、gk-1(x,y) 为相邻的两帧灰度图像,D(x,y)为侦差图像,T为差分阈值。
1、缓存两帧灰度图像。
2、两帧灰度图像做差,将结果和设置的阈值进行比较后转二值化输出。
3、对二值化结果进行框选,确定移动目标,类似人脸检测。
二、缓存两帧图像方法
难点主要是如何能缓存两帧图像,以 SDRAM 为例,常用的方法有两种。
1、SDRAM 掩码
(1)灰度图像 A 为 8 bit,则使用场信号或计数,将帧进行划分,并且设置灰度图像:第一帧灰度图像数据为{8'bz,A1},第二帧灰度图像数据为{A2,8'bz}。
(2)SDRAM 写数据为16bit,利用 SDRAM 的掩码,先遮掩高位,写完一帧图像后则掩码变成遮掩低位,循环反复,和乒乓操作类似。实现两帧图像写入,一帧包含原两帧的图像输出。即输入为{A1,8'bz}、{8‘bz,A2},输出为{A1,A2}。
(3)SDRAM输出数据的高位和低位做差,实现侦差法。
这种方法有一个很大的缺点,即不能再使用乒乓操作,否则会导致写入的数据无法拼接。
2、SDRAM 4 Port
常用的 SDRAM 控制器为 2 Port,即一组输入输出,可以将 SDRAM 控制器改造成 4 Port(代码到此可见),即两组输入输出。
(1)输入数据为灰度 8bit 数据或原 RGB565 16bit 数据都行,使用场信号或计数,将帧进行划分:第一帧图像为 B1,第二帧图像为 B2。
(2)两帧图像分别写入 SDRAM 控制器的两个输入端口,将 SDRAM 的两个输出端口的读使能同步,读出两股平行出来的数据。
(3)两股数据如果是 8bit 灰度数据则直接做差,实现帧差法。如果是原 RGB565 16bit 数据,则分别进行灰度转换,然后做差,实现侦差法。
注意如果直接这样做,那么结果是第一帧和第二帧做差,第三帧和第四帧做差,这样缺乏了连贯性。可以将其中一股数据打一拍,设置一个flag信号,实现如上面方法 1 一样的第一帧和第二帧做差,然后第二帧和第三帧做差,这样连贯性更好。
三、侦差法致命缺点
侦差法的核心思想是移动目标和背景做差,不同点即移动目标本身。如果移动目标和背景的颜色相似,检测精度将大大降低。
四、改进方法
侦差法的致命缺点难以逾越,但是也可以通过一些技术手段提高检测精度:
1、对结果进行平滑滤波、边缘检测、形态学滤波等,提高检测精度。
2、两帧图像做差改为三帧图像做差或四帧图像做差,提高检测精度。具体实现为增加缓存器件,或者上述的 1、2 种方法结合,实现缓存三帧、四帧图像的要求。
参考资料:
[1]OpenS Lee:FPGA开源工作室(公众号)
[2]NingHechuan:硅农(公众号)