background
#include "stdafx.h"
#include "targetver.h"
#include "opencv2/opencv.hpp"
#include "opencv/cxcore.hpp"
#include "opencv/highgui.h"
#include <Windows.h>
#include<video/video.hpp>
using namespace cv;
using namespace std;
void bgsub(char *);
int main(int argc, char* argv[]) {
bgsub("bgs-사람들");
return 0;
}
void bgsub(char* wcam) {
Mat frame, fg, bg, dfg;
boolean stop(false), detectShadow = true; // 그림자를 찾아준다.
int history = 500, keyboard;
vector<vector<Point>>contours; // 내부의 벡터는 한사람의 테두리
namedWindow(wcam, CV_WINDOW_AUTOSIZE);
moveWindow(wcam, 100, 100);
namedWindow("BG");
namedWindow("FG");
namedWindow("dFG");
// video capture & bg-model
VideoCapture cap("pedestrian-epfl-campus.avi");
if (!cap.isOpened()) return;
int wide = (int)cap.get(CV_CAP_PROP_FRAME_WIDTH);
int high = (int)cap.get(CV_CAP_PROP_FRAME_HEIGHT);
// create a background subtractor 백그라운드 객체 만들기
Ptr<BackgroundSubtractor> pMOG2;
//pMOG2 = createBackgroundSubtractorMOG2(history, 16, detectShadow);
BackgroundSubtractorMOG2 mog2(history, 16, detectShadow); // 윗줄이 안되기 때문에
pMOG2 = &mog2;
// loop
while (!stop) {
if (!cap.read(frame)) {
cerr << "frame read err" << endl;
exit(EXIT_FAILURE);
}
//update background & get fg
//pMOG2->apply(frame, fg);
pMOG2 ->operator()(frame, fg, 0.01);// 그림자 값을 둘수 있다.
erode(fg, fg, Mat());
dilate(fg, fg, Mat()); // 잡음 제거
//++show contours
findContours(fg, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);
drawContours(frame, contours, -1, Scalar(0, 0, 255), 2); // 칼라 이미지에 테두리를 그려라
imshow(wcam, frame); moveWindow(wcam, 100, 100);
imshow("FG", fg); moveWindow("FG", 100 + (wide + 16), 100);
//imshow("BG", bg); moveWindow("BG", 100 + (wide + 16)+ (wide + 16), 100);
//+++ show background
pMOG2->getBackgroundImage(bg);
imshow("BG", bg); moveWindow("BG", 100 + (wide + 16) * 2, 100);
absdiff(frame, bg, dfg); // frame 와 bg를 뺀다. 그리곤 절대값을 취해서 양수로
imshow("dFG", dfg); moveWindow("dFG", 100 + (wide + 16) * 3, 100);
if (waitKey(1) >= 0) stop = true;
}
cap.release();
}
결과 영상