背景建模与前景检测1(Background Generation And Foreground Detection)
背景建模與前景檢測(Background Generation And Foreground Detection)
作者:王先榮
前言
??? 在很多情況下,我們需要從一段視頻或者一系列圖片中找到感興趣的目標(biāo),比如說當(dāng)人進(jìn)入已經(jīng)打烊的超市時(shí)發(fā)出警報(bào)。為了達(dá)到這個(gè)目的,我們首先需要“學(xué)習(xí)”背景模型,然后將背景模型和當(dāng)前圖像進(jìn)行比較,從而得到前景目標(biāo)。
背景建模
??? 背景與前景都是相對(duì)的概念,以高速公路為例:有時(shí)我們對(duì)高速公路上來來往往的汽車感興趣,這時(shí)汽車是前景,而路面以及周圍的環(huán)境是背景;有時(shí)我們僅僅對(duì)闖入高速公路的行人感興趣,這時(shí)闖入者是前景,而包括汽車之類的其他東西又成了背景。背景建模的方式很多,或高級(jí)或簡單。不過各種背景模型都有自己適用的場合,即使是高級(jí)的背景模型也不能適用于任何場合。下面我將逐一介紹OpenCv中已經(jīng)實(shí)現(xiàn),或者在《學(xué)習(xí)OpenCv》這本書中介紹的背景建模方法。
1.幀差
??? 幀差可說是最簡單的一種背景模型,指定視頻中的一幅圖像為背景,用當(dāng)前幀與背景進(jìn)行比較,根據(jù)需要過濾較小的差異,得到的結(jié)果就是前景了。OpenCv中為我們提供了一種動(dòng)態(tài)計(jì)算閥值,然后用幀差進(jìn)行前景檢測的函數(shù)——cvChangeDetection(注:EmguCv中沒有封裝cvChangeDetection,我將其聲明到OpenCvInvoke類中,具體實(shí)現(xiàn)見文末代碼)。而通過對(duì)兩幅圖像使用減法運(yùn)算,然后再用指定閥值過濾的方法在《學(xué)習(xí)OpenCv》一書中有詳細(xì)的介紹。它們的實(shí)現(xiàn)代碼如下:
對(duì)于類似無人值守的倉庫防盜之類的場合,使用幀差效果估計(jì)很好。
2.背景統(tǒng)計(jì)模型
??? 背景統(tǒng)計(jì)模型是:對(duì)一段時(shí)間的背景進(jìn)行統(tǒng)計(jì),然后計(jì)算其統(tǒng)計(jì)數(shù)據(jù)(例如平均值、平均差分、標(biāo)準(zhǔn)差、均值漂移值等等),將統(tǒng)計(jì)數(shù)據(jù)作為背景的方法。OpenCv中并未實(shí)現(xiàn)簡單的背景統(tǒng)計(jì)模型,不過在《學(xué)習(xí)OpenCv》中對(duì)其中的平均背景統(tǒng)計(jì)模型有很詳細(xì)的介紹。在模仿該算法的基礎(chǔ)上,我實(shí)現(xiàn)了一系列的背景統(tǒng)計(jì)模型,包括:平均背景、均值漂移、標(biāo)準(zhǔn)差和標(biāo)準(zhǔn)協(xié)方差。對(duì)這些統(tǒng)計(jì)概念我其實(shí)不明白,在維基百科上看了好半天 -_-
調(diào)用背景統(tǒng)計(jì)模型很簡單,只需4步而已:
BackgroundStatModelBase<Bgr> bgModel = new BackgroundStatModelBase<Bgr>(BackgroundStatModelType.AccAvg);
//(2)更新一段時(shí)間的背景圖像,視情況反復(fù)調(diào)用(2)
bgModel.Update(image);
//(3)設(shè)置當(dāng)前幀
bgModel.CurrentFrame = currentFrame;
//(4)得到背景或者前景
Image<Gray,Byte> imageForeground = bgModel.ForegroundMask;
背景統(tǒng)計(jì)模型的實(shí)現(xiàn)代碼如下:
實(shí)現(xiàn)背景統(tǒng)計(jì)模型?
3.編碼本背景模型
??? 編碼本的基本思路是這樣的:針對(duì)每個(gè)像素在時(shí)間軸上的變動(dòng),建立多個(gè)(或者一個(gè))包容近期所有變化的Box(變動(dòng)范圍);在檢測時(shí),用當(dāng)前像素與Box去比較,如果當(dāng)前像素落在任何Box的范圍內(nèi),則為背景。
??? 在OpenCv中已經(jīng)實(shí)現(xiàn)了編碼本背景模型,不過實(shí)現(xiàn)方式與《學(xué)習(xí)OpenCv》中提到的方式略有不同,主要有:(1)使用單向鏈表來容納Code Element;(2)清除消極的Code Element時(shí),并未重置t。OpenCv中的以下函數(shù)與編碼本背景模型相關(guān):
cvCreateBGCodeBookModel? 建立背景模型
cvBGCodeBookUpdate?????? 更新背景模型
cvBGCodeBookClearStale?? 清除消極的Code Element
cvBGCodeBookDiff???????? 計(jì)算得到背景與前景(注意:該函數(shù)僅僅設(shè)置背景像素為0,而對(duì)前景像素未處理,因此在調(diào)用前需要將所有的像素先置為前景)
cvReleaseBGCodeBookModel 釋放資源
??? 在EmguCv中只實(shí)現(xiàn)了一部分編碼本背景模型,在類BGCodeBookModel<TColor>中,可惜它把cvBGCodeBookDiff給搞忘記了 -_-
下面的代碼演示了如果使用編碼本背景模型:
?
4.高級(jí)背景統(tǒng)計(jì)模型
??? 在OpenCv還實(shí)現(xiàn)了兩種高級(jí)的背景統(tǒng)計(jì)模型,它們?yōu)閯e是:(1)FGD——復(fù)雜背景下的前景物體檢測(Foreground object detection from videos containing complex background);(2)MOG——高斯混合模型(Mixture Of Gauss)。包括以下函數(shù):
CvCreateFGDetectorBase? 建立前景檢測對(duì)象
CvFGDetectorProcess???? 更新前景檢測對(duì)象
CvFGDetectorGetMask???? 獲取前景
CvFGDetectorRelease???? 釋放資源
??? EmguCv將其封裝到類FGDetector<TColor>中。我個(gè)人覺得OpenCv在實(shí)現(xiàn)這個(gè)模型的時(shí)候做得不太好,因?yàn)樗鼘⒈尘敖:颓熬皺z測糅合到一起了,無論你是否愿意,在建模的過程中也會(huì)檢測前景,而只希望前景檢測的時(shí)候,同時(shí)也會(huì)建模。我比較喜歡將背景建模和前景檢測進(jìn)行分離的設(shè)計(jì)。
調(diào)用的過程很簡單,代碼如下:
?
前景檢測
??? 在建立好背景模型之后,通過對(duì)當(dāng)前圖像及背景的某種比較,我們可以得出前景。在上面的介紹中,已經(jīng)包含了對(duì)前景的代碼,在此不再重復(fù)。一般情況下,得到的前景包含了很多噪聲,為了消除噪聲,我們可以對(duì)前景圖像進(jìn)行開運(yùn)算及閉運(yùn)算,然后再丟棄比較小的輪廓。
本文的代碼
本文代碼??? 另外,細(xì)心的讀者發(fā)現(xiàn)我忘記貼OpenCvInvoke類的實(shí)現(xiàn)代碼了,這里補(bǔ)上。多謝指正。
OpenCvInvoke實(shí)現(xiàn)代碼?
?
后記
?? ?值得注意的是,本文提到的OpenCv函數(shù)目前屬于CvAux系列,以后也許會(huì)加入到正式的圖像處理Cv系列,也許以后會(huì)消失。最重要的是它們還沒有正式的文檔。
??? 其實(shí)關(guān)于背景模型的方法還有很多,比如《Video-object segmentation using multi-sprite background subtraction》可以在攝像機(jī)運(yùn)動(dòng)的情況下建立背景,《Nonparametric background generation》利用mean-shift算法處理動(dòng)態(tài)的背景模型,如果我的時(shí)間和能力允許,也許會(huì)去嘗試實(shí)現(xiàn)它們。另外,《Wallflower: Principles and practice of background maintenance》比較了各種背景建模方式的差異,我希望能夠嘗試翻譯出來。
????感謝您耐心看完本文,希望對(duì)您有所幫助。
總結(jié)
以上是生活随笔為你收集整理的背景建模与前景检测1(Background Generation And Foreground Detection)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BRISK
- 下一篇: 背景建模与前景检测2(Backgroun