下面针对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.Detector(虚类):实现前景检测,
2.团块检测模块(CvBlobDetector虚类):实现运动物体(团块)的的检测 3.团块跟踪模块(CvBlobTracker虚类):实现运动物体跟踪 4.团块运动轨迹产生模块(CvBlobTrackGen虚类):实现的功能与模块名字同(下同) 5.团块轨迹后处理模块(CvBlobTrackPostProc虚类) 6.团块轨迹分析模块(CvBlobTrackAnalysis虚类) 7.以及处理流程模块(cvBlobTrackerAuto虚类):此模块可看成胶水,集成上面的模块。 除了处理流程模块(因为它只控制流程呀~),每一个模块可以用多种算法实现,在程序中,这些算法就是函数。如(15-16行): CvFGDetector* cvCreateFGDetector0() CvFGDetector* cvCreateFGDetector0Simple() CvFGDetector* cvCreateFGDetector1() 也就是说这三个函数都是能完成前景检测,具体用哪个,由你在main()函数中调用。 其他模块也是这样。 实现这些模块的类以及完成这些算法的函数都由OPENCV帮你实现了,blobtrack要做的就是在main()函数中调用这些函数,初始化函数参数以及各种变量。