运动背景下的运动目标检测

各种目标检测方法介绍(懒人可以直接略过)

  目标检测是一个老话题了,在很多算法当中都有它的身影。目标检测要做的就两件事:检测当前图片中有没有目标?如果有的话,在哪?按照先验知识和背景运动来划分的话,目标检测方法大概可以分为两大类:

  第一,已知目标的先验知识。在这种情况下检测目标有两类方法,第一类方法是用目标的先验知识训练一堆弱分类器,然后这些弱分类器一起投票来检测目标,如boosting,  random forest 都是这个思路,大家熟知的adaboost人脸检测也是如此,这一类方法我会在以后的文章中讨论。第二类方法是根据先验知识找到目标和非目标的最佳划分线,如SVM.这两类方法各成一家,各有所长,都有着不错的表现。

  第二,未知目标的先验知识。此时不知道要检测的目标是什么,于是什么是目标就有了不同的定义。一种方法是检测场景中的显著目标,如通过一些特征表达出场景中每个像素的显著性概率,然后找到显著目标。另一种方法就是检测场景当中的运动目标了,这也是本文下面将要讨论的重点内容。

  在检测运动目标时,如果背景是静止的,so easy,略过。当背景也跟随一起运动时就比较麻烦了,现如今大概有两种方法来处理。第一种方法是背景补偿,即通过平移,缩放,仿射变换等计算出背景的运动,然后补偿背景再做差分。不过这种方法有两个问题,一是仿射变换运算量巨大,二是即使求出背景补偿向量,背景中的远景和近景的向量也会有相对误差,所以这种方法几乎不可行。第二种方法就是传说中的optical flow(光流)了,下面进入正文。

正文


光流法的大致流程如下:

1.在一帧图像中选取大量的光流点(具体选取方法可以不同,如fast角点,随机选,等间隔选...)。

2.计算所有光流点的运动矢量(常用方法有LK光流,HS光流等)。

3.根据这些矢量和其它一些特征检测运动目标。

下面以一个具体例子进行分析

 

1.首先在一帧图像内随机均匀选取k个点,并滤除那些邻域纹理太光滑的点,因为这些点不利于计算光流

2.计算这些点与上一帧图像的光流矢量,如上右图,此时已经可以看出背景运动的大概方向了

 

 

3.接下来的这一步方法因人而异了。

2007年cvpr的一篇文章Detection and segmentation of moving objects in highly dynamic scenes的方法是把这些光流点的(x, y, dx, dy, Y, U, V)7个特征通过meanshift聚类来聚合到一起,最后形成运动目标轮廓。

而我的方法很简单,只用到了(dx, dy)两个特征,如上左图,首先把所有光流点投射到直角坐标,图中的坐标轴是(dx,dy), 然后通过meanshift找到密度最大的(dx, dy)坐标点,也就是背景矢量最集中的位置(图中点的亮度越大代表该位置矢量的密度越大),如红圈所示,红圈外面的矢量就可以认为是运动目标了,如上右图所示。

 

  补充:

  最近问我问题的人太多了,补充几组实验图片供大家参考:

  第一组是用dx,dy两个特征检测的结果:

 

  第二组在dx, dy 的基础上混入了显著性(saliency)特征:

 

  第三组同上

posted @ 2012-12-30 00:26  汉泽的家  阅读(13954)  评论(39编辑  收藏  举报