OpenCV 視頻監控(Video Surveilance)的算法體系

轉自http://www.cnblogs.com/wly603/
      http://lh2078.blog.163.com/blog/static/568113722010711705926/
    OpenCV VS與普通OpenCV函數不同在於:普通cxcore、cv函數均是C函數,而VS是利用C++的接口、多態、繼承等技術構建起來的體系,由一些類、結構、全局函數組成。所以要學習和使用VS,要有較強的C++基礎。“勿在浮沙築高臺”,如果不懂接口、多態、繼承等C++的基本技術,還是去惡補一下再回來。
OpenCV 視頻監控(Video Surveilance)的架構 - 海水和火焰 - 視頻監控 形態學 OpenCV
    VS中的很多類並沒有直接提供給用戶使用,多數只提供一個全局函數作爲唯一的用戶接口,這種思想也大量應用於COM技術中,是模式設計中類工廠的思想。感興趣的讀者可以查閱模式設計方面的圖書和資料。
OpenCV 視頻監控(Video Surveilance)的架構 - 海水和火焰 - 視頻監控 形態學 OpenCV
OpenCV 視頻監控(Video Surveilance)的算法體系 - 海水和火焰 - 視頻監控 形態學 OpenCV
 

    打開opencv.dsw工程,可以在CVAUX下看到許多結構和類定義,VS部件多數以CvBlob開頭,如圖所示。這麼龐雜的數據結構和類,理清頭緒並不是一件容易的事情。我簡單的歸納了一個UML圖,雖然有很多不完善,但是可以方便讀者們從全局看清VS的架構。
類似於MFC中的CObject,VS中的所有的類都有一個共同的父類CvVSModule,主要提供參數的讀寫、拷貝等功能。另外還有幾個算法接口類,分別是:CvFGDetector,CvBlobDetector ,CvBlobTracker,CvBlobTrackGen,CvBlobTrackPostProc,CvBlobTrackAnalysis,分別代表:前景檢測、新目標檢測、目標跟蹤、軌跡生成、跟蹤後處理、軌跡分析等幾組算法的接口,這些類是絕大多數VS類的父類。另外還有一個CvBlobTrackerAuto接口,其功能是對以上算法的鏈接、調度,即對整個算法流程的控制。
如前面說到的,OpenCV VS提供了6組算法的接口,分別是:前景檢測、新目標檢測、目標跟蹤、軌跡生成、跟蹤後處理、軌跡分析,除了軌跡生成用於軌跡數據的保存以外,其他5個部分都是標準的視頻監控算法體系中不可或缺的部分。
       OpenCV在Blob_Tracking_Modules.doc文檔中,提供了算法的關係圖,如下。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.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()函數中調用這些函數,初始化函數參數以及各種變量。 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章