Background subtraction problem [closed]
Hi I am working on a video processing project to detect foreground objects and my code to separate foreground and background is as follows :
#include "opencv2/core/core.hpp"
#include "opencv2/video/background_segm.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv/highgui.h"
#include <stdio.h>
#include <opencv2/imgproc/imgproc.hpp>
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(500,10,false);
Mat img, fgmask, fgimg;
for(;;)
{
cap >> img;
if( img.empty() )
break;
if( fgimg.empty() )
fgimg.create(img.size(), img.type());
cv::Mat framecopy;
//update the model
blur(img,framecopy, Size(10,10), Point(-1,-1) );
bg_model(framecopy, fgmask, update_bg_model ? -1 : 0);
fgimg = Scalar::all(0);
img.copyTo(fgimg, fgmask);
Mat bgimg;
bg_model.getBackgroundImage(bgimg);
/*std::vector< std::vector<cv::Point> > contours;
findContours(fgmask,contours,CV_RETR_EXTERNAL,CV_CHAIN_APPROX_SIMPLE,Point(0,0));
std::vector<Rect> boundRect( contours.size() );
for(int i=0;i<contours.size();i++)
{
if(contourArea(contours[i])>20)
boundRect[i] = boundingRect( Mat(contours[i]) );
cv::rectangle( img, boundRect[i].tl(), boundRect[i].br(), 255, 2, 8, 0 );
}*/
//erode(fgmask,fgmask,cv::Mat(50,50));
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;
}
and the resulting foregroundmask I got is :
t seems my code doesnt cover the whole object completely. Is there anyway I can improve it??
hey hunter,
thank you so much your code helped me a lot. i am looking for the same code, i think you are using gaussian mixture model.
my project is summarize videos.
as my task is to detect foreground and background of frames in video.
with the help of your code this task was completed.
i am getting error
instead of
but i am getting error "Unhandled exception at 0x00007FFAD94DCBE9 (opencv_highgui249d.dll) in dynamic.exe: 0xC0000005: Access violation reading location 0x0000000000000018" and the program breaks.
can you help me in this.