OpenCV 视频监控(Video Surveilance)

转载:http://lh2078.blog.163.com/blog/static/568113722010711705926/

OpenCV 视频监控(Video Surveilance)概述

多年来在从事视频监控技术研究的过程中,一直需要这样一个平台,一方面可以提供众多成熟的检测、跟踪、轨迹分析算法,另一方面具备良好的编程接口,这样就可以将自己的算法很方便的嫁接进这个系统,测试和对比各种算法的优劣性能。而OpenCV 视频监控模块(Video Surveilance)恰恰提供了这样一个功能强大的平台,在下文中简称为VS。

从Intel OpenCV1.0开始,辅助库CVAUX中增加了VS模块内容,直至OpenCV2.1版本,该模块都相对稳定的存在。在OpenCV1.0和1.1版本中,VS的代码存在于CVAUX中,(OpenCV\cvaux\src\vs)。然而OpenCV提供相关资料相当少,在帮助中甚至只字未提,这也是VS长期未被许多研发人员关注的原因之一。仅有的几篇文档说明(OpenCV\docs\vidsurv)分别是:Blob_Tracking_Modules.doc,Blob_Tracking_Tests.doc和TestSeq.doc,也只对几个基础的接口类和简单的使用方法进行了说明。相关的例程(OpenCV\samples\c)也只有:bgfg_codebook.cpp,bgfg_segm.cpp,blobtrack.cpp。应该说可供参考的资源是非常有限的。

      值得庆幸的,也是OpenCV最大的优势就是其开源性。通过深入剖析VS的源代码,我们可以理清整个VS框架的脉络,探索其中的算法原理和实现方法,为我所用。在长期的研究学习和应用实践过程中,整理了一些学习笔记,在这里同广大爱好者共同探讨和学习。

OpenCV 视频监控(Video Surveilance)的架构

OpenCV VS与普通OpenCV函数不同在于:普通cxcore、cv函数均是C函数,而VS是利用C++的接口、多态、继承等技术构建起来的体系,由一些类、结构、全局函数组成。所以要学习和使用VS,要有较强的C++基础。“勿在浮沙筑高台”,如果不懂接口、多态、继承等C++的基本技术,还是去恶补一下再回来。

OpenCV 视频监控(Video Surveilance)的架构 - 海水和火焰 - 视频监控 形态学 OpenCV

打开opencv.dsw工程,可以在CVAUX下看到许多结构和类定义,VS部件多数以CvBlob开头,如图所示。这么庞杂的数据结构和类,理清头绪并不是一件容易的事情。我简单的归纳了一个UML图,虽然有很多不完善,但是可以方便读者们从全局看清VS的架构。

类似于MFC中的CObject,VS中的所有的类都有一个共同的父类CvVSModule,主要提供参数的读写、拷贝等功能。另外还有几个算法接口类,分别是:CvFGDetector,CvBlobDetector ,CvBlobTracker,CvBlobTrackGen,CvBlobTrackPostProc,CvBlobTrackAnalysis,分别代表:前景检测、新目标检测、目标跟踪、轨迹生成、跟踪后处理、轨迹分析等几组算法的接口,这些类是绝大多数VS类的父类。另外还有一个CvBlobTrackerAuto接口,其功能是对以上算法的链接、调度,即对整个算法流程的控制。

    VS中的很多类并没有直接提供给用户使用,多数只提供一个全局函数作为唯一的用户接口,这种思想也大量应用于COM技术中,是模式设计中类工厂的思想。感兴趣的读者可以查阅模式设计方面的图书和资料。
OpenCV 视频监控(Video Surveilance)的架构 - 海水和火焰 - 视频监控 形态学 OpenCV

OpenCV 视频监控(Video Surveilance)的算法体系 

如前面说到的,OpenCV VS提供了6组算法的接口,分别是:前景检测、新目标检测、目标跟踪、轨迹生成、跟踪后处理、轨迹分析,除了轨迹生成用于轨迹数据的保存以外,其他5个部分都是标准的视频监控算法体系中不可或缺的部分。

       OpenCV在Blob_Tracking_Modules.doc文档中,提供了算法的关系图,如下。OpenCV 视频监控(Video Surveilance)的算法体系 - 海水和火焰 - 视频监控 形态学 OpenCV

图中唯独缺少了轨迹分析部分,可能是因为在该文档形成的时候轨迹分析部分还没有完成。重新整理后如下。

OpenCV 视频监控(Video Surveilance)的算法体系 - 海水和火焰 - 视频监控 形态学 OpenCV
 

下面针对VS算法体系中的各个算法接口进行介绍,并给出算法的参考文献。

1 算法流程控制(CvBlobTrackerAuto)

       整个视频监控算法流程的设置和数据的传递在接口类CvBlobTrackerAuto的子类中完成,VS中提供了一个范本,就是CvBlobTrackerAuto1,该类是接口CvBlobTrackerAuto的子类,通过查看CvBlobTrackerAuto1::Process(),可以洞悉整个算法的标准流程。当然您也可以在遵循接口CvBlobTrackerAuto的基础上进行扩展。

