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 时,获取质量门禁(Quality Gate)结果非常重要。SonarQube 的质量门禁是一种质量控制机制,用于评估代码质量是否符合预设的标准。以下是获取质量门禁结果的意义和作用: 评估代码质量…...
【AI-12】浅显易懂地说一下损失函数
什么是损失函数? 咱们可以把损失函数想象成一个衡量你做的事情“好不好”的尺子。 比如说你在预测明天的天气,你给出的预测结果和实际的天气情况之间会有差别。损失函数就是用来计算这个差别有多大的。 如果你的预测结果和实际情况非常接近,…...
Python和java中super的使用用法(有点小语法上的差距,老忘就在这里置顶了)
文章目录 1 在 Java 中:2 在 Python 中: 在 Java 和 Python 中,子类调用父类方法的语法略有不同: 1 在 Java 中: 使用 super 关键字:在子类中,可以使用 super 关键字来调用父类的方法。super …...
在 QML 中使用 C++ 类和对象
1.实现 C 类,从 QObject 或 QObject 的派生类继承 类中第一行添加 Q_OBJECT 宏 2.修饰成员函数或属性 Q_INVOKABLE 宏用来定义可通过元对象系统访问的方法 Q_PROPERTY 宏用来定义可通过元对象系统访问的属性 信号或者槽,都可以直接在 QML 中访问 3. 在…...
什么是接口?
在前后端开发的语境中,接口(Interface)是一个非常重要的概念,它充当了前端(通常是浏览器端或移动端应用)与后端(通常是服务器端的应用程序)之间进行数据交换的桥梁。接口定义了双方交…...
传统自然语言处理(NLP)与大规模语言模型(LLM)详解
自然语言处理(NLP)和大规模语言模型(LLM)是理解和生成人类语言的两种主要方法。本文将介绍传统NLP和LLM的介绍、运行步骤以及它们之间的比较,帮助新手了解这两个领域的基础知识。 传统自然语言处理(NLP&…...
实现Obsidian PC端和手机端(安卓)同步
步骤 1:在PC端设置Obsidian 安装Obsidian和Git:确保你的PC上已经安装了Obsidian和Git。你可以从Obsidian官网和Git官网下载并安装。 克隆GitHub代码库:在PC上打开命令行(例如Windows的命令提示符或Mac/Linux的终端)&a…...
基于大模型的 Agent 进行任务规划的10种方式
基于大模型的 Agent 基本组成应该包含规划(planning),工具(Tools),执行(Action),和记忆(Memory)四个方面,本节将从 Agent 的概念、ReAct 框架、示例、以及一些论文思路来具体聊下任务规划的话题,…...
计算机网络01
文章目录 浏览器输入URL后发生了什么?Linux 系统是如何收发网络包的?Linux 网络协议栈Linux 接收网络包的流程Linux 发送网络包的流程 浏览器输入URL后发生了什么? URL解析 当在浏览器中输入URL后,浏览器首先对拿到的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...
数据结构与算法-二分搜索树节点的查找
💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、二分搜…...
C++|设计模式(七)|⭐️观察者模式与发布/订阅模式,你分得清楚吗
本文内容来源于B站: 【「观察者模式」与「发布/订阅模式」,你分得清楚吗?】 文章目录 观察者模式(Observer Pattern)的代码优化观察者模式 与 发布订阅模式 他们是一样的吗?发布订阅模式总结 我们想象这样一…...
计算机毕业设计选题推荐-学院教学工作量统计系统-Java/Python项目实战
✨作者主页:IT毕设梦工厂✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...
人机交互不仅仅是科技问题
人机交互不仅仅局限于物理和数理科学的应用,还涉及到更广泛的管理、文理、哲学、艺术、伦理以及法律等领域。下面这些领域在人机协同和智能系统应用中扮演着重要角色: 智能系统在企业管理、资源分配、决策支持等方面的应用,可以帮助管理者优化…...
Lua Debug.GetInfo
在 Lua 中,debug.getinfo 函数的第一个参数指定了要获取信息的函数的级别。这个级别是一个整数,表示调用栈的深度。以下是一些常见的级别和它们的含义: - 1:当前函数(即调用 debug.getinfo 的函数)。 - 2&a…...
每日刷题(最短路、图论)
目录 游戏 思路 代码 魔法 思路 代码 P1364 医院设置 思路 代码 P1144 最短路计数 思路 代码 游戏 I-游戏_河南萌新联赛2024第(三)场:河南大学 (nowcoder.com) 思路 利用dijkstra去寻找起点到其余所有点的最短路径,当…...
远程服务器训练网络之tensorboard可视化
cd到tensorboard events存储的位置 启动tensorboard tensorboard --logdir./ 得到运行结果: TensorBoard 1.13.1 at http://work:6006 (Press CTRLC to quit) 创建tunnel映射到本地,在本地ssh,最好使用公网地址 ssh -N -L 8080:localhost:60…...
MySQL锁详解
锁是计算机在执行多线程或线程时用于并发访问同一共享资源时的同步机制,MySQL中的锁是在服务器层或者存储引擎层实现的,保证了数据访问的一致性与有效性。 MySQL锁: 按粒度分为:全局锁、表级锁、页级锁、行级锁。按模式分为&…...
Andorid下给PDF盖骑缝章的方法—安卓手机批量盖骑缝章的方法
Andorid下给PDF盖骑缝章的方法,安卓手机批量盖骑缝章的方法。一、准备印章图片1。不需要制作为透明的印章,用白底Png格式图片即可,白底图片盖章时软件会自动透明并融合。2。印章边线与图片四边不要有空隙,如下:错误的&…...
FPGA/CPLD数字系统设计实战:从器件选型到调试验证的工程指南
1. 从一则行业趣闻聊起:FPGA厂商的“江湖地位”与我们的设计选择前几天翻看一些老旧的行业资料,偶然间又看到了这篇2012年来自EE Times的“陈年旧文”。文章作者Clive Maxfield用他标志性的幽默笔调,聊了一个看似无厘头的话题:将科…...
告别编译噩梦:在Ubuntu 22.04上为你的C++项目搞定Abseil依赖的三种方法
告别编译噩梦:在Ubuntu 22.04上为你的C项目搞定Abseil依赖的三种方法 在C项目的开发过程中,依赖管理一直是开发者面临的一大挑战。特别是对于现代C项目而言,如何高效、可靠地引入和管理第三方库,往往决定了项目的开发效率和最终质…...
2026届毕业生推荐的降重复率平台横评
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在当下AIGC产业落地的进程里面,冗余算力的消耗,以及无效生成输出所导…...
实测MPU6050低功耗电流:从Sleep到Cycle模式,不同唤醒频率下功耗到底差多少?
MPU6050低功耗模式实测:从微安级电流到唤醒策略的硬件优化指南 当你的智能手环在手腕上安静沉睡时,MPU6050这颗运动传感器正在以微安级的电流维持着生命体征——这不是魔法,而是现代嵌入式设计中精妙的低功耗艺术。作为硬件工程师,…...
2026最权威的六大降AI率助手实际效果
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 在把学术成果提交到知网平台以前,针对借助生成式AI辅助而产出的内容去进行合规化…...
STM32CubeMX实战指南:基本定时器中断配置与精准延时应用
1. 认识STM32基本定时器 第一次接触STM32定时器时,我完全被各种类型的定时器搞晕了。直到后来才发现,基本定时器其实是最好上手的。STM32F1系列通常包含TIM6和TIM7两个基本定时器,它们就像电子表里的秒表功能 - 只能计时,没有花哨…...
从HIP4082到IR2184:直流电机H桥驱动芯片怎么选?一份给硬件工程师的对比清单(含成本、功耗、设计复杂度)
从HIP4082到IR2184:直流电机H桥驱动芯片的工程选型指南 在小型机器人、电动工具或自动化设备的开发中,电机驱动电路的设计往往是硬件工程师面临的核心挑战之一。面对市场上琳琅满目的驱动芯片,如何在性能、成本和可靠性之间找到最佳平衡点&am…...
告别激活烦恼:KMS_VL_ALL_AIO智能激活脚本的终极解决方案
告别激活烦恼:KMS_VL_ALL_AIO智能激活脚本的终极解决方案 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 你是否曾经为Windows系统激活而烦恼?或者为Office办公软件的激活…...
Visual C++运行库一键修复指南:解决Windows程序启动问题的完整方案
Visual C运行库一键修复指南:解决Windows程序启动问题的完整方案 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 当你打开某个软件时突然遇到"缺…...
