OpenCV 視頻監控(Video Surveilance)的算法體系
轉自http://lh2078.blog.163.com/blog/static/568113722010711705926/
如前面說到的,OpenCV VS提供了6組算法的接口,分別是:前景檢測、新目標檢測、目標跟蹤、軌跡生成、跟蹤後處理、軌跡分析,除了軌跡生成用於軌跡數據的保存以外,其他5個部分都是標準的視頻監控算法體系中不可或缺的部分。
OpenCV在Blob_Tracking_Modules.doc文檔中,提供了算法的關係圖,如下。
圖中唯獨缺少了軌跡分析部分,可能是因爲在該文檔形成的時候軌跡分析部分還沒有完成。重新整理後如下。
下面針對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();
整合上述多種分析方