Opencv读取视频代码

 

#include "stdafx.h"
 
  
#include"highgui.h"
 
  
 
 
  
int main(int argc,char* argv[])
 
  
{
 
  
                cvNamedWindow( "avi");
 
  
                CvCapture* capture = cvCreateFileCapture( "D:\\sample.avi");
 
  
                IplImage* frame;
 
  
                 while(1)
 
  
                {
 
  
                                frame = cvQueryFrame(capture);
 
  
                                 if(!frame) break ;
 
  

      
  
 
  
                                cvShowImage( "avi",frame);
 
  
                                 char c = cvWaitKey(33);
 
  
                                
 
  
                                 if(c == 27) 
   break;
 
  
                }
 
  
                cvReleaseCapture(&capture);
 
  
                cvDestroyWindow( "avi");
 
  
                 return 0;
 
  
}

 

结构体 CvCapture

  CvCapture 是一个结构体,用来保存图像捕获所需要的信息。 opencv提供两种方式从外部捕获图像:

一种是从摄像头中,

一种是通过解码视频得到图像。

     两种方式都必须从第一帧开始一帧一帧的按顺序获取,因此每获取一帧后都要保存相应的状态和参数。

     比如从视频文件中获取,需要保存视频文件的文件名,相应的解码器类型,下一次如果要

获取将需要解码哪一帧等。 这些信息都保存在CvCapture结构中,每获取一帧后,这些信息

都将被更新,获取下一帧需要将新信息传给获取的 api接口

 

cvCreateFileCapture(char*name)

通过输入要读取的avi文件的路径,然后,该函数返回一个指向 CvCapture结构体的指针。

cvQueryFrame(capture)

输入一个CvCapture 类型的指针,该函数主要功能是将视频文件的下一帧加载到内存。与 cvLoadImage的不同之处是,该函数不重新分配内存空间。

C=cvWaitKey(33)

当前帧被显示后,等待 33毫秒。如果用户触发了一个按键, c会被设置成这个按键的 ASCII码,否则会被设置成 -1。

cvWaitKey(33) 在此处的另外一个作用是,控制帧率。

 

cvReleaseCapture(&capture)

释放为 CvCapture结构体开辟的内存空间

关闭打开的 AVI文件相关的文件句柄

视频的使用和操作具体说明:

  • 对摄像头初始化捕捉
    • CvCapture* capture=cvCaptureFromCAM(0);//从摄像头0捕捉
    • 对文件初始化捕捉
      • CvCapture* capture=cvCaptureFromAVI("/home/lubo/....avi");//从文件捕捉
      • 捕捉某一帧
      • IplImage* img=0;
      • 方法一
      •      
      • if(!cvGrabFrame(capture)){ //捕获失败 exit(0); }
      • img=cvRetrieveFrame(capture);
      • 方法二
      • img=cvQueryFrame(capture);
      • 如果同时从几个摄像头捕捉,应该先从每一个摄像头抓取图像,抓取结束后再捕捉图像
      • 释放捕捉源(图像是由捕捉函数分配和释放的,所以不要释放图像)
      • cvReleaseCapture(&capture);

      获取视频帧信息

      • 获得捕捉装置的属性
        • cvQueryFrame(capture); int frameH=(int)cvGetCaptureProperty(capture,CV_CAP_PROP_FRAME_HEIGHT);//视频的高
        •                  CV_CAP_PROP_FRAME_WIDTH//视频的宽 CV_CAP_PROP_FPS //每秒帧数                 CV_CAP_PROP_FRAME_COUNT//帧数 CV_CAP_PROP_FOURCC //4-character code of codec                 CV_CAP_PROP_BRIGHTNESS//亮度 CV_CAP_PROP_CONTRAST//对比度                 CV_CAP_PROP_SATURATION//饱和度 CV_CAP_PROP_HUE//色调
        • 获得帧的当前位置
          •  CV_CAP_PROP_POS_MSEC //视频当时的毫秒数或者视频的时间戳 
          •  CV_CAP_PROP_POS_FRAME//0-based

          保存视频文件

          • 初始化视频写入
            • CvCideoWriter* writer=0;
            •  int isColor=1;
            •  int fps=25;//30 
            •  int frameW=640; 
            •  int frameH=480;
            • 视频写入的格式还有
              • CV_FOURCC('M','J','P','G'); 
              • CV_FOURCC('M','P','4','2'); 
              •                  CV_FOURCC('D','I','V','3');  
                 
              • CV_FOURCC('D','I','V','X'); 
              • CV_FOURCC('U','2','6','3'); 
              •  CV_FOURCC('I','2','6','3'); 
              •         CV_FOURCC('F','L','V','1');
              • 写入视频文件
                • IplImage* img=0; 
                •  int nFrames=50; 
                • cvGrabFrame(capture);
                •  img=cvRetreveFrame(capture); 
                •         cvWriteFrame(writer,img);
                • 释放视频写入 cvReleaseVideoWriter(&writer);