《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存
《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存
本书京东优惠购书链接:https://item.jd.com/14098452.html
本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html
第1章 图像的基本操作
为了方便初学者从零开始学习OpenCV-Python,本书从图像的读取、保存和显示等基本操作开始介绍,使读者可以循序渐进地使用和理解本书的每一个例程。
1.4 视频文件的读取与保存
视频文件是由一系列图像组成的,视频的每一帧都是一幅图像。
OpenCV中的VideoCapture类和VideoWriter类处理视频流,既可以处理视频文件,也可以处理摄像头设备。
VideoCapture类用于读取视频文件、视频流或从摄像头捕获视频;VideoWriter类用于视频文件的写入和保存。在Python语言中,可通过函数cv.VideoCapture和cv.VideoWrite实现类的初始化。
函数原型
cv.VideoCapture( index[, apiPreference] ) → <VideoCapture object>
cv.VideoCapture(filename[, apiPreference]) → <VideoCapture object>
cv.VideoWriter([filename, fourcc, fps, frameSize[, isColor]]) → <VideoWriter object>
参数说明
- index:摄像头的ID编号,index=0表示默认后端打开了摄像头。
- filename:读取或保存视频文件的路径,包括文件扩展名。
- apiPreference:读取视频流的属性设置。
- fourcc:用于压缩帧的编码器/解码器的字符代码。
- CV_FOURCC(‘I’,‘4’,‘2’,‘0’):未压缩的YUV编码格式,扩展名为.avi。
- CV_FOURCC(‘P’,‘I’,‘M’,‘1’):MPEG-1编码格式,扩展名为.avi。
- CV_FOURCC( ‘X’,‘V’,‘I’,‘D’):MPEG-4编码格式,扩展名为.avi。
- CV_FOURCC( ‘F’,‘L’,‘V’,‘I’):Flash编码格式,扩展名为.flv。
- fps:表示视频流的帧速率。
- frameSize:元组 (w,h),表示视频帧的宽度和高度。
- isColor:布尔类型,表示是否为彩色图像。
成员函数
- cv.VideoCapture.isOpened():检查视频捕获是否初始化成功。
- cv.VideoCapture.read():读取视频文件、视频流或捕获的视频设备。
- cv.VideoCapture.release():关闭视频文件或设备,释放对象。
- cv.VideoCapture.get(propId) :获取VideoCapture类对象的属性。
- cv.VideoCapture.set(propId, value):设置VideoCapture类对象的属性。
- cv.VideoWriter.fourcc(c1, c2, c3, c4[, ]):构造编码器/解码器的fourcc代码。
- cv.VideoWriter.write(image[, ]):写入下一帧视频。
- cv.VideoWriter.release():关闭视频写入,释放对象。
注意问题
(1) 在读取视频文件或视频流时,可通过filename指定视频文件或视频流的路径。在使用摄像头时,可通过index定义摄像头的ID编号。
(2) 使用摄像头设备时,index=0表示默认从后端打开摄像头,如笔记本内置摄像头,支持计算机内置或外接的摄像头,也支持本地网络或公共网络的IP摄像头。
(3) 视频写入类VideoWriter的参数frameSize是元组(w,h),即视频帧的宽度和高度,而OpenCV图像的形状表示为(h,w),注意二者的顺序相反。
(4) 视频处理过程较为复杂,一些程序设置与具体系统环境有关,本节只介绍基本的成员函数和通用的处理方法。更多内容详见OpenCV说明文档(链接1-1)。
(5) 视频处理过程中的很多问题都会涉及计算机和摄像机的硬件设备及设置,需要结合具体系统和环境来分析。建议读者参考【例程0106】和【例程0107】,先确认视频读取和设备捕获环境的配置是否正确,再调试和运行其他的视频处理程序。
【例程0106】视频文件的读取、播放和保存
本例程能读取和播放视频文件,并可每隔若干帧抽取一帧,保存为新的视频文件。
读取视频文件的基本步骤如下。
(1) 创建视频,读取/捕获对象。
(2) 逐帧获取视频图像。
(3) 检查获取图像帧是否成功。
(4) 释放视频,读取/捕获对象。
保存视频文件的基本步骤如下。
(1) 设置写入视频的格式和参数。
(2) 创建视频写入对象。
(3) 逐帧写入图像。
(4) 释放视频写入对象。
# 【0106】视频文件的读取、播放和保存
import cv2 as cvif __name__ == '__main__':# 创建视频,读取/捕获对象vedioRead = "../images/vedioDemo1.mov" # 读取视频文件的路径capRead = cv.VideoCapture(vedioRead) # 实例化 VideoCapture 类# 设置写入视频图像的高、宽、帧速率和总帧数width = int(capRead.get(cv.CAP_PROP_FRAME_WIDTH)) # 960height = int(capRead.get(cv.CAP_PROP_FRAME_HEIGHT)) # 540fps = round(capRead.get(cv.CAP_PROP_FPS)) # 30frameCount = int(capRead.get(cv.CAP_PROP_FRAME_COUNT)) # 1826print(height, width, fps, frameCount)# 创建视频写入对象# fourcc = cv.VideoWriter_fourcc('X', 'V', 'I', 'D') # 编码器设置为 XVIDfourcc = cv.VideoWriter_fourcc(*'XVID') # 'X','V','I','D' 简写为 *'XVID'vedioWrite = "../images/vedioSave1.avi" # 写入视频文件的路径capWrite = cv.VideoWriter(vedioWrite, fourcc, fps, (width, height))# 读取视频文件,抽帧写入视频文件frameNum = 0 # 视频帧数初值timef = 30 # 设置抽帧间隔while capRead.isOpened(): # 检查视频捕获是否成功ret, frame = capRead.read() # 读取下一帧视频图像if ret is True:frameNum += 1 # 读取视频的帧数cv.imshow(vedioRead, frame) # 播放视频图像if (frameNum % timef == 0): # 判断抽帧条件capWrite.write(frame) # 将当前帧写入视频文件if cv.waitKey(1) & 0xFF == ord('q'): # 按 'q' 键退出breakelse:print("Can't receive frame at frameNum {}".format(frameNum))breakcapRead.release() # 关闭读取视频文件capWrite.release() # 关闭视频写入对象cv.destroyAllWindows() # 关闭显示窗口
本书京东优惠购书链接:https://item.jd.com/14098452.html
版权声明:
youcans@xupt 原创作品,转载必须标注原文链接:(https://blog.csdn.net/youcans/article/details/132969247)
Copyright 2023 youcans, XUPT
Crated:2023-09-18
欢迎关注本书CSDN独家连载专栏
《数字图像处理-OpenCV/Python》连载: https://blog.csdn.net/youcans/category_12418787.html
相关文章:

《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存
《数字图像处理-OpenCV/Python》连载(7)视频文件的读取与保存 本书京东优惠购书链接:https://item.jd.com/14098452.html 本书CSDN独家连载专栏:https://blog.csdn.net/youcans/category_12418787.html 第1章 图像的基本操作 为…...

安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR显示CPU过载,该如何解决?
视频云存储/安防监控/视频汇聚平台EasyCVR基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频监控系统EasyCVR拓展性强,视频能力丰富,具体可实现视频监控直播、视频轮播、视频录像、云…...
如何彻底卸载mysql
要彻底卸载 MySQL,您可以按照以下步骤进行操作。这些步骤适用于大多数 Linux 发行版,如 Ubuntu、CentOS、Debian 等。请注意,这些步骤可能会删除您的 MySQL 数据库和配置文件,所以请务必备份您的数据。 注意:在执行这些…...

【深度学习实验】线性模型(二):使用NumPy实现线性模型:梯度下降法
目录 一、实验介绍 二、实验环境 1. 配置虚拟环境 2. 库版本介绍 三、实验内容 0. 导入库 1. 初始化参数 2. 线性模型 linear_model 3. 损失函数loss_function 4. 梯度计算函数compute_gradients 5. 梯度下降函数gradient_descent 6. 调用函数 一、实验介绍 使用Nu…...

带你熟练使用list
🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻强烈推荐优质专栏: 🍔🍟🌯C的世界(持续更新中) 🐻推荐专栏1: 🍔🍟🌯C语言初阶 🐻推荐专栏2: 🍔…...

排序——希尔排序
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、希尔排序二、希尔排序动态图三、希尔排序程序代码四、希尔排序习题总结 前言 希尔排序定义希尔排序算法分析希尔排序程序代码希尔排序练习题 一、希尔排序…...

为什么文件夹里的文件看不到?了解原因及应对措施
无论是在个人电脑中还是在其他存储介质上,我们经常会遇到文件夹中的文件突然不可见的情况。这种问题给我们的工作和生活带来了不便,并可能导致数据丢失。本文将分析文件夹中文件看不见的原因,并介绍相应的解决方法,以帮助大家更好…...

KVM嵌套虚拟化实现
KVM嵌套虚拟化实现 理论 Libvirt主要支持三种 CPU mode host-passthrough: libvirt 令 KVM 把宿主机的 CPU 指令集全部透传给虚拟机。因此虚拟机能够最大限度的使用宿主机 CPU 指令集,故性能是最好的。但是在热迁移时,它要求目的节点的 CPU 和源节点的…...

驱动开发,IO模型,信号驱动IO实现过程
1.信号驱动IO框架图 分析: 信号驱动IO是一种异步IO方式。linux预留了一个信号SIGIO用于进行信号驱动IO。进程主程序注册一个SIGIO信号的信号处理函数,当硬件数据准备就绪后会发起一个硬件中断,在中断的处理函数中向当前进程发送一个SIGIO信号…...

左神高级进阶班3(TreeMap顺序表记录线性数据的使用, 滑动窗口的使用,前缀和记录结构, 可能性的舍弃)
目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】 【思路解析】 【代码实现】 【案例1】 【题目描述】 【思路解析】 这里…...

Linux线程
1.进程是资源管理的最小单位,线程是程序执行的最小单位。 2.每个进程有自己的数据段、代码段和堆栈段。线程通常叫做轻型的进程,它包含独立的栈和CPU寄存器状态,线程是进程的一条执行路径,每个线程共享其所附属进程的所有资源,包括…...

C++ 太卷,转 Java?
最近看到知乎、牛客等论坛上关于 C 很多帖子,比如: 2023年大量劝入C 2023年还建议走C方向吗? 看了一圈,基本上都是说 C 这个领域唯一共同点就是都使用 C 语言,其它几乎没有相关性。 的确是这样,比如量化交…...
《Java并发编程实战》第2章-线程安全性
0.概念理解 对象状态:存储在状态变量(例如实例或静态域)中的数据; 线程安全性:当多个线程访问某个类时,这个类始终都能表现出正确的行为,那么就称这个类是线程安全的; 竞态条件&…...

二蛋赠书三期:《C#入门经典(第9版)》
文章目录 前言活动规则参与方式本期赠送书籍介绍作者介绍内容简介读者对象获奖名单 结语 前言 大家好!我是二蛋,一个热爱技术、乐于分享的工程师。在过去的几年里,我一直通过各种渠道与大家分享技术知识和经验。我深知,每一位技术…...
Augmented Large Language Models with Parametric Knowledge Guiding
本文是LLM系列文章,针对《Augmented Large Language Models with Parametric Knowledge Guiding》的翻译。 参数知识引导下的增强大型语言模型 摘要1 引言2 相关工作3 LLM的参数化知识引导4 实验5 结论 摘要 大型语言模型(LLM)凭借其令人印…...

Docker启动Mysql容器并进行目录挂载
一、创建挂载目录 mkdir -p 当前层级下创建 mkdir -p mysql/data mkdir -p mysql/conf 进入到conf目录下创建配置文件touch hym.conf 并把配置文件hmy.conf下增加以下内容使用vim hym.conf即可添加(cv进去就行) Esc :wq 保存 [mysqld] skip-name-resolve character_set_…...

力扣刷题(简单篇):两数之和、两数相加、无重复字符的最长子串
坚持就是胜利 一、两数之和 题目链接:https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应…...
Spark的基础
实训笔记--Spark的基础 Spark的基础一、Spark的诞生背景二、Spark概念2.1 Spark Core2.2. Spark SQL2.3 Spark Streaming2.4 Spark MLlib2.5 Spark GraphX2.6 Spark R 三、Spark的特点3.1 计算快速3.2 易用性3.3 兼容性3.4 通用性 四、Spark的安装部署4.1 Spark的安装部署就是安…...

如何在idea中新建第一个java小程序
如何在idea中新建第一个java小程序 1.打开软件2.新建项目3.找到安装的jdk文件路径4.继续下一步5.创建项目名称并配置项目路径6.点击完成即可。7.在项目文件的src文件夹下创建java类,程序等7.1其他java项目或文件不能运行的原因: 8.新建类并运行程序9.输入…...
AOP全局异常处理
AOP全局异常处理 由于Controller可能接收到来自业务层、数据层、数据库抛出的异常,因此需要使用AOP思想,进行全局异常处理,异常可通过调试获得。 package org.sinian.reggie.common;import lombok.extern.slf4j.Slf4j; import org.springfram…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
Python爬虫实战:研究feedparser库相关技术
1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

Proxmox Mail Gateway安装指南:从零开始配置高效邮件过滤系统
💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「storms…...