当前位置: 首页 > news >正文

OPenCV高级编程——OpenCV视频读写及录制技术详解

目录

引言

一、视频读取技术

VideoCapture 类

构造函数

常用方法

二、视频写入技术

VideoWriter 类

构造函数

常用方法

三、视频录制技术

1. 包含OpenCV头文件

2. 初始化VideoCapture对象

3. 设置视频编码器

4. 读取和写入视频帧

5. 释放资源

6. 编码格式选择

 四、示例代码:读写视频文件

五、总结


引言

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,广泛应用于图像和视频处理、面部识别、物体检测等多个领域。本文将详细介绍OpenCV中的视频读写技术,包括VideoCapture 和 VideoWriter 类和相关函数,并通过代码示例展示如何读取和写入视频文件。

一、视频读取技术

VideoCapture 类

cv::VideoCapture 是OpenCV中用于处理视频输入的类,它可以从摄像头、视频文件或图像序列中读取帧。以下是该类的主要方法和用法。

构造函数
  • cv::VideoCapture::VideoCapture(const string& filename): 通过文件路径打开视频文件。
  • cv::VideoCapture::VideoCapture(int device): 通过设备ID打开摄像头,默认摄像头ID为0。
常用方法
  • bool isOpened() const: 检查视频是否成功打开。
  • bool read(OutputArray image): 读取视频中的一帧,并将其存储在Mat对象中。
  • void release(): 释放VideoCapture对象所占用的资源。
  • double get(int propId): 获取视频属性,如帧率、宽度、高度等。
  • bool set(int propId, double value): 设置视频属性,如帧率、宽度、高度等。


二、视频写入技术

VideoWriter 类

cv::VideoWriter 是OpenCV中用于将图像帧序列保存为视频文件的类。在创建视频文件时,需要指定文件名、编解码器、帧率、宽度和高度等参数。

构造函数
  • cv::VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true):
    • filename: 视频文件的名称和路径。
    • fourcc: 编解码器,如 CV_FOURCC('M','J','P','G') 表示MJPG编解码器。
    • fps: 视频的帧率。
    • frameSize: 视频帧的大小。
    • isColor: 视频图像是否为彩色(默认为true)。
常用方法
  • bool isOpened() const: 检查VideoWriter对象是否成功打开。
  • void write(InputArray image): 将一帧图像写入视频文件。
  • void release(): 释放VideoWriter对象所占用的资源。

三、视频录制技术

1. 包含OpenCV头文件

在C++源文件的开头,需要包含OpenCV的相关头文件。

#include <opencv2/opencv.hpp>  
#include <iostream>

2. 初始化VideoCapture对象

使用cv::VideoCapture类可以捕获视频数据,包括来自摄像头的实时视频。

cv::VideoCapture cap(0); // 0为默认摄像头  
if (!cap.isOpened()) {  std::cerr << "无法打开摄像头" << std::endl;  return -1;  
}

3. 设置视频编码器

在录制视频之前,需要设置视频的编码格式、帧率、分辨率等参数。

int fourcc = cv::VideoWriter::fourcc('M', 'J', 'P', 'G'); // 选择MJPG编码  
double fps = 20.0; // 帧率  
cv::Size frameSize(640, 480); // 分辨率  
cv::VideoWriter videoWriter("output.avi", fourcc, fps, frameSize, true); // 彩色模式  if (!videoWriter.isOpened()) {  std::cerr << "无法打开视频写入器" << std::endl;  return -1;  
}

4. 读取和写入视频帧

通过循环读取摄像头捕获的帧,并将它们写入到视频文件中。

cv::Mat frame;  
while (true) {  bool ret = cap.read(frame);  if (!ret) {  std::cerr << "无法读取视频帧" << std::endl;  break;  }  // 可以在这里对frame进行处理,如色彩转换、添加水印等  videoWriter.write(frame); // 写入帧到视频文件  // 显示帧(可选)  cv::imshow("Video Capture", frame);  // 按'q'键退出循环  if (cv::waitKey(1) == ord('q')) {  break;  }  
}

5. 释放资源

完成视频录制后,需要释放VideoCapture和VideoWriter对象占用的资源。

cap.release();  
videoWriter.release();  
cv::destroyAllWindows();

6. 编码格式选择

OpenCV支持多种视频编码格式,如MJPG、XVID、DIVX、X264等。不同的编码格式在文件体积、压缩效率和兼容性方面有所不同。例如,MJPG适合高尺寸视频,XVID是MPEG-4编码,文件体积较小,X264可以得到更小的文件体积但可能兼容性稍差。

 四、示例代码:读写视频文件

