我正在處理視頻處理項目以檢測前景物體。下面是我用來分離前景和背景的代碼的一部分。改善背景減法
#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;
}
在前景蒙板窗口中,我收到很多噪音以及實際的前景物體。另外,fulll對象被識別爲前景。我還需要用矩形限制前景地物。 Wil BoundRect()如果我在前景蒙板中繪製輪廓,還能做什麼工作?...還有什麼是在查找輪廓(findcontour())和BoundRect函數時要傳遞的最推薦的參數......預先感謝
如果圖像中有噪聲(如每個視頻中),最簡單的解決方案是運行某種高斯模糊。 我不明白這個部分:「另外fulll對象被認爲是前景」,你是什麼意思..你需要稍微更清楚一點。 – OopsUser 2013-03-03 20:57:47
我的意思是這樣的:http://answers.opencv.org/upfiles/13623024413088434.png – hunter 2013-03-08 01:48:12