bgextr.cpp
上传用户:chinafyp
上传日期:2008-11-02
资源大小:186k
文件大小:4k
- #include <stdio.h>
- #include <cv.h>
- #include <cxcore.h>
- #include <highgui.h>
- // 定义文字颜色
- CvScalar fcWhite = cvRealScalar(255);
- CvScalar fcBlack = cvRealScalar(0);
- int main(int argc, char *argv[])
- {
- // 声明字体
- CvFont fWarnning;
- // 声明IplImage指针
- IplImage *pFrameOri = NULL;
- 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", 15, 80);
- cvMoveWindow("background", 345, 80);
- cvMoveWindow("foreground", 675, 80);
- // 初始化字体
- cvInitFont(&fWarnning, CV_FONT_HERSHEY_SIMPLEX, 0.5, 0.4, 0, 1, 8);
- if(argc > 2) {
- fprintf(stderr, "Usage: %s [video_file_name]n", argv[0]);
- return -1;
- }
- /* // 打开摄像头
- if (argc == 1)
- if( !(pCapture = cvCaptureFromCAM(-1)) ) {
- fprintf(stderr, "Can not open camera.n");
- return -2;
- }
- */
- // 打开视频文件
- if(argc == 2) {
- if(*argv[1] == '/') {
- fprintf(stdout, "Usage: %s [video_file_name]n", argv[0]);
- return -1;
- } else if( !(pCapture = cvCreateFileCapture(argv[1])) ) {
- fprintf(stderr, "Can not open video file %sn", argv[1]);
- return -2;
- }
- }
- // pCapture = cvCreateFileCapture("DV11_perfect_xvid.avi"); // For easier debug only :)
- // 逐帧读取视频
- while(pFrameOri = cvQueryFrame(pCapture)) {
- nFrmNum++;
- // 缩放图象
- pFrame = cvCreateImage(cvSize(360, 288), IPL_DEPTH_8U, 3);
- pFrame->origin = 1; // 反转图象存储
- cvResize(pFrameOri, pFrame, CV_INTER_LINEAR);
- // 如果是第一帧,申请内存并初始化
- 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);
- // 上下反转图象存储
- pBkImg->origin = 1;
- pFrImg->origin = 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);
- if(nFrmNum >= 400) {
- // 当前帧跟背景图相减
- cvAbsDiff(pFrameMat, pBkMat, pFrMat);
- // 二值化前景图
- cvThreshold(pFrMat, pFrImg, 35, 255.0, CV_THRESH_BINARY);
- // 进行形态学滤波,闭运算,突出车体
- //cvDilate(pFrImg, pFrImg, 0, 2); // 膨胀
- //cvErode(pFrImg, pFrImg, 0, 2); // 腐蚀
- } else if(nFrmNum % 30 <= 20)
- cvPutText(pFrImg, "PLEASE WAIT WHILE EXTRACTING ...", cvPoint(40, pFrame->height/2), &fWarnning, fcWhite);
- // 更新背景
- cvRunningAvg(pFrameMat, pBkMat, 0.004, 0);
- // 将背景转化为图像格式,用以显示
- cvConvert(pBkMat, pBkImg);
- // 显示图像
- cvShowImage("video", pFrame);
- cvShowImage("background", pBkImg);
- cvShowImage("foreground", pFrImg);
- // 如果有按键事件,则跳出循环
- // 此等待也为cvShowImage函数提供时间完成显示
- // 等待时间可以根据CPU速度调整
- if( cvWaitKey(2) >= 0 )
- break;
- }
- cvReleaseImage(&pFrame);
- }
- // 销毁窗口
- cvDestroyAllWindows();
- // 释放图像和矩阵
- cvReleaseImage(&pFrame);
- cvReleaseImage(&pFrImg);
- cvReleaseImage(&pBkImg);
- cvReleaseMat(&pFrameMat);
- cvReleaseMat(&pFrMat);
- cvReleaseMat(&pBkMat);
- cvReleaseCapture(&pCapture);
- return 0;
- }