zoukankan      html  css  js  c++  java
  • Opencv基础知识-----视频的读取和操作

    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
                               CV_CAP_PROP_AVI_RATIO//视频文件的相对位置

    保存视频文件

    • 初始化视频写入
          CvCideoWriter* writer=0;
          int isColor=1;
          int fps=25;//30
          int frameW=640;
          int frameH=480;
      writer=cvCreateVideoWriter("out.avi",CV_FOURCC('P','I','M','1'),fps,cvSize(frameW,frameH),isColor);
    • 视频写入的格式还有
          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;
          for(int i=0;i<nFrames;i++){
            cvGrabFrame(capture);
            img=cvRetreveFrame(capture);
                  cvWriteFrame(writer,img);
        }
    • 释放视频写入

      cvReleaseVideoWriter(&writer);

  • 相关阅读:
    POJ 3348 Cows (凸包面积)
    P4126 [AHOI2009]最小割
    P1903 [国家集训队]数颜色
    P3749 [六省联考2017]寿司餐厅
    CF666E Forensic Examination
    P2336 [SCOI2012]喵星球上的点名
    P1117 [NOI2016]优秀的拆分
    P3747 [六省联考2017]相逢是问候
    CF1062F Upgrading Cities
    P3243 [HNOI2015]菜肴制作
  • 原文地址:https://www.cnblogs.com/Anita9002/p/3885307.html
Copyright © 2011-2022 走看看