zoukankan      html  css  js  c++  java
  • 运动背景下的运动目标检测

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

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

      第一,已知目标的先验知识。在这种情况下检测目标有两类方法,第一类方法是用目标的先验知识训练一堆弱分类器,然后这些弱分类器一起投票来检测目标,如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)特征:

      第三组同上

  • 相关阅读:
    JZOJ Contest2633 总结
    6813. 【2020.10.05提高组模拟】送信
    HDU 1506 最大子矩形
    2020.10.07【NOIP提高A组】模拟 总结
    6815. 【2020.10.06提高组模拟】树的重心
    2020.10.06【NOIP提高A组】模拟 总结
    2020.10.05【NOIP提高A组】模拟 总结
    gmoj 3976. 【NOI2015模拟1.17】⑨
    2020.09.26【省选组】模拟 总结
    2020.09.19【省选组】模拟 总结
  • 原文地址:https://www.cnblogs.com/easymind223/p/2839480.html
Copyright © 2011-2022 走看看