簡體   English   中英

如何使用OpenCV BackgroundSubtractorMOG2獲取移動對象的掩碼

[英]How to get moving object's mask using OpenCV BackgroundSubtractorMOG2

我想屏蔽視頻中的移動物體。 我發現OpenCV有一些內置的BackgroundSubtractors可以節省我的時間。 但是,根據官方參考 ,功能:

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;
}

輸出視頻的快照是: 在此輸入圖像描述

ps我的工作環境是OSX 10.8上的OpenCV2.4.3和帶有Apple LLVM編譯器4.1的XCode 4.5.2。

如果你想獲得前景中充滿白色像素的整個物體,那么我會請你告訴我一些你的經歷。

我的問題是,對於上面提到的代碼,當你在相機前產生更多動作時,你會得到更多的白色像素嗎?

如果是,則有兩個參數可供您了解。

首先是History參數。 你在構造函數BackgroundSubtractorMOG2中配置為30 (30,16.0,false); 您可以通過incresing測試此參數,比如說300.它將保持對象在前景中的運動歷史。 因此,如果您已經完全從300幀內的起始位置移動,那么您可以根據需要獲得覆蓋有白色像素的整個對象。 但它會逐漸被抹去。 所以它不能給你100%的解決方案。

第二個參數稱為學習率。 在你提到的代碼中bg(frame,fmask,-1); 其中-1是你的學習率。 您可以將其設置為0.0到1.0,默認值為-1。 當您將其設置為0時,您將獲得所需的對象,這些對象不是視頻開頭的幀的一部分。 你可以將這種對象稱為“異物”。 您將獲得覆蓋有白色像素的異物。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM