当前位置: 首页 > 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…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

LLM基础1_语言模型如何处理文本

基于GitHub项目&#xff1a;https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken&#xff1a;OpenAI开发的专业"分词器" torch&#xff1a;Facebook开发的强力计算引擎&#xff0c;相当于超级计算器 理解词嵌入&#xff1a;给词语画"…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)

在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马&#xff08;服务器方面的&#xff09;的原理&#xff0c;连接&#xff0c;以及各种木马及连接工具的分享 文件木马&#xff1a;https://w…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区&#xff08;Partitioning&#xff09;是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分&#xff08;分区&#xff09;可以独立存储、管理和优化&#xff0c;…...

HTML版英语学习系统

HTML版英语学习系统 这是一个完全免费、无需安装、功能完整的英语学习工具&#xff0c;使用HTML CSS JavaScript实现。 功能 文本朗读练习 - 输入英文文章&#xff0c;系统朗读帮助练习听力和发音&#xff0c;适合跟读练习&#xff0c;模仿学习&#xff1b;实时词典查询 - 双…...

前端打包工具简单介绍

前端打包工具简单介绍 一、Webpack 架构与插件机制 1. Webpack 架构核心组成 Entry&#xff08;入口&#xff09; 指定应用的起点文件&#xff0c;比如 src/index.js。 Module&#xff08;模块&#xff09; Webpack 把项目当作模块图&#xff0c;模块可以是 JS、CSS、图片等…...