视频采集与检测源码

来源:互联网 发布:java类的构造器 编辑:程序博客网 时间:2024/05/16 03:04

/************************************************** * 背景建模,运动物体检测 *     
 **************************************************/
/***********************************************************************
 * OpenCV example * By Shiqi Yu 2006 *******
****************************************************************/

 

#include <stdio.h>
 #include <cv.h>
#include <cxcore.h>
#include <highgui.h>
int main( int argc, char** argv )

 //声明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( argc > 2 )
    {     
  fprintf(stderr, "Usage: bkgrd [video_file_name]/n");    
  return -1;    } 
  //打开摄像头 
  if (argc ==1)   
   if( !(pCapture = cvCaptureFromCAM(-1)))  //只有一个摄像头时为-1  
   { 
    fprintf(stderr, "Can not open camera./n"); return -2; 
   }  
   //打开视频文件
   if(argc == 2)  
    if( !(pCapture = cvCaptureFromFile(argv[1])))  
    { 
     fprintf(stderr, "Can not open video file %s/n", argv[1]);
     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); //分配矩阵 cvCreateMat(int rows,int cols, int type);
      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);//cvCvtColor一般是用来做不同depth图象之间的转换   
      cvConvert(pFrImg, pFrMat);  //如8u的图象转换成32f的图象
      cvConvert(pFrImg, pBkMat);
     }    
     else 
     { 
      cvCvtColor(pFrame, pFrImg, CV_BGR2GRAY);//彩色空间转换cvCvtColor(src,dst,code) code:CV_RGB,BGR,GRAY,等等
      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);   
      //显示图像 
      cvShowImage("video", pFrame);  
      cvShowImage("background", pBkImg);  
      cvShowImage("foreground", pFrImg);   
      //如果有按键事件,则跳出循环   //此等待也为cvShowImage函数提供时间完成显示
      //等待时间可以根据CPU速度调整 
      if( cvWaitKey(2) >= 0 )   
       break;   
     }    
    }
    //销毁窗口 
    cvDestroyWindow("video"); 
    cvDestroyWindow("background");
    cvDestroyWindow("foreground"); 
    //释放图像和矩阵 
    cvReleaseImage(&pFrImg);
    cvReleaseImage(&pBkImg); 
    cvReleaseMat(&pFrameMat);
    cvReleaseMat(&pFrMat);
    cvReleaseMat(&pBkMat); 
    cvReleaseCapture(&pCapture); 
    return 0;
}

原创粉丝点击