OpenCV读写视频文件解析

一.视频读写类

视频处理的是运动图像,而不是静止图像。视频资源可以是一个专用摄像机、网络摄像头、视频文件或图像文件序列。


OpenCV 中,VideoCapture 类和 VideoWriter 类为视频处理中所涉及的捕获和记录任务提供了一个易用的
C++API。

cv::VideoCapture

1、对象的构造函数,如下面的例子:

cv::VideoCapture capture("D:\\Camera Road 01.avi");

参数为const string&,即读入彩色图像,若设置为0则读取摄像头。

2、验证视频读入是否成功,如下:

if (!capture.isOpened())
    {
        std::cout << "Vidoe open failed!" << std::endl;
        return -1;
    }

3、验证完成后,就可以开始读取视频啦!

cv::Mat frame;
capture >> frame;

VideoCapture对象的操作可以像流一样读入到Mat类型的对象(即图像)中。

cv::VideoWriter

这个类是用来写入一个视频的,使用起来比capture麻烦一些。

构造函数 cv::VideoCapture(const string& path,int fourcc,double fps, Size framesize, bool isColor=true)

需要注意的是fourcc,cv::VideoWriter::fourcc(char c1,char c2,char c3,char c4)

常用的格式有

  • CV_FOURCC('P','I','M','1') = MPEG-1 codec
  • CV_FOURCC('M','J','P','G') = motion-jpeg codec
  • CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec
  • CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec
  • CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec
  • CV_FOURCC('U', '2', '6', '3') = H263 codec
  • CV_FOURCC('I', '2', '6', '3') = H263I codec
  • CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec

二.视频读写示例

剩下的就与VideoCapture差不多了,不过是输出流的操作。

下方的 recVideo 示例是一个简短的代码片段,可以让你了解如何使用一个默认摄像机作为一个捕捉设备来抓取帧,对它们进行边缘检测,并且将新的转换视频帧作为一个文件保存。而且,创建两个窗口同时显示原始帧和处理过的帧。

recVideo 示例的代码为:

1.  #include <opencv2/opencv.hpp>
2.  #include <iostream>
3.  using namespace std;
4.  using namespace cv;
5.   
6.  int main(int, char **)
7.  {
8.      Mat in_frame, out_frame;
9.      const char win1[]="Grabbing...", win2[]="Recording...";
10.    double fps=30;//每秒的帧数
11.    char file_out[]="recorded.avi";
12.   
13.    VideoCapture inVid(O) ; //打开默认摄像机
14.    if ( !inVid.isOpened () ) { //检查错误
15.        cout << "Error! Camera not ready...\n";
16.        return -1;
17.    }
18.    //获取输入视频的宽度和高度
19.    int width = (int)inVid.get(CAP_PROP_FRAME_WIDTH);
20.    int height = (int)inVid.get(CAP_PR〇P_FRAME_HEIGHT);
21.    VideoWriter recVid(file out,VideoWriter::fourcc('M','S','V','C'), fps, Size(width, height));
22.    if (!recVid.isOpened()) {
23.        cout << "Error! Video file not opened...\n";
24.        return -1;
25.    }
26.    //为原始视频和最终视频创建两个窗口
27.    namedWindow(win1);
28.    namedWindow(win2);
29.    while (true) {
30.        //从摄像机读取帧(抓取并解码)
31.        inVid >> in frame;
32.        //将帧转换为灰度
33.        cvtColor(in_frame, out_frame, C0L0R_BGR2GRAY);
34.        //将幀写入视频文件(编码并保存)
35.        recVid << out_frame ?
36.        imshow (win1, in_frame);// 在窗口中显示帧
37.        imshow(win2, out_frame); // 在窗口中显示帧
38.        if (waitKey(1000/fps) >= 0)
39.            break;
40.    }
41.    inVid.release(); // 关闭摄像机
42.    return 0;
43.}

在本示例中,应该快速浏览以下这些函数:

  • double VideoCapture::get(int propId):这个函数为一个 VideoCapture 对象返回指定的属性值。在 videoio.hpp 头文件中包含了基于 DC1394(IEEE 1394 数码相机规范)属性的一个完整列表。
  • static int VideoWriter::fourcc(char c1,char c2,char c3,char c4):这个函数把四个字符连接起来形成一个 fourcc 码。在示例中,MSVC 代表微软视频(仅在 Windows 上可用)。
  • bool VideoWriter::isOpened():如果写入视频的对象被成功初始化,这个函数返回 true。例如,使用一个不正确的编解码器会产生一个错误。
  • VideoCapture&VideoCapture::operator>>(Mat&image):这个函数抓取、解码并返回下一帧。这个方法和布尔函数 VideoCapture::read(OutputArray image)等价。可以使用这个函数而不使用函数 VideoCapture::grab(),然后使用 VideoCapture::retrieve()。
  • VideoWriter&VideoWriter::operator<<(const Mat&image):这个函数写入下一帧。这个方法和布尔函数 VideoWriter::write(const Mat&image)等价。

    在本示例中,有一个读取/写入循环,可同时地获取并处理窗口事件。waitKey(1000/fps)函数调用负责执行这个任务。在这个示例中,1000/fps 表示返回外部循环之前等待的毫秒数。尽管不精确,但对于录制的视频仍能获取每秒帧数的一个近似度量。
  • void VideoCapture::release():这个函数释放视频文件或采集设备。尽管在本示例中没有必要显式地包含,但为了说明它的使用,示例中仍包含了这个函数。

