標籤:電腦視覺
前景提取和目標檢測
當觀察情境的是一個固定的相機,背景幾乎保持不變。在這種情況下,感興趣的元素是在情境中運動的物體。為了提取出這些前景物體,我們需要對背景建模,然後將當前幀的模型與背景模型進行比較,以檢測前景物體。前景提取是智能監控應用的基礎步驟。
OpenCV的video module中包含了幾種較為常用的背景減除方法,其中混合高斯模型(Gaussian of Mixture Models, GMM)方法效果較好。
常用的目標檢測方法為幀間差分和背景減除。
其中背景減除方法的關鍵在於建立一個魯棒的背景模型(背景映像),常用的建立背景模型方法有:均值法;中值法;滑動平均濾波法;單高斯;混合高斯模型;codebook等。
背景減去法
背景減去法的含義是構建一個參考圖片(純背景),將每個新的視訊框架同參考圖片相減,並進行二值化,從而得到運動前景的方法。這也就意味著,背景減去法的結果是一個對非靜態地區的一個高亮表示。構建參考圖片最簡單的方法就是將時間上連續的一系列背景圖片進行平均。這種方法有很多問題,同時,它還需要一個沒有前景出現,僅僅有純背景的一段圖片序列來作為訓練樣本。訓練之後,背景的運動以及訓練階段前景的靜止不運動,都被當做運動目標。另外,該方法無法應對情境中光線的逐漸層化。
混合高斯模型的原理
首先,混合高斯演算法對每個像素維護多個模型(即多個滑動平均值)。因此,如果背景像素在兩個值之間來回變化,那麼將儲存兩個滑動平均值。如果新的像素值不屬於其中之一,則認為它是前景值。
其次,不僅僅儲存滑動平均值,還儲存滑動方差。計算得到的均值和方差形成了一個高斯模型,通過它我們可以獲知某個像素值屬於該模型的機率。它使得確定合適的閾值變得簡單,因為現在它表現為一個機率而非差異的絕對值。同時,背景中變化較明顯的地區,前景物體需要的差值將大很多。
最後,當高斯模型的擊中頻率不夠頻繁,它會從當前的模型中移除。反之,如果一個像素值位於當前維護的背景模型之外(即它是一個前景像素),那麼新的高斯模型將被建立。如果之後它被頻繁擊中,那麼會成為背景的一部分。
理論
混合高斯背景建模是基於像素樣本統計資訊的背景表示方法,利用像素在較長時間內大量樣本值的機率密度等統計資訊(如模式數量、每個模式的均值和標準差)表示背景,然後使用統計差分(如3σ原則)進行目標像素判斷,可以對複雜動態背景進行建模,計算量較大。
在混合高斯背景模型中,認為像素之間的顏色資訊互不相關,對各像素點的處理都是相互獨立的。對於視頻映像中的每一個像素點,其值在順序圖表像中的變化可看作是不斷產生像素值的隨機過程,即用高斯分布來描述每個像素點的顏色呈現規律。
對於多峰高斯分布模型,映像的每一個像素點按不同權值的多個高斯分布的疊加來建模,每種高斯分布對應一個可能產生像素點所呈現顏色的狀態,各個高斯分布的權值和分布參數隨時間更新。當處理彩色映像時,假定映像像素點R、G、B三色通道相互獨立並具有相同的方差。
OpenCV中高斯混合模型的介面
OpenCV中實現了兩個版本的高斯混合背景/前景分割方法。
BackgroundSubtractorMOG
建構函式可以使用預設建構函式或帶形參的建構函式:
BackgroundSubtractorMOG::BackgroundSubtractorMOG()BackgroundSubtractorMOG::BackgroundSubtractorMOG(int history, int nmixtures, double backgroundRatio, double noiseSigma=0)
其中history為使用曆史幀的數目,nmixtures為混合高斯數量,backgroundRatio為背景比例,noiseSigma為雜訊權重。
調用的介面只有重載操作符():
void BackgroundSubtractorMOG::operator()(InputArray image, OutputArray fgmask, double learningRate=0)
其中image為當前幀映像,fgmask為輸出的前景mask,learningRate為背景學習速率。
BackgroundSubtractorMOG2
建構函式可以使用預設建構函式或帶形參的建構函式:
BackgroundSubtractorMOG2::BackgroundSubtractorMOG2() BackgroundSubtractorMOG2::BackgroundSubtractorMOG2(int history,float varThreshold, bool bShadowDetection=true)
history同上,為使用曆史幀的數目;varThreshold表示馬氏平方距離上使用的來判斷是否為背景的閾值(此值不影響背景更新速率);bShadowDetection表示是否使用陰影檢測(如果開啟陰影檢測,則mask中使用127表示陰影)。
使用重載操作符()調用每幀檢測函數:
void BackgroundSubtractorMOG2::operator()(InputArray image, OutputArray fgmask, double learningRate=-1)
參數意義同BackgroundSubtractorMOG中的operator()函數。
同時BackgroundSubtractorMOG2提供了getBackgroundImage()函數用以返回背景映像:
void BackgroundSubtractorMOG2::getBackgroundImage(OutputArray backgroundImage)
範例程式碼
int main(){ VideoCapture video(0); Mat frame,mask,thresholdImage, output; BackgroundSubtractorMOG2 bgSubtractor(20,16,true); namedWindow("background"); while(true){ video>>frame; bgSubtractor(frame,mask,0.001); imshow("background",mask); char c = (char)waitKey(20); if( c == 27 ) break; } return 0; }
參考資料
混合高斯背景模型及opencv實現
OpenCV中的混合高斯演算法原理
轉載請註明作者Jason Ding及其出處
GitCafe部落客頁(http://jasonding1354.gitcafe.io/)
Github部落客頁(http://jasonding1354.github.io/)
CSDN部落格(http://blog.csdn.net/jasonding1354)
簡書首頁(http://www.jianshu.com/users/2bd9b48f6ea8/latest_articles)
百度搜尋jasonding1354進入我的部落客頁
【電腦視覺】提取視頻中的前景物體