2013-03-02 96 views
0

我正在處理視頻處理項目以檢測前景物體。下面是我用來分離前景和背景的代碼的一部分。改善背景減法

#include "opencv2/core/core.hpp" 
#include "opencv2/video/background_segm.hpp" 
#include "opencv2/highgui/highgui.hpp" 
#include <stdio.h> 

using namespace std; 
using namespace cv; 


//this is a sample for foreground detection functions 
int main(int argc, const char** argv) 
{ 


    VideoCapture cap; 
    bool update_bg_model = true; 

    cap.open(0); 


    if(!cap.isOpened()) 
    { 
     printf("can not open camera or video file\n"); 
     return -1; 
    } 

    namedWindow("image", CV_WINDOW_NORMAL); 
    namedWindow("foreground mask", CV_WINDOW_NORMAL); 
    namedWindow("foreground image", CV_WINDOW_NORMAL); 
    namedWindow("mean background image", CV_WINDOW_NORMAL); 

    BackgroundSubtractorMOG2 bg_model; 
    Mat img, fgmask, fgimg; 

    for(;;) 
    { 
     cap >> img; 

     if(img.empty()) 
      break; 

     if(fgimg.empty()) 
      fgimg.create(img.size(), img.type()); 

     //update the model 
     bg_model(img, fgmask, update_bg_model ? -1 : 0); 

     fgimg = Scalar::all(0); 
     img.copyTo(fgimg, fgmask); 

     Mat bgimg; 
     bg_model.getBackgroundImage(bgimg); 

     imshow("image", img); 
     imshow("foreground mask", fgmask); 
     imshow("foreground image", fgimg); 
     if(!bgimg.empty()) 
      imshow("mean background image", bgimg); 

     char k = (char)waitKey(30); 
     if(k == 27) break; 
     if(k == ' ') 
     { 
      update_bg_model = !update_bg_model; 
      if(update_bg_model) 
       printf("Background update is on\n"); 
      else 
       printf("Background update is off\n"); 
     } 
    } 

    return 0; 
} 

在前景蒙板窗口中,我收到很多噪音以及實際的前景物體。另外,fulll對象被識別爲前景。我還需要用矩形限制前景地物。 Wil BoundRect()如果我在前景蒙板中繪製輪廓,還能做什麼工作?...還有什麼是在查找輪廓(findcontour())和BoundRect函數時要傳遞的最推薦的參數......預先感謝

+0

如果圖像中有噪聲(如每個視頻中),最簡單的解決方案是運行某種高斯模糊。 我不明白這個部分:「另外fulll對象被認爲是前景」,你是什麼意思..你需要稍微更清楚一點。 – OopsUser 2013-03-03 20:57:47

+0

我的意思是這樣的:http://answers.opencv.org/upfiles/13623024413088434.png – hunter 2013-03-08 01:48:12

回答

2

答案太晚,但我希望這可以幫助別人。

以像素完美的方式在視頻中分離前景和背景(對背景沒有任何限制)是一個非常困難的問題。許多研究工作已經進入這個領域,並且還有範圍。所以簡單的gaussians混合(就像BackgroundSubtractorMOG2一樣)可能不會給你非常準確的結果。噪聲幾乎是不可避免的,因爲MOG的決定是基於色彩線索的,並且背景中的一些像素可能適合由它製成的高斯模型。

您以前景形式獲得的這些像素實際上代表了變化。因此,如果您修改背景模型的學習率,您可以密切跟蹤正在移動的像素。如果您可以在假設您的背景相當靜止的情況下工作,則移動像素將代表您的前景,並且可以在一定程度上幫助您解決問題。

我也建議在openCV中使用BackgroundSubtractorGMG函數。此功能從前幾個(可設置的數量)幀中學習背景模型。如果可能的話,讓前幾幀爲前景。你可能會取得不錯的成績。