本例是从一段视频中,获取背景,去掉前景物体。思路是,N帧叠加再取平均值,只要N足够,即可以消除前景物体。
#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/nonfree/features2d.hpp"
#include "opencv2/highgui.hpp"
using namespace cv;
using namespace std;
void OverlayMat(Mat& src, unsigned int iBgk[240][960])
{
int nRows = 240;
int nCols = 320 * 3;
for (int i = 0; i < nRows; ++i)
{
uchar* p = src.ptr<uchar>(i);
for (int j = 0; j < nCols; ++j)
{
iBgk[i][j] += p[j];
}
}
}
int main(int argi, char** argv)
{
printf("start!\n");
VideoCapture cap;
cap.open(argv[1]);
if (!cap.isOpened())
{
printf("open file fail!\n");
return -1;
}
printf("open file success!\n");
Mat prevgray, gray, flow, cflow, frame;
Mat bkg(240, 320, CV_8UC3);
unsigned int iBkg[240][960] = { 0 };
namedWindow