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

opencv视频文件的读取,处理与保存

文章目录

      • opencv视频文件的读取,处理与保存
        • 一、视频文件的读取:
          • 1、cv::VideoCapture是OpenCV库中用于处理视频输入的类,它提供了一种简单的方法来从摄像头,视频文件、或图像序列中读取帧;
            • (1)打开摄像头:
            • (2)打开视频文件:
            • (3)打开网络摄像头:
            • (4)打开图像序列:
          • 2、cv::VideoCapture类的常用方法:
            • (1)capture.get():用于获取视频的属性,比如帧数、帧率等:
            • (2)capture.set(int propId, double value):用于设置视频的属性,比如设置视频的帧率、帧大小等属性;
            • (3)capture.read(cv::Mat& frame):用于读取视频的一帧,将其存储在 `cv::Mat` 对象中;
            • (4)capture.release():用于释放 `VideoCapture` 对象所占用的资源,一般在你已经完成了对视频流的操作后调用它;
        • 二、对视频帧进行处理:
        • 三、保存处理后的视频:
          • 1、cv::VideoWriter 是opencv中用于将图像帧序列保存为视频文件的类,它可以将处理过的帧写入一个视频文件,也可以将视频流输出到摄像头或网络;
            • (1)创建一个 cv::VideoWriter 对象:
          • 2、cv::VideoWriter类的常用方法:
            • (1)cv::VideoWriter::open():用于打开一个视频文件或设备以便写入视频帧;
            • (2)cv::VideoWriter::write():用于将一帧图像写入视频文件;
            • (3)cv::VideoWriter::isOpened():用于检查VideoWriter对象是否成功打开,如果成功打开了视频文件或者设备,该方法将返回true,否则返回false;
            • (4)cv::VideoWriter::release():用于释放VideoWriter对象所占用的资源,一般在你已经完成了对视频的写入操作后调用它;

opencv视频文件的读取,处理与保存

一、视频文件的读取:
1、cv::VideoCapture是OpenCV库中用于处理视频输入的类,它提供了一种简单的方法来从摄像头,视频文件、或图像序列中读取帧;
(1)打开摄像头:
cv::VideoCapture capture(int index)参数解释:
index:打开指定编号的摄像头,编号0表示默认摄像头,如果你的计算机连接了多个摄像头,你可以使用不同的编号来选择不同的摄像头;
(2)打开视频文件:
cv::VideoCapture capture(const std::string& filename)参数解释:
filename:打开指定的视频文件,你需要提供视频文件的路径和名称作为参数;
(3)打开网络摄像头:
cv::VideoCapture capture(const std::string& apiKey, const std::string& deviceId)参数解释:
用于打开网络摄像头,需要提供相应的API密钥和设备ID;
(4)打开图像序列:
cv::VideoCapture capture(const std::string& pattern, int api)参数解释:
用于打开图像序列,需要提供文件名模式(通配符)和相应的API;
2、cv::VideoCapture类的常用方法:
(1)capture.get():用于获取视频的属性,比如帧数、帧率等:
capture.get(int propId)参数解释:
propId:是一个整数参数,用于指定你想获取的属性类型(cv::CAP_PROP_FRAME_COUNT:获取视频的帧数;cv::CAP_PROP_FPS:获取视频的帧率(每秒帧数);cv::CAP_PROP_FRAME_WIDTH:视频帧的宽度;cv::CAP_PROP_FRAME_HEIGHT:视频帧的高度;
)

示例:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 初始化一个cv::VideoCapture对象,打开视频文件VideoCapture capture("C:\\cpp\\image\\cayenne.mp4");if (!capture.isOpened()) {std::cerr << "Error: 无法打开视频文件." << std::endl;return -1;}// 调用cv::VideoCapture类的get()方法,获取视频宽度,高度,帧数,帧率int frameWidth = capture.get(cv::CAP_PROP_FRAME_WIDTH);int frameHeight = capture.get(cv::CAP_PROP_FRAME_HEIGHT);int frameCount = capture.get(cv::CAP_PROP_FRAME_COUNT);double fps = capture.get(cv::CAP_PROP_FPS);std::cout << "frame width:" << frameWidth << std::endl;std::cout << "frame height:" << frameHeight << std::endl;std::cout << "Number of Frames:" << frameCount << std::endl;std::cout << "FPS:" << fps << std::endl;capture.release(); // 释放VideoCapture对象
}
(2)capture.set(int propId, double value):用于设置视频的属性,比如设置视频的帧率、帧大小等属性;
capture.set(int propId, double value)参数解释:
propId:指定了你想设置的属性类型;
value:要设置的值;

