www.pudn.com > bkgrd.rar > bkgrd.c
#include#include "highgui.h" #include "cv.h" #include "cxcore.h" int main() { //声明IplImage指针 IplImage* pFrame=NULL; IplImage* pFrImg=NULL; IplImage* pBkImg=NULL; CvMat* pFrameMat=NULL; CvMat* pFrMat=NULL; CvMat* pBkMat=NULL; CvCapture* pCapture=NULL; int nFrmNum=0; //创建窗口 cvNamedWindow("video",1); cvNamedWindow("background",1); cvNamedWindow("foreground",1); //使窗口有序排列 cvMoveWindow("video",30,0); cvMoveWindow("background",360,0); cvMoveWindow("foreground",690,0); if(!(pCapture=cvCaptureFromFile("she.avi"))) { fprintf(stderr,"can not open video file %s\n","she.avi"); return -2; } //逐帧读取视频 while(pFrame=cvQueryFrame(pCapture)) { nFrmNum++; //如果是第一帧,需要申请内存,并初始化 if(nFrmNum==1) { pBkImg=cvCreateImage(cvSize(pFrame->width,pFrame->height),IPL_DEPTH_8U,1); pFrImg=cvCreateImage(cvSize(pFrame->width,pFrame->height),IPL_DEPTH_8U,1); pBkMat=cvCreateMat(pFrame->height,pFrame->width,CV_32FC1); pFrMat=cvCreateMat(pFrame->height,pFrame->width,CV_32FC1); pFrameMat=cvCreateMat(pFrame->height,pFrame->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); // copy the current to ForeImage cvConvert(pFrImg,pFrameMat); // copy the ForeImage to Matrix cvAbsDiff(pFrameMat,pBkMat,pFrMat); // different the foreImage and the backImage cvThreshold(pFrMat,pFrImg,60,255.0,CV_THRESH_BINARY); //??? cvRunningAvg(pFrameMat,pBkMat,0.003,0); cvConvert(pBkMat,pBkImg); cvShowImage("video",pFrame); pFrImg->origin = pFrame->origin; pBkImg->origin = pFrame->origin; cvShowImage("background",pBkImg); cvShowImage("foreground",pFrImg); if(cvWaitKey(10)>=0) break; } } cvDestroyWindow("video"); cvDestroyWindow("background"); cvDestroyWindow("foreground"); cvReleaseImage(&pFrImg); cvReleaseImage(&pBkImg); cvReleaseMat(&pFrameMat); cvReleaseMat(&pFrMat); cvReleaseMat(&pBkMat); cvReleaseCapture(&pCapture); return 0; }