zoukankan      html  css  js  c++  java
  • opencv中读写视频

    1、介绍 OpenCV 读写视频之前,先介绍一下编解码器(codec) 。如果是图像文件, 我们可以根据文件扩展名得知图像的格式。但是此经验并不能推广到视频文件中。 有些 OpenCV 用户会碰到奇怪的问题, 都是 avi 视频文件, 有的能用 OpenCV打开,有的不能。 视频的格式主要由压缩算法决定。压缩算法称之为编码器(coder) ,解压算法称之为解码器(decoder) ,编解码算法可以统称为编解码器(codec) 。视频文件能读或者写,关键看是否有相应的编解码器。编解码器的种类非常多,常用的有 MJPG、XVID、DIVX 等,完整的列表请参考 FOURCC 网站3。因此视频文件的扩展名(如 avi 等)往往只能表示这是一个视频文件。 OpenCV 2 中提供了两个类来实现视频的读写。 读视频的类是 VideoCapture,写视频的类是 VideoWriter。

    2、读视频

    VideoCapture 既可以从视频文件读取图像,也可以从摄像头读取图像。可以使用该类的构造函数打开视频文件或者摄像头。如果 VideoCapture 对象已经创建,也可以使用 VideoCapture::open()打开,VideoCapture::open()函数会自动调用VideoCapture::release()函数,先释放已经打开的视频,然后再打开新视频。

    如果要读一帧, 可以使用 VideoCapture::read()函数。 VideoCapture 类重载了>>操作符,实现了读视频帧的功能。下面的例程演示了使用 VideoCapture 类读视频。

    #include<iostream>
    #include"opencv2/opencv.hpp"
    #include<stdio.h>
    using namespace std;
    using namespace cv;
    int main(int argc, char *argv[])
    {
     //打开摄像头
     VideoCapture cap(0);
     //打开视频文件
     //VideoCapture cap("video.short.raw.avi");
     //检查是否成功打开
     if (!cap.isOpened())
     {
      cerr << "can not open a camera or file."<<endl;
      return -1;
     }
     Mat edges;
     //创建窗口
     namedWindow("edges",1);
     for (;;)
     {
      Mat frame;
      //从cap中读一帧,存到frame
      cap >> frame;
      //如果未读到图像
      if (frame.empty())
       break;
      //将读到的图像转为灰度图
      cvtColor(frame,edges,CV_BGR2GRAY);
      //进行边缘提取操作
      Canny(edges,edges,0,30,3);
      //显示结果
      imshow("edges",edges);
      //等待30s,如果按键则退出循环
      if (waitKey(30) >= 0)
       break;
     }
     //退出时会自动释放 cap 中占用资源
     return 0;
    }

    3、写视频

    使用 OpenCV 创建视频也非常简单,与读视频不同的是,你需要在创建视频时设置一系列参数,包括:文件名,编解码器,帧率,宽度和高度等。编解码器使用四个字符表示,可以是 CV_FOURCC('M','J','P','G')、CV_FOURCC('X','V','I','D')及CV_FOURCC('D','I','V','X')等。 如果使用某种编解码器无法创建视频文件, 请尝试其他的编解码器。

    将图像写入视频可以使用 VideoWriter::write()函数,VideoWriter 类中也重载了<<操作符,使用起来非常方便。另外需要注意:待写入的图像尺寸必须与创建视频时指定的尺寸一致

    下面例程演示了如何写视频文件。本例程将生成一个视频文件,视频的第 0帧上是一个红色的“0” ,第 1 帧上是个红色的“1” ,以此类推,共 100 帧。生成视频的播放效果如图 4.3 所示。

    #include<iostream>
    #include"opencv2/opencv.hpp"
    #include<stdio.h>
    using namespace std;
    using namespace cv;
    int main(int argc, char *argv[])
    {
     //定义视频的宽度和高度
     Size s(320, 240);
     //创建writer,并制定FOURCC及FPS等参数
     VideoWriter writer = VideoWriter("myvedio.avi",CV_FOURCC('M','J','P','G'),25,s);
     //检查是否成功创建
     if (!writer.isOpened())
     {
      cerr << "Can not create video file. "<<endl;
      return -1;
     }
     //视频帧
     Mat frame(s,CV_8UC3);
     for (int i = 0; i < 100; i++)
     {
      //将图像置为黑色
      frame = Scalar::all(0);
      //将整数i转为i字符串类型
      char text[128];
      sprintf_s(text,"%d",i);
      //将数字绘到画面上
      putText(frame,text,Point(s.width/3,s.height/3),FONT_HERSHEY_SCRIPT_SIMPLEX,3,Scalar(0,0,255),3,8);
      //将图像写入视频
      writer << frame;
     }
     VideoCapture cap("myvedio.avi");
     for (int i = 0; i < 100; i++)
     {
      Mat frame;
      //从 cap 中读一帧,存到 frame
      cap >> frame;
      //如果未读到图像
      if (frame.empty())
       break;
      //显示结果
      imshow("frame", frame);
      waitKey(1000);
     }
     //退出程序时自动关闭视频文件
     waitKey(0);
     return 0;
    }

  • 相关阅读:
    进程调度算法
    操作系统文件管理
    25 个精美的手机网站模板
    WEB和APP谁是互联网未来
    网站设计趋势
    百度搜索引擎中的快照及快照更新机制
    JS实现信息的显示和隐藏
    虚拟主机单线、双线、多线的区别
    Types of Entity in Entity Framework:
    DBContext
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6560021.html
Copyright © 2011-2022 走看看