示例:

cv::VideoCapture capture(0); // 打开默认摄像头if (!capture.isOpened()) {std::cerr << "Error: 无法打开摄像头." << std::endl;return -1;
}capture.set(cv::CAP_PROP_FRAME_WIDTH, 1280);
capture.set(cv::CAP_PROP_FRAME_HEIGHT, 720);
capture.set(cv::CAP_PROP_FPS, 30);capture.release(); // 释放VideoCapture对象
(3)capture.read(cv::Mat& frame):用于读取视频的一帧,将其存储在 cv::Mat 对象中;

示例:

cv::VideoCapture capture("video_file.mp4");if (!capture.isOpened()) {std::cerr << "Error: 无法打开视频文件." << std::endl;return -1;
}cv::Mat frame;
capture.read(frame);// 在这里可以对 frame 进行处理capture.release(); // 释放VideoCapture对象
(4)capture.release():用于释放 VideoCapture 对象所占用的资源,一般在你已经完成了对视频流的操作后调用它;
二、对视频帧进行处理:

循环遍历视频的每一帧,可以在循环内部对每一帧进行处理在这里,我注释掉了处理部分,你可以根据需要添加各种图像处理操作,比如滤波、边缘检测等;

代码示例:

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {// 打开视频文件VideoCapture capture("C:\\cpp\\image\\cayenne.mp4");// 检查视频是否成功打开if (!capture.isOpened()) {std::cerr << "Error: 无法打开视频文件." << std::endl;return -1;}// 获取视频的帧数和帧率int frameCount = capture.get(cv::CAP_PROP_FRAME_COUNT);double fps = capture.get(cv::CAP_PROP_FPS);// 创建一个VideoWriter对象来保存处理后的视频cv::VideoWriter outVideo("outVideo.mp4", capture.get(CAP_PROP_FOURCC), fps, cv::Size(capture.get(cv::CAP_PROP_FRAME_WIDTH), capture.get(cv::CAP_PROP_FRAME_HEIGHT)));// 循环处理视频的每一帧for (int i = 0; i < frameCount; ++i) {cv::Mat frame;capture >> frame; // 读取一帧if (frame.empty()) {break;}// 在这里可以对frame进行处理,比如进行滤波、边缘检测等// 例如:cv::cvtColor(frame, frame, cv::COLOR_BGR2GRAY);// 将处理后的帧写入输出视频文件outVideo << frame;}// 释放VideoCapture和VideoWriter对象capture.release();outVideo.release();std::cout << "视频处理完成." << std::endl;
}
三、保存处理后的视频:
1、cv::VideoWriter 是opencv中用于将图像帧序列保存为视频文件的类,它可以将处理过的帧写入一个视频文件,也可以将视频流输出到摄像头或网络;
(1)创建一个 cv::VideoWriter 对象:

函数原型:

