轉自http://www.cnblogs.com/wly603/
http://lh2078.blog.163.com/blog/static/568113722010711705926/
OpenCV VS與普通OpenCV函數不同在於:普通cxcore、cv函數均是C函數,而VS是利用C++的接口、多態、繼承等技術構建起來的體系,由一些類、結構、全局函數組成。所以要學習和使用VS,要有較強的C++基礎。“勿在浮沙築高臺”,如果不懂接口、多態、繼承等C++的基本技術,還是去惡補一下再回來。
VS中的很多類並沒有直接提供給用戶使用,多數只提供一個全局函數作爲唯一的用戶接口,這種思想也大量應用於COM技術中,是模式設計中類工廠的思想。感興趣的讀者可以查閱模式設計方面的圖書和資料。
打開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文檔中,提供了算法的關係圖,如下。
圖中唯獨缺少了軌跡分析部分,可能是因爲在該文檔形成的時候軌跡分析部分還沒有完成。重新整理後如下。
下面針對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()函數中調用這些函數,初始化函數參數以及各種變量。