OpenCV运动检测跟踪(blob track)框架组成模块详解
在..\opencv\doc\vidsurv文件夾中有三個doc文件,Blob_Tracking_Modules、Blob_Tracking_Tests、TestSeq,其中Blob_Tracking_Modules必須需要詳讀的。
?
?
“FG/BG Detection” module performsforeground/background segmentation for each pixel.
“Blob Entering Detection” module uses theresult (FG/BG mask) of “FG/BG Detection” module to detect new blob objectentered to a scene on each frame.
“Blob Tracking” module initialized by“Blob Entering Detection” results and tracks each new entered blob.
“Trajectory Generation” module performs asaving function. It collects all blobs positions and save each whole blobtrajectory to hard disk when it finished (for example tracking is lost).
“Trajectory PostProcessing” moduleperforms a blob trajectory smoothing function. This module is optional and cannot be included in specific pipeline.
?
OpenCV所提供的這個運動物體跟蹤框架只是一個基本的框架,開發(fā)者可以根據(jù)自己的實際需要對其中的一些模塊進行自定義擴展,以滿足實際應(yīng)用中的具體要求。
?
1、? 前景檢測模塊CvFGDetector:它的輸入數(shù)據(jù)為當(dāng)前幀圖像,輸出結(jié)果數(shù)據(jù)為當(dāng)前幀圖像的前景圖像(mask)。前景圖像是一個和輸入的視頻幀具有同樣大小的二值圖像,即如果當(dāng)前幀中的像素點被判斷為運動前景,則前景掩碼中相應(yīng)位置的像素點值為1,否則,相應(yīng)的像素點值為0。
開發(fā)者需要繼承CvFGDetector類,并實現(xiàn)其中的純虛函數(shù)。其中在函數(shù)Virtual void process(IplImage *pImg){}中寫入自己開發(fā)的運動目標(biāo)檢測算法。而函數(shù)Virtual IplImage *GetMask()是得到前景檢測的結(jié)果圖像,并負(fù)責(zé)傳遞到后續(xù)的模塊中。而函數(shù)Virtual void Release()負(fù)責(zé)一些動態(tài)分配內(nèi)存的釋放。
?
2、? 新團塊檢測模塊CvBlobDetector:該模塊的作用是檢測進入監(jiān)控范圍的新目標(biāo)的位置和大小。模塊的輸入是當(dāng)前幀的前景圖像(前景檢測模塊的結(jié)果)和已經(jīng)檢測并標(biāo)定的團塊,輸出的結(jié)果是新檢測到的團塊。
開發(fā)者可以將虛類實例化,然后將自己的新團塊檢測算法寫入到相應(yīng)的函數(shù)中。
新團塊檢測模塊的處理流程為:首先從前景圖像中檢測出所有團塊,然后將較小的團塊(可能是由噪聲引起的)和與已經(jīng)被跟蹤團塊有重疊的團塊丟棄,并對剩余的團塊按照大小順序排列,只保留其中幾個比較大的團塊(默認(rèn)為10)。最后利用特定規(guī)則篩選,篩選不合標(biāo)準(zhǔn)的團塊,將真正的新團塊保存到團塊列表中。
?
3、? 團塊跟蹤模塊CvBlobTracker:該模塊的作用就是在前面兩個模塊(前景檢測模塊、新團塊檢測模塊)對運動目標(biāo)檢測的基礎(chǔ)上,實現(xiàn)對運動目標(biāo)的跟蹤。此模塊的輸入為當(dāng)前幀的前景圖像和團塊列表以及當(dāng)前幀圖像,輸出結(jié)果是當(dāng)前視頻幀中所有運動目標(biāo)的信息,以團塊表示(ID,pos,size)。使用新團塊檢測模塊的結(jié)果初始化該模塊,并跟蹤新進入的團塊。
開發(fā)者根據(jù)自己的算法開發(fā)相應(yīng)的跟蹤系統(tǒng)時,可以繼承該類,然后用自己的算法實現(xiàn)函數(shù)Virtural void process(IplImage *pImg,IplImage *pImgFG=NULL)。此虛類中還定義了許多其他的輔助處理函數(shù)接口,例如跟蹤索引或ID返回指定團塊指針的函數(shù),根據(jù)索引或ID為指定團塊設(shè)置參數(shù)函數(shù)等。
團塊跟蹤模塊的處理流程為:首先從前景圖像提取所有團塊,并計算團塊的質(zhì)心、寬度和高度;然后對每一個已被跟蹤的軌跡,利用卡爾曼濾波器預(yù)測該軌跡在當(dāng)前幀的團塊的位置和大小;最后對每個跟蹤的軌跡進行處理,尋找離上一幀里的團塊最近的當(dāng)前幀的團塊,將此團塊添加到跟蹤軌跡。
?
4、軌跡生成模塊CvBlobTrackGen:該模塊的作用是生成運動目標(biāo)的運動軌跡,然后將軌跡導(dǎo)出到指定數(shù)據(jù)庫或文件中(如.txt、.csv文件)。該模塊的輸入是代表當(dāng)前處理視頻幀中各個運動目標(biāo)的團塊,輸出結(jié)果是存儲在指定位置下的軌跡文件。該模塊主要是保存操作,它收集所有團塊的位置,并在每條軌跡結(jié)束時(例如跟蹤丟失時或者物體離開場景時)將其保存到硬盤上,同時也可以為每個團塊計算一些特征并保存。
?
5、軌跡后處理模塊CvBlobTrackPostProc:該模塊的作用是在前一個模塊所產(chǎn)生的團塊軌跡上做一些處理,例如采用Kalman濾波或平滑濾波處理等。此模塊是可選的,可以不包含在處理流程中。它的輸入是當(dāng)前處理圖像的所有團塊,輸出結(jié)果是處理后所處理圖像的團塊列表。
?
6、軌跡分析模塊CvBlobTrackAnalysis:當(dāng)某個目標(biāo)跟蹤結(jié)束后,會產(chǎn)生一個軌跡,CvBlobTrackAnalysis的子類用于對軌跡進行數(shù)據(jù)分析;
?
7、跟蹤流程模塊CvBlobTracterAuto:為了方便開發(fā)者開發(fā)自己的系統(tǒng),同時也為了保證系統(tǒng)的模塊化設(shè)計,OpenCV設(shè)計了此虛類描述整個跟蹤流程,這個代表整個跟蹤流程的虛類將各個模塊相互聯(lián)系起來成為一個有機的整體。本模塊將前面提到的五個模塊連接起來,形成一個完整的處理流程。
?????? 此類中的函數(shù)Process負(fù)責(zé)調(diào)用其它各個子模塊,首先對背景圖像進行更新并檢測前景,將獲取的前景圖像保存于成員變量m_pFG中。獲取前景圖像后,便依次調(diào)用團塊跟蹤模塊(注意:而不是新團塊檢測模塊,這樣做的主要目的是先執(zhí)行跟蹤可將當(dāng)前幀的跟蹤結(jié)果傳入新團塊檢測模塊,以提供新團塊檢測的準(zhǔn)確度。如果團塊跟蹤在后,則新團塊跟蹤模塊只能與上一幀的團塊列表進行比較,新團塊檢測的準(zhǔn)確度將會有所降低),軌跡后處理模塊,團塊檢測模塊,軌跡生成模塊,軌跡分析模塊。
?
?????? 如果想將自己實現(xiàn)的算法加入到以上模塊中也很方便,如將背景差分算法加入到前景檢測模塊中,只要繼承CvFGDetector類,然后主要在Process函數(shù)中實現(xiàn)自己的算法就可以了。
?
??? 原始代碼中,用紅色標(biāo)注運動目標(biāo)的表示跟蹤不穩(wěn)定,綠色則表示穩(wěn)定跟蹤。
?
??? 軌跡生成模塊中默認(rèn)有兩種方法實現(xiàn)數(shù)據(jù)的保存,其中一種是”RawTracks”方法,每行存放一個運動目標(biāo)數(shù)據(jù),單位為像素,依次為運動目標(biāo)出現(xiàn)的起始幀,運動目標(biāo)中心x坐標(biāo),運動目標(biāo)中心y坐標(biāo),運動目標(biāo)寬度,運動目標(biāo)高度,運動目標(biāo)中心x坐標(biāo),運動目標(biāo)中心y坐標(biāo),運動目標(biāo)寬度,運動目標(biāo)高度,……。
?
參考文獻:
1、http://www.doc88.com/p-896576154875.html
2、http://blog.csdn.net/wk119911/article/details/7664478
3、http://www.opencv.org.cn/forum/viewtopic.php?t=11128
總結(jié)
以上是生活随笔為你收集整理的OpenCV运动检测跟踪(blob track)框架组成模块详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 运动目标跟踪__kalman
 - 下一篇: 使用纯C++实现SQL Server20