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.\n"<<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;
}

opencv中读写视频的更多相关文章

  1. opencv中的视频的读入

    #include"stdafx.h"#include"opencv2/opencv.hpp" using namespace cv;int g_slider_p ...

  2. opencv 从摄像头中读取视频并保存(c++版)

    原文:http://blog.csdn.net/zhongshijunacm/article/details/68947890 OpenCV中的视频操作函数如下表所列: VideoCapture Vi ...

  3. OpenCV读写视频文件解析(二)

    OpenCV读写视频文件解析(二) VideoCapture::set 设置视频捕获中的属性. C++:bool VideoCapture::set(int propId, double value) ...

  4. OpenCV读写视频文件解析

    OpenCV读写视频文件解析 一.视频读写类 视频处理的是运动图像,而不是静止图像.视频资源可以是一个专用摄像机.网络摄像头.视频文件或图像文件序列. 在 OpenCV 中,VideoCapture ...

  5. [OpenCV-Python] OpenCV 中视频分析 部分 VI

    部分 VI视频分析 OpenCV-Python 中文教程(搬运)目录 39 Meanshift 和 和 Camshift 目标 • 本节我们要学习使用 Meanshift 和 Camshift 算法在 ...

  6. 【视频开发】OpenCV中Mat,图像二维指针和CxImage类的转换

    在做图像处理中,常用的函数接口有OpenCV中的Mat图像类,有时候需要直接用二维指针开辟内存直接存储图像数据,有时候需要用到CxImage类存储图像.本文主要是总结下这三类存储方式之间的图像数据的转 ...

  7. Opencv从文件中播放视频

    1.VideoCapture()括号中写视频文件的名字,在播放每一帧的时候,使用cv2.waitKey()设置适当的持续时间,太低会播放的很快,太高会很慢,通常情况下25毫秒就行了. 2.获取相机/视 ...

  8. OpenCV图像处理与视频分析详解

    1.OpenCV4环境搭建 VS2017新建一个控制台项目 配置包含目录 配置库目录 配置链接器 配置环境变量 重新启动VS2017 2.第一个图像显示程序 main.cpp #include< ...

  9. [zt]OpenCV如何获取视频当前的一帧图像

    (OpenCV读取视频.OpenCV提取视频每一帧.每一帧图片合成新的AVI视频)CvCapture 是视频获取结构 被用来作为视频获取函数的一个参数 比如 CvCapture* cap; IplIm ...

随机推荐

  1. uva11609(组合数学,快速幂)

    先选人,再从这些人里选一个队长,方案总数:C(i,1)*C(n,i)(其中i从1到n)的总和. 这个公式显然不能在时限内暴力算出来,需要变形和推导出更简单的来. 用到组合数里面这个公式:C(n,k)* ...

  2. PKUSC2018 Slay The Spire

    有攻击牌和强化牌各 $n$ 张,强化牌可以让之后所有攻击牌攻击力乘一个大于 $1$ 的系数,攻击牌可以造成伤害 求所有“抽出 $m$ 张然后打 $k$ 张”能造成的伤害之和 $k,m,2n \leq ...

  3. Til the Cows Come Home (最短路模板题)

    个人心得:模板题,不过还是找到了很多问题,真的是头痛,为什么用dijkstra算法book[1]=1就错了..... 纠结中.... Bessie is out in the field and wa ...

  4. LeetCode Relative Ranks

    原题链接在这里:https://leetcode.com/problems/relative-ranks/#/description 题目: Given scores of N athletes, f ...

  5. Yii的常用URL和渲染方法

    当前页面url  Yii::app()->request->url;跳转前一个页面url $this->redirect(Yii::app()->request->url ...

  6. C++中rand()函数的用法

    1.rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数. 2.如果你要产生0~99这100个整数中的一个随机整数,可以表达为:int num = r ...

  7. SVM模型进行分类预测时的参数调整技巧

    一:如何判断调参范围是否合理 正常来说,当我们参数在合理范围时,模型在训练集和测试集的准确率都比较高:当模型在训练集上准确率比较高,而测试集上的准确率比较低时,模型处于过拟合状态:当模型训练集和测试集 ...

  8. css3 flex布局/grid布局

    1.CSS3 Flexbox 布局完全指南(图解 Flexbox 布局详细教程) 2.CSS Grid 布局完全指南(图解 Grid 详细教程)

  9. 在C#中实现截获shell程序的输出

    在Windows环境下的所谓shell程序就是dos命令行程序,比如VC的CL.exe命令行编译器,JDK的javac编译器,启动java程序用的java.exe都是标准的shell程序.截获一个sh ...

  10. 反射ORM 三层(for sql server/mysql)

    sql server and oracle 不同之处只在于: 1·参数@和: 2·自增和序列 RPROM.cs //(写错愕,应该是RPORM) RPROM.Insert(p1); //需求:DBS中 ...