使用OpenCV 读取和处理任意…

来源:互联网 发布:软件需求分析活动 编辑:程序博客网 时间:2024/06/01 11:45
原文地址:读取和处理任意格式视频文件">使用OpenCV 读取和处理任意格式视频文件作者:塞外风景
 记得几个月前,使用OpenCV 做背景分割时使用它很多视频都不能处理。所以投靠了directshow,这个超级复杂的东西。虽然说已经用 directshow写了一个几万行的商业软件,说实话对它还是想敬而远之。
今天在测一段网上的代码时,竟然都通了。我想这也可能和我在编译器里链接了directshow的东西吧!
下面贴一段代码

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)))
 // {
 //  fprintf(stderr,"Can not open camera.n");
 //  return-2;
 // }

 //打开视频文件
 //if(argc == 2)
 //if( !(pCapture =cvCaptureFromFile(argv[1])))
 if( !(pCapture =cvCaptureFromFile(videoname2)))

 {
  fprintf(stderr, "Can not openvideo file %sn", 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);
   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);

   //显示图像
   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;
}

原创粉丝点击