improving background subtraction

asked 2013-03-02 10:00:51 -0500

hunter gravatar image

Hi, I am working on video processing project to detect fore ground objects. Below is a part of my code which is used to separate foreground and background.

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

In the foreground mask window I am getting lot of noise along with the actual fore ground object. Also the fulll object is note recognized as foreground. I need to bound the fore ground objects with rectangles as well. Wil BoundRect() do the job if I draw contours around in the foreground mask?...Also what are the most recommended parameter to be passed while finding contours(findcontour()) and for the BoundRect function...thanks in advance

edit retag flag offensive close merge delete