#include <QtCore/QCoreApplication>
#include <cv.h>
#include <highgui.h>
#include <cxcore.h>
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
IplImage* pFrame = NULL;
IplImage* pBkImg = NULL;
IplImage* pFrImg = NULL;
CvMat* pFrameMat = NULL;
CvMat* pFrMat = NULL;
CvMat* pBkMat = NULL;
CvArr* pFrameArr = NULL;
CvCapture* capture = NULL;
int nFrameNo = 0;
cvNamedWindow("video", 1);
cvNamedWindow("background",1);
cvNamedWindow("foreground",1);
if( !(capture = cvCaptureFromFile("001-bg-01-000.avi")))
{
cout<<"the video is something wrong!"<<endl;
return 0;
}
while(pFrame = cvQueryFrame(capture))
{
nFrameNo++;
int width = pFrame->width;
int height = pFrame->height;
if(nFrameNo == 1)//初始化
{
pBkImg = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
pFrImg = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
pFrameMat = cvCreateMat(height,width,CV_32FC1);
pFrMat = cvCreateMat(height,width,CV_32FC1);
pBkMat = cvCreateMat(height,width,CV_32FC1);
cvCvtColor(pFrame,pBkImg,CV_BGR2GRAY);
cvCvtColor(pFrame,pFrImg,CV_BGR2GRAY);
cvConvert(pFrImg,pFrameMat);
cvConvert(pFrImg,pFrMat);
cvConvert(pFrImg,pBkMat);
}
else
{
cvCvtColor(pFrame,pFrImg,CV_BGR2GRAY);
cvConvert(pFrImg,pFrameMat);
cvAbsDiff(pFrameMat,pBkMat,pFrMat);
cvThreshold(pFrMat,pFrImg,30,255.0,CV_THRESH_BINARY);
//更新背景
//cvRunningAvg(pFrameMat,pBkMat,0.003,0);
cvConvert(pFrameMat,pBkImg);
cvShowImage("video",pFrame);
cvShowImage("background",pBkImg);
cvShowImage("foreground",pFrImg);
if(cvWaitKey(10000) == 27)
{
break;
}
else
{
continue;
}
}
}
cvDestroyWindow("video");
cvDestroyWindow("background");
cvDestroyWindow("foreground");
cvReleaseImage(&pFrame);
cvReleaseImage(&pBkImg);
cvReleaseImage(&pFrImg);
cvReleaseMat(&pFrameMat);
cvReleaseMat(&pBkMat);
cvReleaseMat(&pFrMat);
cvReleaseCapture(&capture);
return a.exec();
}