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

《数字图像处理-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》连载&#xff08;7&#xff09;视频文件的读取与保存 本书京东优惠购书链接&#xff1a;https://item.jd.com/14098452.html 本书CSDN独家连载专栏&#xff1a;https://blog.csdn.net/youcans/category_12418787.html 第1章 图像的基本操作 为…...

安防监控/视频汇聚/云存储/AI智能视频分析平台EasyCVR显示CPU过载,该如何解决?

视频云存储/安防监控/视频汇聚平台EasyCVR基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。安防视频监控系统EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、云…...

如何彻底卸载mysql

要彻底卸载 MySQL&#xff0c;您可以按照以下步骤进行操作。这些步骤适用于大多数 Linux 发行版&#xff0c;如 Ubuntu、CentOS、Debian 等。请注意&#xff0c;这些步骤可能会删除您的 MySQL 数据库和配置文件&#xff0c;所以请务必备份您的数据。 注意&#xff1a;在执行这些…...

【深度学习实验】线性模型(二):使用NumPy实现线性模型:梯度下降法

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

带你熟练使用list

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;强烈推荐优质专栏: &#x1f354;&#x1f35f;&#x1f32f;C的世界(持续更新中) &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;…...

排序——希尔排序

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

为什么文件夹里的文件看不到?了解原因及应对措施

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

KVM嵌套虚拟化实现

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

驱动开发,IO模型,信号驱动IO实现过程

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

左神高级进阶班3(TreeMap顺序表记录线性数据的使用, 滑动窗口的使用,前缀和记录结构, 可能性的舍弃)

目录 【案例1】 【题目描述】 【思路解析】 【代码实现】 【案例2】 【题目描述】 【思路解析】 【代码实现】 【案例3】 【题目描述】 【思路解析】 【代码实现】 【案例4】 【题目描述】 【思路解析】 【代码实现】 【案例1】 【题目描述】 【思路解析】 这里…...

Linux线程

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

C++ 太卷,转 Java?

最近看到知乎、牛客等论坛上关于 C 很多帖子&#xff0c;比如&#xff1a; 2023年大量劝入C 2023年还建议走C方向吗&#xff1f; 看了一圈&#xff0c;基本上都是说 C 这个领域唯一共同点就是都使用 C 语言&#xff0c;其它几乎没有相关性。 的确是这样&#xff0c;比如量化交…...

《Java并发编程实战》第2章-线程安全性

0.概念理解 对象状态&#xff1a;存储在状态变量&#xff08;例如实例或静态域&#xff09;中的数据&#xff1b; 线程安全性&#xff1a;当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就称这个类是线程安全的&#xff1b; 竞态条件&…...

二蛋赠书三期:《C#入门经典(第9版)》

文章目录 前言活动规则参与方式本期赠送书籍介绍作者介绍内容简介读者对象获奖名单 结语 前言 大家好&#xff01;我是二蛋&#xff0c;一个热爱技术、乐于分享的工程师。在过去的几年里&#xff0c;我一直通过各种渠道与大家分享技术知识和经验。我深知&#xff0c;每一位技术…...

Augmented Large Language Models with Parametric Knowledge Guiding

本文是LLM系列文章&#xff0c;针对《Augmented Large Language Models with Parametric Knowledge Guiding》的翻译。 参数知识引导下的增强大型语言模型 摘要1 引言2 相关工作3 LLM的参数化知识引导4 实验5 结论 摘要 大型语言模型&#xff08;LLM&#xff09;凭借其令人印…...

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_…...

力扣刷题(简单篇):两数之和、两数相加、无重复字符的最长子串

坚持就是胜利 一、两数之和 题目链接&#xff1a;https://leetcode.cn/problems/two-sum/ 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应…...

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类&#xff0c;程序等7.1其他java项目或文件不能运行的原因&#xff1a; 8.新建类并运行程序9.输入…...

AOP全局异常处理

AOP全局异常处理 由于Controller可能接收到来自业务层、数据层、数据库抛出的异常&#xff0c;因此需要使用AOP思想&#xff0c;进行全局异常处理&#xff0c;异常可通过调试获得。 package org.sinian.reggie.common;import lombok.extern.slf4j.Slf4j; import org.springfram…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》

引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

C#中的CLR属性、依赖属性与附加属性

CLR属性的主要特征 封装性&#xff1a; 隐藏字段的实现细节 提供对字段的受控访问 访问控制&#xff1a; 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性&#xff1a; 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑&#xff1a; 可以…...