cv::VideoWriter writer(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true)参数解释:
filename:要保存的视频文件名或者设备地址;
fourcc:FourCC编码,指定视频编解码器的类型(cv::VideoWriter::fourcc('X','V','I','D'):Xvid编解码器;cv::VideoWriter::fourcc('M','J','P','G'):MJPEG编解码器;cv::VideoWriter::fourcc('M','P','4','V'):MPEG-4编解码器;cv::VideoWriter::fourcc('H','2','6','4'):H.264编解码器;
);
fps:帧率,即每秒显示的帧数;
frameSize:帧的大小,可以通过cv::Size类指定;
isColor:指定保存的视频是否为彩色,默认为true
2、cv::VideoWriter类的常用方法:
(1)cv::VideoWriter::open():用于打开一个视频文件或设备以便写入视频帧;
cv::VideoWriter::open(const String& filename, int fourcc, double fps, Size frameSize, bool isColor = true)参数解释:参数和构造函数类似;
filename:要保存的视频文件名或者设备地址;
fourcc:FourCC编码,指定视频编解码器的类型(cv::VideoWriter::fourcc('X','V','I','D'):Xvid编解码器;cv::VideoWriter::fourcc('M','J','P','G'):MJPEG编解码器;cv::VideoWriter::fourcc('M','P','4','V'):MPEG-4编解码器;cv::VideoWriter::fourcc('H','2','6','4'):H.264编解码器;
);
fps:帧率,即每秒显示的帧数;
frameSize:帧的大小,可以通过cv::Size类指定;
isColor:指定保存的视频是否为彩色,默认为true
(2)cv::VideoWriter::write():用于将一帧图像写入视频文件;
cv::VideoWriter::write(const Mat& image)参数解释:
image:要写入视频的帧,通常是一个cv::Mat对象;
(3)cv::VideoWriter::isOpened():用于检查VideoWriter对象是否成功打开,如果成功打开了视频文件或者设备,该方法将返回true,否则返回false;
(4)cv::VideoWriter::release():用于释放VideoWriter对象所占用的资源,一般在你已经完成了对视频的写入操作后调用它;

示例:

我们首先创建了一个 VideoWriter 对象,指定了视频文件的名称、FourCC编码、帧率和帧大小。接着,我们检查是否成功打开了文件。然后,我们创建了一个红色的帧(640x480 大小的纯红色图像)并将其写入视频文件10次。最后,我们释放了 VideoWriter 对象。

#include <opencv2\opencv.hpp>
#include <iostream>
#include <demo.h>using namespace cv;
using namespace std;int main() {Demo demo;// 初始化一个cv::VideoCapture对象,打开视频文件VideoCapture capture("C:\\cpp\\image\\cayenne.mp4");// 调用cv::VideoCapture类的get()方法,获取视频宽度,高度,帧数,帧率int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);int count = capture.get(CAP_PROP_FRAME_COUNT);double fps = capture.get(CAP_PROP_FPS);std::cout << "frame width:" << frame_width << std::endl;std::cout << "frame height:" << frame_height << std::endl;std::cout << "FPS:" << fps << std::endl;std::cout << "Number of Frames:" << count << std::endl;// 初始化一个cv::VideoWriter 对象,保存处理后的视频文件// capture.get(CAP_PROP_FOURCC):获取原视频的编解码器// Size(frame_width, frame_height):原视频的宽高VideoWriter writer("C:\\cpp\\image\\test.mp4", capture.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);Mat frame;while (true) {// 读取视频的一帧,将其存储在frame对象中capture.read(frame);// TODO: do something...// 对读取到的这帧图像,做flip()翻转处理flip(frame, frame, 1);if (frame.empty()) {break;}// 显示这帧图像imshow("frame", frame);// 对这帧图像,做色彩空间转换demo.colorSpace(frame);// 将这帧图像写入视频文件writer.write(frame);int c = waitKey(1);if (c == 27) { // 退出break;}}// releasecapture.release();writer.release();
}

做色彩空间转换 demo.colorSpace()函数如下:

