当前位置: 首页 > 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对象、设置视频编码器、读取和写入视频帧以及释放资源等关键步骤。掌握这些技术后,你可以轻松地将摄像头捕获的视频数据保存为文件,并进行进一步的处理和分析。希望这篇文章对你有所帮助!

http://www.lryc.cn/news/411822.html

相关文章:

  • jenkins获取sonarqube质量门禁结果
  • 【AI-12】浅显易懂地说一下损失函数
  • Python和java中super的使用用法(有点小语法上的差距,老忘就在这里置顶了)
  • 在 QML 中使用 C++ 类和对象
  • 什么是接口?
  • 传统自然语言处理(NLP)与大规模语言模型(LLM)详解
  • 实现Obsidian PC端和手机端(安卓)同步
  • 基于大模型的 Agent 进行任务规划的10种方式
  • 计算机网络01
  • 基于SpringBoot微服务架构下前后端分离的MVVM模型浅析
  • 44444444444
  • 数据结构与算法-二分搜索树节点的查找
  • C++|设计模式(七)|⭐️观察者模式与发布/订阅模式,你分得清楚吗
  • 计算机毕业设计选题推荐-学院教学工作量统计系统-Java/Python项目实战
  • 人机交互不仅仅是科技问题
  • Lua Debug.GetInfo
  • 每日刷题(最短路、图论)
  • 远程服务器训练网络之tensorboard可视化
  • MySQL锁详解
  • 面试问题记录:
  • vue如何在组件中监听路由参数的变化
  • antd中form表单校验文件上传
  • 商家转账到零钱2024最新开通必过攻略
  • 2024全新Thinkphp聊天室H5实时聊天室群聊聊天室自动分配账户完群组/私聊/禁言等功能/全开源运营版本
  • (一)javascript中class类
  • 【注意力MHA,MQA,GQA,MLA】
  • 《从零开始做个摸鱼小网站! · 序》灵感来源
  • 计算机基础(Windows 10+Office 2016)教程 —— 第5章 文档编辑软件Word 2016(上)
  • 短视频矩阵管理系统源码:实现短视频内容全面布局
  • 系统设计中15 个最重要的权衡