用户调用接口:

CvBlobTrackerAuto* cvCreateBlobTrackerAuto1(CvBlobTrackerAutoParam1* param);

 

2 前景检测(CvFGDetector):

       CvFGDetector是前景检测类的接口,前景检测一般是指提取固定场景中运动部分的像素,比较常用的一大类方法是背景差。在其子类CvFGDetectorBase中包含了两种背景差方法的实现:

(1)《Foreground Object Detection from Videos Containing Complex Background》2003

(2)《An Improved Adaptive Background Mixture Model for Real-time tracking with shadow detection》 2001

后者就被广泛研究和应用的混合高斯模型背景差(MOG-Mixture Of Gaussians),其开创者是MIT的著名学者Chris Stauffer,可参考文献《Learning patterns of activity using real-time tracking》2000。

       OpenCV中还实现了一种基于码本的背景差方法,《Real-time foreground–background segmentation using codebook model》2005,可以参考例程bgfg_codebook.cpp,只是这种算法还没有整合进VS架构中,这个扩展工作有待完成。

用户调用接口:

CvFGDetector* cvCreateFGDetectorBase(int type, void *param);

 

3 新目标检测(CvBlobDetector):

       CvBlobDetector在前景掩模的基础上检测新进入场景的Blob(块),子类有两个,分别是CvBlobDetectorSimple和CvBlobDetectorCC,参考文献为《Appearance Models for Occlusion Handling 》2001,检测新目标的基本原则是:当连续多帧图像中包含该连通区域,且具有一致的合理的速度。CvBlobDetectorCC与CvBlobDetectorSimple一个最显著的不同在于引入了 CvObjectDetector,用于检测分离的目标块。

用户调用接口:

CvBlobDetector* cvCreateBlobDetectorSimple();

CvBlobDetector* cvCreateBlobDetectorCC();

 

4 目标跟踪(CvBlobTracker):

       目标跟踪部分的子类众多,在这里不一一列举,给出相应的接口及对应的功能。对MeanShift和粒子滤波感兴趣的读者可参考:《Real-time tracking of non-rigid objects using mean shift》2000,《A Tutorial on Particle Filters for Online Nonlinear Non-Gaussian Bayesian Tracking》2002,《Particle Filters for Positioning, Navigation and Tracking》2002。

用户调用接口:

CvBlobTracker* cvCreateBlobTrackerCC();

连通区域跟踪

CvBlobTracker* cvCreateBlobTrackerCCMSPF();

连通区域跟踪 + 基于MeanShift 粒子滤波的碰撞分析

CvBlobTracker* cvCreateBlobTrackerMS();

Mean shift 算法

CvBlobTracker* cvCreateBlobTrackerMSFG();

基于前景的Mean shift 算法

CvBlobTracker* cvCreateBlobTrackerMSPF();

基于Mean shift 权重的粒子滤波

 

5 轨迹生成(CvBlobTrackGen)

       该接口为CvBlobTrackGen,用于目标跟踪结束后,轨迹数据的保存。子类包括CvBlobTrackGen1和CvBlobTrackGenYML,前者以目标轨迹为单位保存整个轨迹的(x,y,sx,sy)数据为文本格式,后者与视频数据同步,以帧为单位保存当前目标信息为YML格式。

用户调用接口:

CvBlobTrackGen* cvCreateModuleBlobTrackGen1();

CvBlobTrackGen* cvCreateModuleBlobTrackGenYML();

 

6 跟踪后处理(CvBlobTrackPostProc)

       跟踪后处理是一个可选模块,主要用于跟踪过程中目标轨迹的平滑,子类众多,这里给出三个主要的用户接口和说明。

用户调用接口:

CvBlobTrackPostProc* cvCreateModuleBlobTrackPostProcTimeAverRect()

轨迹矩形窗时间平均

CvBlobTrackPostProc* cvCreateModuleBlobTrackPostProcTimeAverExp()

轨迹指数窗时间平均

CvBlobTrackPostProc* cvCreateModuleBlobTrackPostProcKalman()

目标方位、尺寸的Kalman滤波平滑

 

7 轨迹分析(CvBlobTrackAnalysis)

       当某个目标跟踪结束后,会产生一个轨迹,CvBlobTrackAnalysis的子类用于对轨迹进行数据分析。子类众多,这里给出六个主要的用户接口和说明。

用户调用接口:

CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistPVS();

5维矢量直方图分析(x,y,vx,vy,state)

CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistP();

2维矢量直方图分析(x,y)

CvBlobTrackAnalysis*  cvCreateModuleBlobTrackAnalysisHistPV();

4维矢量直方图分析(x,y,vx,vy)

CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisHistSS();

起始点4维矢量直方图分析(startpos,endpos)

CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisTrackDist();

目标轨迹之间比较距离

CvBlobTrackAnalysis* cvCreateModuleBlobTrackAnalysisIOR();

整合上述多种分析方法


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值