#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;int main(int argc, char* argv[])
{// 读取原视频文件VideoCapture vcap("video.mp4");// 读取视频的帧的宽度和高度 \ 帧int fvwidth = vcap.get(CAP_PROP_FRAME_WIDTH);int fvheight = vcap.get(CAP_PROP_FRAME_HEIGHT);double fvfps = vcap.get(CAP_PROP_FPS);// 通过cout输出获取参数值cout << "宽度:" << fvwidth << endl;cout << "高度:" << fvheight << endl;cout << "帧:" << fvfps << endl;// 录制MP4视频VideoWriter vw("writermp4.mp4", vcap.get(CAP_PROP_FOURCC), fvfps, Size(fvwidth, fvheight));Mat fm;while (1){vcap.read(fm);if (fm.empty()){break;}vw.write(fm);imshow("测试:录制视频中", fm);int key = waitKey(1);if (key == 27){break;}}vcap.release();vw.release();waitKey(0);return 0;
}

五、总结

通过本文,我们了解了OpenCV 的 VideoCapture 和 VideoWriter 类为视频读写提供了强大而灵活的功能和如何在C++中使用OpenCV库进行视频录制。这包括初始化VideoCapture对象、设置视频编码器、读取和写入视频帧以及释放资源等关键步骤。掌握这些技术后,你可以轻松地将摄像头捕获的视频数据保存为文件,并进行进一步的处理和分析。希望这篇文章对你有所帮助!

相关文章:

OPenCV高级编程——OpenCV视频读写及录制技术详解

目录 引言 一、视频读取技术 VideoCapture 类 构造函数 常用方法 二、视频写入技术 VideoWriter 类 构造函数 常用方法 三、视频录制技术 1. 包含OpenCV头文件 2. 初始化VideoCapture对象 3. 设置视频编码器 4. 读取和写入视频帧 5. 释放资源 6. 编码格式选择 …...

jenkins获取sonarqube质量门禁结果

前景 在使用 Jenkins 集成 SonarQube 时&#xff0c;获取质量门禁&#xff08;Quality Gate&#xff09;结果非常重要。SonarQube 的质量门禁是一种质量控制机制&#xff0c;用于评估代码质量是否符合预设的标准。以下是获取质量门禁结果的意义和作用&#xff1a; 评估代码质量…...

【AI-12】浅显易懂地说一下损失函数

什么是损失函数&#xff1f; 咱们可以把损失函数想象成一个衡量你做的事情“好不好”的尺子。 比如说你在预测明天的天气&#xff0c;你给出的预测结果和实际的天气情况之间会有差别。损失函数就是用来计算这个差别有多大的。 如果你的预测结果和实际情况非常接近&#xff0c;…...

Python和java中super的使用用法(有点小语法上的差距,老忘就在这里置顶了)

文章目录 1 在 Java 中&#xff1a;2 在 Python 中&#xff1a; 在 Java 和 Python 中&#xff0c;子类调用父类方法的语法略有不同&#xff1a; 1 在 Java 中&#xff1a; 使用 super 关键字&#xff1a;在子类中&#xff0c;可以使用 super 关键字来调用父类的方法。super …...

在 QML 中使用 C++ 类和对象

1.实现 C 类&#xff0c;从 QObject 或 QObject 的派生类继承 类中第一行添加 Q_OBJECT 宏 2.修饰成员函数或属性 Q_INVOKABLE 宏用来定义可通过元对象系统访问的方法 Q_PROPERTY 宏用来定义可通过元对象系统访问的属性 信号或者槽&#xff0c;都可以直接在 QML 中访问 3. 在…...

什么是接口?

在前后端开发的语境中&#xff0c;接口&#xff08;Interface&#xff09;是一个非常重要的概念&#xff0c;它充当了前端&#xff08;通常是浏览器端或移动端应用&#xff09;与后端&#xff08;通常是服务器端的应用程序&#xff09;之间进行数据交换的桥梁。接口定义了双方交…...

传统自然语言处理(NLP)与大规模语言模型(LLM)详解

自然语言处理&#xff08;NLP&#xff09;和大规模语言模型&#xff08;LLM&#xff09;是理解和生成人类语言的两种主要方法。本文将介绍传统NLP和LLM的介绍、运行步骤以及它们之间的比较&#xff0c;帮助新手了解这两个领域的基础知识。 传统自然语言处理&#xff08;NLP&…...

实现Obsidian PC端和手机端(安卓)同步

步骤 1&#xff1a;在PC端设置Obsidian 安装Obsidian和Git&#xff1a;确保你的PC上已经安装了Obsidian和Git。你可以从Obsidian官网和Git官网下载并安装。 克隆GitHub代码库&#xff1a;在PC上打开命令行&#xff08;例如Windows的命令提示符或Mac/Linux的终端&#xff09;&a…...

基于大模型的 Agent 进行任务规划的10种方式

