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