OpenCV读写视频文件解析的更多相关文章

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

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

  2. opencv打开视频文件出错

    使用C#调用mingw的so文件,在C++端使用opencv打开视频.这样的项目完成过了一个,第二次做的时候,发现opencv打开视频文件出错. 首先怀疑是opencv的opencv_ffmpeg24 ...

  3. ffmpeg和opencv 播放视频文件和显示器

    ffmpeg它是基于最新版本,在官网下载http://ffmpeg.zeranoe.com/builds/.编译时VS2010配置相关头文件及库的路径就可以.opencv的搭建參考上一个博客. 首先简 ...

  4. 【VS开发】【计算机视觉】OpenCV读写xml文件《C++版本》

    OpenCV FileStorage类读写XML/YML文件 在OpenCV程序中,需要保存中间结果的时候常常会使用.xml / .yml文件,opencv2.0之前都是使用C风格的代码,当时读写XM ...

  5. OpenCV读写视频操作

    一.读取视频流 在使用OpenCV读取摄像头,或者处理一些磁盘中保存的视频文件时,通常使用VideoCapture进行读取. std::string video_path("/path/to ...

  6. 【python下使用OpenCV实现计算机视觉读书笔记3】读写视频文件

    代码例如以下: import cv2 videoCapture = cv2.VideoCapture('car.avi') fps = videoCapture.get(cv2.cv.CV_CAP_P ...

  7. 【VS开发】【计算机视觉】OpenCV读写xml文件《C版本》

    一些简单的XML读写操作,记之于笔记以备忘 主要功能: 1. 创建XML 2. 向XML中存储或者是读取Int float型基本数据 3. 通过创建XML元素,存取复杂的结构如:结构体.矩阵 代码如下 ...

  8. opencv读写视频,对感兴趣区域进行裁剪

    作为小码农,本人最近想对一段视频的某个区域进行处理,因此要将该段视频区域裁剪出来,搜搜网上,发现没有痕迹,是故自己琢磨一下,左右借鉴,编了如下代码,目标得以实现,希望对你有用. #include &q ...

  9. C++ 调用 opencv 读取视频文件列表并处理

    //g++ trans_video.cpp -o trans_video `pkg-config opencv --libs --cflags` -L/usr/lib/x86_64-linux-gnu ...

随机推荐

  1. 手动脱ORiEN壳实战

    作者:Fly2015 ORiEN这种壳之前没有接触,到底是压缩壳还是加密壳也不知道,只能试一试喽.需要脱壳的程序是吾爱破解脱壳练习第7期的题目. 首先对加壳程序进行查壳,这一步也是程序脱壳的必要的一步 ...

  2. hdu1816 + POJ 2723开锁(二分+2sat)

    题意:      有m层门,我们在最外层,我们要一层一层的进,每一层上有两把锁,我们只要开启其中的一把们就会开,我们有n组钥匙,每组两把,我们只能用其中的一把,用完后第二把瞬间就会消失,问你最多能开到 ...

  3. C#-FTP

    /// <summary> /// 上传文件 /// </summary> /// <param name="fileinfo">需要上传的文件 ...

  4. Intel汇编语言程序设计学习-第三章 汇编语言基础-下

    3.4  定义数据 3.4.1  内部数据类型 MASM定义了多种内部数据类型,每种数据类型都描述了该模型的变量和表达式的取值集合.数据类型的基本特征是以数据位的数目量的大小:8,16,32,,48, ...

  5. spring boot的ComponentScan和ServletComponentScan注解

    ComponentScan 这个注解可以扫描带@Component的类.众所皆知,@RestController和@Configuration和@Service和@Configuration等都有带C ...

  6. C异常处理和C++异常处理的对比

    每一种编译器实现异常处理的方式会有所不同,但是都是基于Windows的SEH异常处理.这里以MSC编译器为例. C异常处理 #include <Windows.h> int main(in ...

  7. CLS的探索:Python如何让日志免费云化

    前言 日志服务(Cloud Log Service,CLS)是腾讯云提供的一站式日志服务平台,提供了从日志采集.日志存储到日志检索,图表分析.监控告警.日志投递等多项服务,协助用户通过日志来解决业务运 ...

  8. Visual Lab Online —— Alpha版本发布声明

    Visual Lab Online -- Alpha版本发布声明 项目 内容 班级:北航2020春软件工程 博客园班级博客 作业:Alpha阶段发布声明 发布声明 目录 Visual Lab Onli ...

  9. 简单聊聊内存逃逸 | 剑指offer - golang

    问题 简单讲讲golang的内存逃逸吗? 解析 什么是内存逃逸 在程序中,每个函数块都会有自己的内存区域用来存自己的局部变量(内存占用少).返回地址.返回值之类的数据,这一块内存区域有特定的结构和寻址 ...

  10. Django(27)类视图

    类视图 在写视图的时候,Django除了使用函数作为视图,也可以使用类作为视图.使用类视图可以使用类的一些特性,比如继承等. View django.views.generic.base.View是主 ...