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

OpenCV4(C++)—— 视频和摄像头的加载、显示与保存

文章目录

  • 一、加载与显示
  • 二、保存


一、加载与显示

  视频或摄像头的加载是使用 cv::VideoCapture 类。(这个类和 ifstream 类比较相似,视频或摄像头的加载和文本文件操作是大致相同。主要步骤:(1)加载(打开)视频或视像头。(2) 判断加载是否成功。 (3)读取内容。(4)关闭。)

注意:
  (1)VideoCapture类变量同时提供了可以查看视频属性的 get()函数 ,通过输入指定的标志来获取视频属性,例如视频的像素尺寸、帧数、帧率等。
  (2)在读取内容(每一帧图片)时,和ifstream一样,同样有多种方式,如通过“>>”运算符,或使用read成员函数等。但注意要使用 Mat类 来定义buffer。
  (3)当VideoCapture类变量中所有的图像都赋值给Mat类变量后,再次赋值的时候就是赋空值,故Mat类变量会变为空矩阵,因此可以通过 empty() 判断VideoCapture类变量中是否所有图像都已经读取完毕。
  (4)视频其实是每一帧图像的组成,所以显示也是连续显示每一帧图像,同样使用 imshow函数

代码如下(示例):

#include <opencv2/opencv.hpp>  
#include<iostream>  
using namespace std;int main()
{// 和文本文件一样,两种打开方式:成员函数open和默认构造函数//cv::VideoCapture capVideo;//capVideo.open("C:/Users/Opencv/temp/123.mp4");cv::VideoCapture capVideo("C:/Users/Opencv/temp/123.mp4");// 打开摄像头,第一个参数为要打开的摄像头设备的ID,ID的命名方式从0开始。// cv::VideoCapture capVideo(0); // 打开第一个摄像头if (!capVideo.isOpened()){cout << "打开视频失败" << endl;return -1;}cout << "视频中图像的宽度=" << capVideo.get(cv::CAP_PROP_FRAME_WIDTH) << endl;cout << "视频中图像的高度=" << capVideo.get(cv::CAP_PROP_FRAME_HEIGHT) << endl;cout << "视频帧率=" << capVideo.get(cv::CAP_PROP_FPS) << endl;cout << "视频的总帧数=" << capVideo.get(cv::CAP_PROP_FRAME_COUNT);cv::Mat buffer;while (1) {capVideo >> buffer;if (buffer.empty()){break;}cv::imshow("video", buffer);//char key = cv::waitKey(1000 / capVideo.get(cv::CAP_PROP_FPS));  // 按源视频的帧率char key = cv::waitKey(30);  // 每帧延迟30毫秒。(由此可设置快放或慢放)if (key == 'q' || key == 27){break;}    }capVideo.release();  //释放对象cv::destroyAllWindows();

二、保存

  (1)OpenCV中提供了 VideoWrite()类 用于实现多张图像保存成视频文件。该类的构造函数参数如下:

cv::VideoWriter output(filename, int fourcc, double fps, Size frameSize, bool  isColor=true)filename::保存视频的具体路径,包含视频格式
fourcc:压缩帧的4字符编解码器代码。如JPEG编码('M','J','P','G'),但这个效果一般。常用的H.264 编码格式('H', '2', '6', '4')等。注:赋值“-1”则会自动搜索合适的编解码器
fps:保存视频的帧率,即视频中每秒图像的张数。可实现原视频二倍速播放、原视频慢动作播放等
frameSize:视频帧的尺寸。通常在设置时要与图像的尺寸相同,不然无法保存视频
isColor:保存视频是否为彩色视频,缺省为彩色

  (2)VideoWrite()和VideoCapture()一样,都可以通过isOpened()函数判断是否成功创建一个视频流,可以通过get()查看视频流中的各种属性。
  (3)在保存视频时,我们只需要将生成视频的图像一帧一帧通过“<<”操作符(或者write()函数)赋值给视频流即可,最后使用release()关闭视频流。

代码如下(示例):

#include <opencv2/opencv.hpp>  
#include<iostream>  using namespace std;int main()
{cv::VideoCapture capVideo("C:/Users/Opencv/temp/123.mp4");// cv::VideoCapture capVideo;// capVideo.open("C:/Users/Opencv/temp/123.mp4");if (!capVideo.isOpened()){cout << "打开视频失败" << endl;return -1;}cout << "视频中图像的宽度=" << capVideo.get(cv::CAP_PROP_FRAME_WIDTH) << endl;cout << "视频中图像的高度=" << capVideo.get(cv::CAP_PROP_FRAME_HEIGHT) << endl;cout << "视频帧率=" << capVideo.get(cv::CAP_PROP_FPS) << endl;cout << "视频的总帧数=" << capVideo.get(cv::CAP_PROP_FRAME_COUNT);int width = static_cast<int>(capVideo.get(cv::CAP_PROP_FRAME_WIDTH));int height = static_cast<int>(capVideo.get(cv::CAP_PROP_FRAME_HEIGHT));// cv::VideoWriter output("C:/Users/Opencv/temp/321.mp4", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 25, cv::Size(width,height), true);cv::VideoWriter output("C:/Users/Opencv/temp/32331.mp4", cv::VideoWriter::fourcc('H', '2', '6', '4'), 25, cv::Size(width, height), true);if (!output.isOpened()) {// 处理无法创建输出视频文件的情况return -1;}cv::Mat buffer;while (capVideo.read(buffer)) {//  可用一些方法对每一帧图片进行处理output.write(buffer); // 再将当前帧写入输出视频//output << buffer;cv::imshow("show",buffer);char key = cv::waitKey(1000 / capVideo.get(cv::CAP_PROP_FPS));  // 按源视频的帧率if (key == 'q' || key == 27){break;}}capVideo.release();  //释放对象cv::destroyAllWindows();return 0;
}

相关文章:

OpenCV4(C++)—— 视频和摄像头的加载、显示与保存

文章目录 一、加载与显示二、保存 一、加载与显示 视频或摄像头的加载是使用 cv::VideoCapture 类。&#xff08;这个类和 ifstream 类比较相似&#xff0c;视频或摄像头的加载和文本文件操作是大致相同。主要步骤&#xff1a;&#xff08;1&#xff09;加载&#xff08;打开&a…...

excel功能区(ribbonx)编程笔记6-box的使用

box元素用来在组里指定的控件周围放置一个可视的框,其主要目的是将控件作为一个单元组合在一起。 通常情况下,分配到组中的每个控件都被放置在先前的控件下面直到该列被填满,然后下一个控件被放置在其右侧列的顶行。然而,通过在框里面组合命令,可以将几个控件视作一个整体…...

oralce配置访问白名单的方法

目录 配置sqlnet.ora文件 重新加载使配置生效 注意事项 Oracle数据库安全性提升&#xff1a;IP白名单的配置方法 随着互联网的发展&#xff0c;数据库安全问题也越来越严重。Oracle是目前使用较为广泛的一款数据库管理系统&#xff0c;而IP白名单作为提升数据库安全性的有效…...

ToBeWritten之让响应团队参与并做好沟通

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…...

ffmpeg ts 关于av_seek_frame

1 ffmpeg命令行 一般对视频文件的裁剪 我们通过一行 ffmpeg命令行即可实现&#xff0c;比如 ffmpeg -ss 0.5 - t 3 - i a.mp4 vcodec copy b.mp4 其中 -ss 放置较前 开启精准seek定位 对于mp4而言 seek将从moov中相关索引表查找 0.5s时刻附近最近的关键帧 &#xff08;此描述…...

【C++】set map 的底层封装

在了解底层封装之前除了对set和map的使用情况要有一定了解&#xff0c;还需要先学习一下二叉搜索树&#xff0c;AVL树&#xff0c;红黑树这些数据结构。 【C】二叉搜索树 【C】AVL树 & 红黑树 RBTree.h enum Colour {RED,BLACK };template<class T> class RBTreeNo…...

JavaWeb整体介绍

JavaWeb整体介绍 什么是Java Web Web&#xff1a;全球广域网&#xff0c;也称为万维网&#xff08;www&#xff09;&#xff0c;能够通过浏览器访问的网站JavaWeb&#xff1a;是使用Java技术解决相关web互联网领域的技术栈&#xff08;就是用java开发网站&#xff09; 网页&a…...

一些常见分布-正态分布、对数正态分布、伽马分布、卡方分布、t分布、F分布等

目录 正态分布 对数正态分布 伽马分布 伽马函数 贝塔函数 伽马分布 卡方分布 F分布 t分布 附录 参考文献 本文主要介绍一些常见的分布&#xff0c;包括正态分布、对数正态分布、伽马分布、卡方分布、F分布、t分布。给出了分布的定义&#xff0c;推导了概率密度函数&…...

科技云报道:押注向量数据库,为时过早?

科技云报道原创。 在大模型的高调火热之下&#xff0c;向量数据库也获得了前所未有的关注。 近两个月内&#xff0c;向量数据库迎来融资潮&#xff0c;Qdrant、Chroma、Weaviate先后获得融资&#xff0c;Pinecone宣布1亿美元B轮融资&#xff0c;估值达到7.5亿美元。 东北证券…...

铭控传感亮相2023国际物联网展,聚焦“多场景物联感知方案”应用

金秋九月&#xff0c;聚焦IoT基石技术&#xff0c;荟萃最全物联感知企业&#xff0c;齐聚IOTE 2023第20届国际物联网展深圳站。铭控传感携智慧楼宇&#xff0c;数字工厂&#xff0c;智慧消防&#xff0c;智慧泵房等多场景物联感知方案及多品类无线传感器闪亮登场&#xff0c;现…...

前端demo: 实现对图片进行上传前的压缩功能

前端可以使用canvas和File API来对图片进行压缩和缩放处理&#xff0c;以下是一个示例代码 : 压缩方法compressImg这段代码是实现对图片进行上传前的压缩功能 1. 定义了一个压缩图片的函数 compressImg&#xff0c;接受两个参数&#xff1a;file表示要压缩的文件&#xff0c;q…...

计算机网络(文章链接汇总)

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 计算机网络&#xff08;一&#xff09;&#xff1a;概述计算机网络&#xff08;二&#xff09;&#xff1a;物理层计算机网络&#xff08;三&#xff09;&#xff1a;数据链路层计算机网…...

黑科技-Android

1热更新&#xff08;热修复&#xff09;&#xff1a;apk不用发版&#xff0c;就能修复bug 原理&#xff1a;我们修复好了bug的时候&#xff0c;把那些有改动的java源码编译成class&#xff0c;再打包成dex&#xff0c;然后通过反射技术放到dexElements数组的最前面&#xff0c;…...

450. 删除二叉搜索树中的节点

给定一个二叉搜索树的根节点 root 和一个值 key&#xff0c;删除二叉搜索树中的 key 对应的节点&#xff0c;并保证二叉搜索树的性质不变。返回二叉搜索树&#xff08;有可能被更新&#xff09;的根节点的引用。 一般来说&#xff0c;删除节点可分为两个步骤&#xff1a; 首先…...

python安全工具开发基础

文章目录 拷贝、with、is深拷贝、浅拷贝with 三器一闭迭代器生成器闭包装饰器 动态绑定垃圾回收网络编程UdpTcp 协程mysql预处理防止注入 redis未授权/弱密码 拷贝、with 、is a [11, 22, 33] b [11, 22, 33] ca print(id(a)) print(id(b)) print(id(c))print(a b) print(…...

26 docker前后端部署

[参考博客]((257条消息) DockerNginx部署前后端分离项目(SpringBootVue)的详细教程_在docker中安装nginx实现前后端分离_这里是杨杨吖的博客-CSDN博客) (DockerNginx部署前后端分离项目(SpringBootVue)) 安装docker # 1、yum 包更新到最新 yum update # 2、安装需要的软件包…...

[linux] SFTP文件传输基本命令 --- xshell 直接上传文件

2.sftp - 上传文件&#xff1a;如果上传/下载的是文件夹, 在put/get命令后加上-r参数即可。 上传文件&#xff1a; 把本地服务器的/www/wwwroot目录下面的study.log文件上传到远程服务器的/www/server目录下。 sftp> lcd /www/wwwroot sftp> put study.log /www/server…...

Tomcat 多实例

一、Tomcat 多实例 1、概念&#xff1a; Tomcat 多实例是指在同一台服务器上运行多个独立的 Tomcat 服务器实例。它们可以同时运行在同一台物理服务器或虚拟服务器上&#xff0c;但它们彼此之间是相互独立的&#xff0c;有各自的配置、应用程序和资源。 2、配置&#xff1a;…...

全民拼购模式:电商的新趋势和机遇

全民拼购模式是一种基于社交电商的新型模式&#xff0c;它通过拼团、拼购等方式&#xff0c;让消费者享受更优惠的价格和更便捷的购物体验。这种模式的出现&#xff0c;不仅为电商平台注入了新的活力&#xff0c;也成为了消费者追求高性价比商品的新选择。 全民拼购模式有以下…...

免费使用,媲美Midjourney!微软在Bing Chat等提供—DALL-E 3

微软在官网宣布&#xff0c;将OpenAI最新模型DALL-E 3集成在Bing Chat和Bing Image Create中&#xff0c;并免费提供给用户使用。 据悉&#xff0c;DALL-E 3是一款类Midjourney产品&#xff0c;通过文本就能生成二次元、3D、朋克、涂鸦、素描、黑白、极简、印象派、位面像素等…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作&#xff0c;无需更改相机配置。但是&#xff0c;一…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

oracle与MySQL数据库之间数据同步的技术要点

Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异&#xff0c;它们的数据同步要求既要保持数据的准确性和一致性&#xff0c;又要处理好性能问题。以下是一些主要的技术要点&#xff1a; 数据结构差异 数据类型差异&#xff…...

如何将联系人从 iPhone 转移到 Android

从 iPhone 换到 Android 手机时&#xff0c;你可能需要保留重要的数据&#xff0c;例如通讯录。好在&#xff0c;将通讯录从 iPhone 转移到 Android 手机非常简单&#xff0c;你可以从本文中学习 6 种可靠的方法&#xff0c;确保随时保持连接&#xff0c;不错过任何信息。 第 1…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...