轉自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()函數中調用這些函數,初始化函數參數以及各種變數。