2012-11-28 82 views
3

我想遮罩視頻中的移動物體。 我發現OpenCV有一些內置的BackgroundSubtractors,這可能會節省很多時間。然而,根據official reference,功能:如何使用OpenCV獲取移動物體的遮罩BackgroundSubtractorMOG2

void BackgroundSubtractorMOG2::operator()(InputArray image, OutputArray fgmask, double learningRate=-1) 

應輸出面具,fgmask,但事實並非如此。在調用上述方法之後,fgmask變量將包含「掩碼的輪廓」。這很奇怪。我只想要一個簡單的封閉區域,用白色填充(例如)來表示移動的物體。我怎麼能這樣做?

任何回覆或建議將非常感激。非常感謝。

這裏是我的代碼:

int main(int argc, char *argv[]) 
{ 
    cv::BackgroundSubtractorMOG2 bg = BackgroundSubtractorMOG2(30,16.0,false); 
    cv::VideoCapture cap(0); 
    cv::Mat frame, mask, _frame, _fmask; 
    cvNamedWindow("mask", CV_WINDOW_AUTOSIZE); 
    for(;;) 
    { 
     cap >> frame; 
     bg(frame,fmask,-1); 

     _frame = IplImage(frame); 
     _fmask = IplImage(fmask); 

     cvShowImage("mask", &_fmask); 
     if(cv::waitKey(30) >= 0) break; 
    } 
    return 0; 
} 

輸出視頻的快照是: enter image description here

附:我的工作環境是OSX 10.8上的OpenCV2.4.3和蘋果LLVM編譯器4.1的XCode 4.5.2。

回答

8

如果您想要獲取前景中充滿白色像素的整個物體,那麼我會請您告訴我一些關於您的體驗的內容。

我的問題是,對於上面提到的代碼,當您在相機前生成更多運動時,是否會獲得更多的白色像素?

如果是,那麼有兩個參數可以瞭解您的需求。

首先是歷史參數。您在構造函數中配置爲30 BackgroundSubtractorMOG2(30,16.0,false);。你可以通過增加300來測試這個參數。它將保持對象在前景中的運動歷史。所以如果你在300幀內完全從你的起始位置移動,那麼你會得到整個物體覆蓋白色像素,只要你想。但它會逐漸消失。所以它不能給你100%的解決方案。

第二個參數叫做學習率。在你提到的代碼bg(frame,fmask,-1);其中-1是你的學習率。你可以將它設置爲0.0到1.0,默認值是-1。當你將它設置爲0時,你會得到你想要的不是視頻開始幀的一部分的對象。你可以稱這種對象爲「異物」。你會得到白色像素覆蓋的異物。

從我上面提到的信息探索您的測試並分享您的體驗。