Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

BackgroundSubstract

Hi All,

i have tried below example for substracting Image's background, its working well and updates position of the object but for the first time after camera starts if i move an object its initial position is not getting erased. i have attached image for your reference, what am i missing to clear that Initial Position of Original object. Here's my code:

//opencv
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/background_segm.hpp>
#include <opencv2/video/video.hpp>
//C++
#include <iostream>
#include <sstream>
//namespace
using namespace cv;
using namespace std;

//global variables
Mat frame; //current frame
Mat fgMaskMOG; //fg mask generated by MOG method
Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method
Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor
Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractor
int keyboard;

//function declarations
void processVideo(/*char* videoFilename*/);

int main(int argc, char* argv[])
{
//print help information
//help();
//create GUI windows
namedWindow("Frame");
namedWindow("FG Mask MOG");
namedWindow("FG Mask MOG 2");

//create Background Subtractor objects
pMOG = new BackgroundSubtractorMOG(); //MOG approach
pMOG2 = new BackgroundSubtractorMOG2(); //MOG2 approach

//input data coming from a video
processVideo(/*argv[1]*/);

//destroy GUI windows
destroyAllWindows();
return EXIT_SUCCESS;
}

void processVideo(/*string* videoFilename*/) 
{
//create the capture object
VideoCapture capture/*(videoFilename)*/;
capture.open(0);
if(!capture.isOpened()){
    //error in opening the video input
    cerr << "Unable to open video file: " /*<< videoFilename*/ << endl;
    exit(EXIT_FAILURE);
}
//read input data. ESC or 'q' for quitting
while( (char)keyboard != 'q' && (char)keyboard != 27 ){
    //read the current frame
    if(!capture.read(frame)) {
        cerr << "Unable to read next frame." << endl;
        cerr << "Exiting..." << endl;
        exit(EXIT_FAILURE);
    }
    //update the background model
    pMOG->operator()(frame, fgMaskMOG);
    pMOG2->operator()(frame, fgMaskMOG2);
    //get the frame number and write it on the current frame
    stringstream ss;
    rectangle(frame, cv::Point(10, 2), cv::Point(100,20),
        cv::Scalar(255,255,255), -1);
    ss << capture.get(CV_CAP_PROP_POS_FRAMES);
    string frameNumberString = ss.str();
    putText(frame, frameNumberString.c_str(), cv::Point(15, 15),
        FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0));
    //show the current frame and the fg masks
    imshow("Frame", frame);
    imshow("FG Mask MOG", fgMaskMOG);
    imshow("FG Mask MOG 2", fgMaskMOG2);
    //get the input from the keyboard
    keyboard = waitKey( 30 );
}
//delete capture object
capture.release();
}

Here's my Image:

image description

BackgroundSubstract

Hi All,

i have tried below example for substracting to subtract Image's background, its working well and updates position of the object but for the first time after i mean when camera starts if i move an object from its initial position to some other position, its initial position Blob is not getting erased. i have attached image for your reference, what am i missing to clear that Initial Position of Original object. Here's my code:

//opencv
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/video/background_segm.hpp>
#include <opencv2/video/video.hpp>
//C++
#include <iostream>
#include <sstream>
//namespace
using namespace cv;
using namespace std;

//global variables
Mat frame; //current frame
Mat fgMaskMOG; //fg mask generated by MOG method
Mat fgMaskMOG2; //fg mask fg mask generated by MOG2 method
Ptr<BackgroundSubtractor> pMOG; //MOG Background subtractor
Ptr<BackgroundSubtractor> pMOG2; //MOG2 Background subtractor
int keyboard;

//function declarations
void processVideo(/*char* videoFilename*/);
processVideo();

int main(int argc, char* argv[])
{
//print help information
//help();
//create GUI windows
namedWindow("Frame");
namedWindow("FG Mask MOG");
namedWindow("FG Mask MOG 2");

//create Background Subtractor objects
pMOG = new BackgroundSubtractorMOG(); //MOG approach
pMOG2 = new BackgroundSubtractorMOG2(); //MOG2 approach

//input data coming from a video
processVideo(/*argv[1]*/);
processVideo();

//destroy GUI windows
destroyAllWindows();
return EXIT_SUCCESS;
}

void processVideo(/*string* videoFilename*/) processVideo() 
{
//create the capture object
VideoCapture capture/*(videoFilename)*/;
capture;
capture.open(0);
if(!capture.isOpened()){
    //error in opening the video input
    cerr << "Unable to open video file: Camera " /*<< videoFilename*/ << endl;
    exit(EXIT_FAILURE);
}
//read input data. ESC or 'q' for quitting
while( (char)keyboard != 'q' && (char)keyboard != 27 ){
    //read the current frame
    if(!capture.read(frame)) {
        cerr << "Unable to read next frame." << endl;
        cerr << "Exiting..." << endl;
        exit(EXIT_FAILURE);
    }
    //update the background model
    pMOG->operator()(frame, fgMaskMOG);
    pMOG2->operator()(frame, fgMaskMOG2);
    //get the frame number and write it on the current frame
    stringstream ss;
    rectangle(frame, cv::Point(10, 2), cv::Point(100,20),
        cv::Scalar(255,255,255), cv::Point(100,20),cv::Scalar(255,255,255), -1);
    ss << capture.get(CV_CAP_PROP_POS_FRAMES);
    string frameNumberString = ss.str();
    putText(frame, frameNumberString.c_str(), cv::Point(15, 15),
         FONT_HERSHEY_SIMPLEX, 0.5 , cv::Scalar(0,0,0));
    //show the current frame and the fg masks
    imshow("Frame", frame);
    imshow("FG Mask MOG", fgMaskMOG);
    imshow("FG Mask MOG 2", fgMaskMOG2);
    //get the input from the keyboard
    keyboard = waitKey( 30 );
}
//delete capture object
capture.release();
}

Here's my Image:

image description