基于大模型的 Agent 基本组成应该包含规划&#xff08;planning)&#xff0c;工具&#xff08;Tools)&#xff0c;执行(Action)&#xff0c;和记忆(Memory)四个方面&#xff0c;本节将从 Agent 的概念、ReAct 框架、示例、以及一些论文思路来具体聊下任务规划的话题&#xff0c…...

计算机网络01

文章目录 浏览器输入URL后发生了什么&#xff1f;Linux 系统是如何收发网络包的&#xff1f;Linux 网络协议栈Linux 接收网络包的流程Linux 发送网络包的流程 浏览器输入URL后发生了什么&#xff1f; URL解析 当在浏览器中输入URL后&#xff0c;浏览器首先对拿到的URL进行识别…...

基于SpringBoot微服务架构下前后端分离的MVVM模型浅析

基于SpringBoot微服务架构下前后端分离的MVVM模型浅析 “A Brief Analysis of MVVM Model in Front-end and Back-end Separation based on Spring Boot Microservices Architecture” 完整下载链接:基于SpringBoot微服务架构下前后端分离的MVVM模型浅析 文章目录 基于Spring…...

44444444444

4444444444444444...

数据结构与算法-二分搜索树节点的查找

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; 文章目录 引言一、二分搜…...

C++|设计模式(七)|⭐️观察者模式与发布/订阅模式,你分得清楚吗

本文内容来源于B站&#xff1a; 【「观察者模式」与「发布/订阅模式」&#xff0c;你分得清楚吗&#xff1f;】 文章目录 观察者模式&#xff08;Observer Pattern&#xff09;的代码优化观察者模式 与 发布订阅模式 他们是一样的吗&#xff1f;发布订阅模式总结 我们想象这样一…...

计算机毕业设计选题推荐-学院教学工作量统计系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

人机交互不仅仅是科技问题

人机交互不仅仅局限于物理和数理科学的应用&#xff0c;还涉及到更广泛的管理、文理、哲学、艺术、伦理以及法律等领域。下面这些领域在人机协同和智能系统应用中扮演着重要角色&#xff1a; 智能系统在企业管理、资源分配、决策支持等方面的应用&#xff0c;可以帮助管理者优化…...

Lua Debug.GetInfo

在 Lua 中&#xff0c;debug.getinfo 函数的第一个参数指定了要获取信息的函数的级别。这个级别是一个整数&#xff0c;表示调用栈的深度。以下是一些常见的级别和它们的含义&#xff1a; - 1&#xff1a;当前函数&#xff08;即调用 debug.getinfo 的函数&#xff09;。 - 2&a…...

每日刷题(最短路、图论)

目录 游戏 思路 代码 魔法 思路 代码 P1364 医院设置 思路 代码 P1144 最短路计数 思路 代码 游戏 I-游戏_河南萌新联赛2024第&#xff08;三&#xff09;场&#xff1a;河南大学 (nowcoder.com) 思路 利用dijkstra去寻找起点到其余所有点的最短路径&#xff0c;当…...

远程服务器训练网络之tensorboard可视化

cd到tensorboard events存储的位置 启动tensorboard tensorboard --logdir./ 得到运行结果&#xff1a; TensorBoard 1.13.1 at http://work:6006 (Press CTRLC to quit) 创建tunnel映射到本地&#xff0c;在本地ssh&#xff0c;最好使用公网地址 ssh -N -L 8080:localhost:60…...

MySQL锁详解

锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制&#xff0c;MySQL中的锁是在服务器层或者存储引擎层实现的&#xff0c;保证了数据访问的一致性与有效性。 MySQL锁&#xff1a; 按粒度分为&#xff1a;全局锁、表级锁、页级锁、行级锁。按模式分为&…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

c++第七天 继承与派生2

这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分&#xff1a;派生类构造函数与析构函数 当创建一个派生类对象时&#xff0c;基类成员是如何初始化的&#xff1f; 1.当派生类对象创建的时候&#xff0c;基类成员的初始化顺序 …...

「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案

在移动互联网营销竞争白热化的当下&#xff0c;推客小程序系统凭借其裂变传播、精准营销等特性&#xff0c;成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径&#xff0c;助力开发者打造具有市场竞争力的营销工具。​ 一、系统核心功能架构&…...

elementUI点击浏览table所选行数据查看文档

项目场景&#xff1a; table按照要求特定的数据变成按钮可以点击 解决方案&#xff1a; <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...

LOOI机器人的技术实现解析:从手势识别到边缘检测

LOOI机器人作为一款创新的AI硬件产品&#xff0c;通过将智能手机转变为具有情感交互能力的桌面机器人&#xff0c;展示了前沿AI技术与传统硬件设计的完美结合。作为AI与玩具领域的专家&#xff0c;我将全面解析LOOI的技术实现架构&#xff0c;特别是其手势识别、物体识别和环境…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...