各种目标检测方法介绍(懒人可以直接略过)
目标检测是一个老话题了,在很多算法当中都有它的身影。目标检测要做的就两件事:检测当前图片中有没有目标?如果有的话,在哪?按照先验知识和背景运动来划分的话,目标检测方法大概可以分为两大类:
第一,已知目标的先验知识。在这种情况下检测目标有两类方法,第一类方法是用目标的先验知识训练一堆弱分类器,然后这些弱分类器一起投票来检测目标,如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)坐标点,也就是背景矢量最集中的位置(图中点的亮度越大代表该位置矢量的密度越大),如红圈所示,红圈外面的矢量就可以认为是运动目标了,如上右图所示。
移动目标检测
最新推荐文章于 2024-09-09 01:14:40 发布