c++opencvopencv3.1background-subtraction

background subtractor for opencv=3.1.0


//cv::BackgroundSubtractorMOG2 bg = cv::BackgroundSubtractorMOG2();
cv::Ptr< BackgroundSubtractorMOG2 >createBackgroundSubtractorMOG2();
bg.set("history", 1000);
bg.set("nmixtures", 3);
bg.set("backgroundRatio", 0.7);
bg.set("detectShadows", false);

//background subtractor for the filterTotalBackground results
//cv::BackgroundSubtractorMOG2 bg2 = cv::BackgroundSubtractorMOG2();
Ptr< BackgroundSubtractorMOG2  >createBackgroundSubtractorMOG2 ();
bg2.set("history", 1000);
bg2.set("nmixtures", 3);
bg2.set("backgroundRatio", 0.7);
bg2.set("detectShadows", false);

need to use this in a single code but I'm in confusion to where to declare bg and bg2 in the above shown code.the earlier commented lines are giving me errors.so if anyone could suggest a feasible solution, then it would be a great help

bg->operator()(total, fore); //error is here

//Computes a background image.
//C++: void BackgroundSubtractor::getBackgroundImage(OutputArray backgroundImage) const¶
bg->getBackgroundImage(back);


//find the moving objects in the frame and cv::erode the image
bg2->operator()(frame, fore2);    //error is here
bg2->getBackgroundImage(back2);
cv::erode(fore2, fore2, cv::Mat());

Solution

  • You must use the -> operator to get the cv::BackgroundSubtractorMOG2 object.

    cv::Ptr<cv::BackgroundSubtractorMOG2> bg = cv::createBackgroundSubtractorMOG2();
    bg->setHistory(1000);
    bg->setNMixtures(3);
    bg->setBackgroundRatio(0.7);
    bg->setDetectShadows(false);
    

    Another error:

    You must change:

    bg->operator()(frame, fore);
    

    to

    bg->apply(frame, fore);
    

    I see that you are using an old tutorial, you could use this tutorial