#include <cv.h>#include <cxcore.h>#include <highgui.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;pCapture = cvCaptureFromFile("bike.avi");//自己選取一段avi視頻//建立視窗cvNamedWindow("Video", 1);cvNamedWindow("Background",1);cvNamedWindow("Foreground",1);//使視窗有序排列,視窗寬330cvMoveWindow("Video", 30, 0);cvMoveWindow("Background", 360, 0);cvMoveWindow("Foreground", 690, 0);//逐幀讀取視頻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); //轉化成單通道映像再處理(灰階)cvConvert(pFrImg, pFrameMat);//高斯濾波先,以平滑映像//cvSmooth(pFrameMat, pFrameMat, CV_GAUSSIAN, 3, 0, 0);//當前幀跟背景圖相減(求背景差並取絕對值)cvAbsDiff(pFrameMat, pBkMat, pFrMat);//二值化前景圖(這裡採用特定閾值進行二值化)cvThreshold(pFrMat, pFrImg, 60, 255.0, CV_THRESH_BINARY);//進行形態學濾波,去掉噪音cvErode(pFrImg, pFrImg, 0, 1);cvDilate(pFrImg, pFrImg, 0, 1);//滑動平均更新背景(求平均)cvRunningAvg(pFrameMat, pBkMat, 0.003, 0);//將背景轉化為映像格式,用以顯示cvConvert(pBkMat, pBkImg);// 保持原映像的旋轉方向pBkImg->origin = pFrImg->origin = pFrame->origin;//顯示映像cvShowImage("Video", pFrame);cvShowImage("Background", pBkImg);cvShowImage("Foreground", pFrImg);//如果有按鍵事件,則跳出迴圈//此等待也為cvShowImage函數提供時間完成顯示//等待時間可以根據CPU速度調整if( cvWaitKey(200) >= 0 )break;}}//銷毀視窗cvDestroyWindow("Video");cvDestroyWindow("Background");cvDestroyWindow("Foreground");//釋放映像和矩陣cvReleaseImage(&pFrImg);cvReleaseImage(&pBkImg);cvReleaseMat(&pFrameMat);cvReleaseMat(&pFrMat);cvReleaseMat(&pBkMat);cvReleaseCapture(&pCapture);return 0;}
有時間用c++版本重寫,以對兩者的區別有更清楚的認識。Mat , IplImage相互轉化等。