void Demo::colorSpace(Mat &image) {Mat gray, hsv;// 转hsvcvtColor(image, hsv, COLOR_BGR2HSV);// 转灰度cvtColor(image, gray, COLOR_BGR2GRAY);// 显示这两张图imshow("HSV",hsv);imshow("GARY", gray);// 保存这两张图imwrite("C:\\cpp\\vs\\opencv\\hsv.png", hsv);imwrite("C:\\cpp\\vs\\opencv\\gray.png", gray);}

相关文章:

opencv视频文件的读取,处理与保存

文章目录 opencv视频文件的读取&#xff0c;处理与保存一、视频文件的读取&#xff1a;1、cv::VideoCapture是OpenCV库中用于处理视频输入的类&#xff0c;它提供了一种简单的方法来从摄像头&#xff0c;视频文件、或图像序列中读取帧&#xff1b;&#xff08;1&#xff09;打开…...

java - 七大比较排序 - 详解

前言 本篇介绍了七大比较排序&#xff0c;直接插入排序&#xff0c;希尔排序&#xff0c;冒泡排序&#xff0c;堆排序&#xff0c;选择排序&#xff0c;快速排序&#xff0c;归并排序&#xff0c;一些简单思想代码实现&#xff0c;如有错误&#xff0c;请在评论区指正&#xf…...

项目集成七牛云存储sdk

以PHP为例 第一步&#xff1a;下载sdk PHP SDK_SDK 下载_对象存储 - 七牛开发者中心 sdk下载成功之后&#xff0c;将sdk放入项目中&#xff0c;目录选择以自己项目实际情况而定。 注意&#xff1a;在examples目录中有各种上传文件的参考示例&#xff0c;这里我们主要参考的是…...

docker-compose一键启动neo4j

下载镜像 docker pull neo4j:3.5.22-community 编写配置文件 参考文档 编写docker-compose.yml文件 version: "3"services:neo4j:image: neo4j:3.5.22-communitycontainer_name: neo4j restart: alwaysports:- 7474:7474- 7687:7687environment:- NEO4J_AUTH:ne…...

深入剖析@ConfigurationProperties注解

当我们构建Spring Boot应用程序时&#xff0c;配置属性通常是不可或缺的一部分。Spring Boot提供了多种方式来管理这些属性&#xff0c;其中之一是使用ConfigurationProperties注解。这篇博客将详细解释ConfigurationProperties注解以及如何使用它来管理和映射配置属性。 什么…...

北京开发APP需要多少钱

北京开发一个移动应用&#xff08;APP&#xff09;的费用因多种因素而异&#xff0c;包括项目的规模、复杂性、所需功能、设计要求、技术选择、开发团队的经验和地理位置等。一般来说&#xff0c;北京的APP开发费用通常较高&#xff0c;因为这是中国的主要技术和创新中心之一&a…...

self-attention、transformer、bert理解

参考李宏毅老师的视频 https://www.bilibili.com/video/BV1LP411b7zS?p2&spm_id_frompageDriver&vd_sourcec67a2725ac3ca01c38eb3916d221e708 一个输入&#xff0c;一个输出&#xff0c;未考虑输入之间的关系&#xff01;&#xff01;&#xff01; self-attention…...

junit @ExcludePackages排除多个包

在JUnit中&#xff0c;可以使用ExcludePackages注解来排除多个包。该注解可以用在测试类或测试方法上。 如果要排除多个包&#xff0c;可以在ExcludePackages注解的value属性中使用数组来指定要排除的包名。例如&#xff0c;要排除包com.example.package1和com.example.packag…...

Explain执行计划字段解释说明---select_type、table、patitions字段说明

1、select_type的类型有哪些 2、select_type的查询类型说明 1、SIMPLE 简单的 select 查询,查询中不包含子查询或者UNION 2、PRIMARY 查询中若包含任何复杂的子部分&#xff0c;最外层查询则被标记为Primary 3、DERIVED 在FROM列表中包含的子查询被标记为DERIVED(衍生)&…...

云原生微服务 第六章 Spring Cloud Netflix Eureka集成远程调用、负载均衡组件OpenFeign

系列文章目录 第一章 Java线程池技术应用 第二章 CountDownLatch和Semaphone的应用 第三章 Spring Cloud 简介 第四章 Spring Cloud Netflix 之 Eureka 第五章 Spring Cloud Netflix 之 Ribbon 第六章 Spring Cloud 之 OpenFeign 文章目录 系列文章目录前言1、OpenFeign的实现…...

四、2023.9.30.C++面向对象end.4

文章目录 49、 简述一下什么是常函数&#xff0c;有什么作用&#xff1f;50、 说说什么是虚继承&#xff0c;解决什么问题&#xff0c;如何实现&#xff1f;51、简述一下虚函数和纯虚函数&#xff0c;以及实现原理&#xff1f;52、说说纯虚函数能实例化吗&#xff0c;为什么&am…...

【Java】包

package 包&#xff08;package&#xff09;:其实就是文件夹。 作用&#xff1a;对类进行分类管理。 包的定义格式 格式&#xff1a;package 包名&#xff08;多级包用 . 分开&#xff09; 范例&#xff1a;package com.mayikt.demo01 带包的Java类编译和执行 1. 手动建包 安装…...

Hive【Hive(二)DML】

启动 hive 命令行&#xff1a; hive DML 数据操作 1、数据导入 1.1、向表中装载数据&#xff08;load&#xff09; 语法&#xff1a; hive> load data [local] inpath 数据的path [overwrite] into table student [partition (partcol1val1,…)];&#xff08;1&#x…...

HTTP的请求方法,空行,body,介绍请求报头的内部以及粘包问题

目录 一、GET与POST简介 二、空行和body 三、初识请求报头以及粘包问题 四、认识请求报头剩余部分 一、GET与POST简介 GET https://www.sogou.com/HTTP/1.1 请求报文中的方法&#xff0c;是最常规的方法&#xff08;获取资源&#xff09; POST&#xff1a;传输实体主体的方法…...

win10 ip设置

百度安全验证...

alibaba dragonwell jdk

阿里巴巴Dragonwell8快速指南 dragonwell-project/dragonwell8 Wiki GitHub 阿里巴巴Dragonwell8用户指南 dragonwell-project/dragonwell8 Wiki GitHub 阿里巴巴Dragonwell8常见问题 dragonwell-project/dragonwell8 Wiki GitHub...

jvm内存分配与回收策略

自动内存管理 解决两个问题 自动给对象分配内存 对象一般堆上分配&#xff08;而实际上也有可能经过即时编译后被拆散为标量类型并间接地在栈上分配&#xff09; 新生对象通常会分配在新生代&#xff0c;少数情况下&#xff08;例如对象大小超过一定阈值&#xff09;也可能…...

【Vue2和Vue3的双向绑定区别】

Vue2和Vue3的双向绑定区别 vue2 双向绑定原理vue3 双向绑定原理Vue2和Vue3的双向绑定存在以下区别&#xff1a; vue2 双向绑定原理 Vue2 双向绑定的实现主要依赖于 Object.defineProperty() 方法和观察者模式&#xff0c;其中 Object.defineProperty() 方法用于定义属性的 get…...

【再识C进阶3(下)】详细地认识字符分类函数,字符转换函数和内存函数

前言 &#x1f493;作者简介&#xff1a; 加油&#xff0c;旭杏&#xff0c;目前大二&#xff0c;正在学习C&#xff0c;数据结构等&#x1f440; &#x1f493;作者主页&#xff1a;加油&#xff0c;旭杏的主页&#x1f440; ⏩本文收录在&#xff1a;再识C进阶的专栏&#x1…...

windows WSL配置cuda,pytorch和jupyter notebook

机器配置 GPU: NVIDIA Quadro K2000 与 NVIDIA 驱动程序捆绑的CUDA版本 但按照维基百科的描述&#xff0c;我的GPU对应的compute capability3.0&#xff0c;允许安装的CUDA最高只支持10.2&#xff0c;如下所示。 为什么本地会显示11.4呢&#xff1f;对此&#xff0c;GPT是这…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?

Otsu 是一种自动阈值化方法&#xff0c;用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理&#xff0c;能够自动确定一个阈值&#xff0c;将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

AI病理诊断七剑下天山,医疗未来触手可及

一、病理诊断困局&#xff1a;刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断"&#xff0c;医生需通过显微镜观察组织切片&#xff0c;在细胞迷宫中捕捉癌变信号。某省病理质控报告显示&#xff0c;基层医院误诊率达12%-15%&#xff0c;专家会诊…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...

vulnyx Blogger writeup

信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面&#xff0c;gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress&#xff0c;说明目标所使用的cms是wordpress&#xff0c;访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐&#xff1a;「storms…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...