python学opencv|读取视频(一)灰度视频制作和保存

【1】引言

上一次课学习了用opencv读取图像,掌握了三个函数:cv.imread()cv.imshow()cv.imwrite()

相关链接如下:

python学opencv|读取图像-CSDN博客

这次课我们继续,来学习用opencv读取视频。

【2】学习资源

首先是官网资源,查看下述代码:

OpenCV: Getting Started with Videos

然后是对应的中文版博客资源,查看下述链接:

2. GUI 功能 - 视频入门 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack

这两个内容基本上是一模一样,所以按照自己的喜好选用即可。

这次课程的学习目的是掌握视频的读取和保存,涉及两个函数:

cv.VideoCapture()cv.VideoWriter()

【3】函数解读

【3.1】cv.VideoCapture()函数

点击下述链接,直达官网解读页面:

https://docs.opencv.org/4.0.0/d8/dfe/classcv_1_1VideoCapture.html

这里的核心意思也很简单:Class for video capturing from video files, image sequences or cameras.

简而言之就是:从视频文件、系列图片或者照相机中读取视频。

【3.2】cv.VideoWrite()函数

点击下述链接,直达官网解读页面:

OpenCV: cv::VideoWriter Class Reference

核心意思:Video writer class.

简而言之就是:保存视频。

【4】 代码解读 

在上述解读的基础上,我们尝试理解代码。

书栈网2. GUI 功能 - 视频入门 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack提供了非常简洁的代码,我们对其解读:

    import numpy as npimport cv2 as cvcap = cv.VideoCapture(0)while(True):# 一帧一帧捕捉ret, frame = cap.read()# 我们对帧的操作在这里gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 显示返回的每帧cv.imshow('frame',gray)if cv.waitKey(1) & 0xFF == ord('q'):break# 当所有事完成,释放 VideoCapture 对象cap.release()cv.destroyAllWindows()

首先是引入计算和opencv模块:

import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块

然后直接调用cv.VideoCapture()函数读取视频:

cap = cv.VideoCapture(0) #读取视频

之后给了一个自定义函数,这个函数逐帧读取视频,然后把视频变成灰色输出,里面使用了imshow()函数支持输出:

while (True): #自定义函数# 一帧一帧捕捉ret, frame = cap.read()# 我们对帧的操作在这里gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) #将每一帧都换成灰色# 显示返回的每帧cv.imshow('frame', gray) #输出灰色的视频if cv.waitKey(1) & 0xFF == ord('q'):break

然后任务完成释放所有对象:

# 当所有事完成,释放 VideoCapture 对象
cap.release() #读取完成后,释放,也就是任务完成后休息
cv.destroyAllWindows() #关闭窗口

实际上运行上述代码没有任何输出,甚至还会保存,因为至少没有视频支持读取。

所以为了完成对代码的理解,还有必要稍加改写。

上次课已经知晓,要被读取的对象最好和python程序放在一起,所以我做了一个视频,和程序放在了同一个位置,视频链接为:

dnlp-aixmls

 然后把代码修改为:

import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块cap = cv.VideoCapture('dnlp-aixmls.mp4') #读取视频
while (True): #自定义函数# 一帧一帧捕捉ret, frame = cap.read()# 我们对帧的操作在这里gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) #将每一帧都换成灰色# 显示返回的每帧cv.imshow('frame', gray) #输出灰色的视频if cv.waitKey(1) & 0xFF == ord('q'):break
# 当所有事完成,释放 VideoCapture 对象
cap.release() #读取完成后,释放,也就是任务完成后休息
cv.destroyAllWindows() #关闭窗口

视频按照灰色的模样进行了输出,效果为:

使用python+opencv转化灰度视频

【5】 灰度视频保存

根前述内容,已知使据用cv.VideoWrite()函数可以保存视频

先引入一个翻转视频后再将其保存的示例,示例依然来自:2. GUI 功能 - 视频入门 - 《OpenCV 中文文档 4.0.0》 - 书栈网 · BookStack

import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块cap = cv.VideoCapture(0) #读取视频
# 声明编码器和创建 VideoWrite 对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) #输出视频
while (cap.isOpened()): #自定义函数ret, frame = cap.read()if ret == True:frame = cv.flip(frame, 0) #对图像进行翻转,调用了flip()函数# 写入已经翻转好的帧out.write(frame) #保存视频cv.imshow('frame', frame) #输出视频if cv.waitKey(1) & 0xFF == ord('q'):breakelse:break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()

 上面先给出了加了注释的官网示例代码,然后我们很直观的会发现保存视频主要增加了两行汇总要代码:

fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480)) #输出视频

fourcc用于视频解码,out用于视频保存。

逻辑上也非常简单,先知道了视频的格式,也就是掌握了该如何处理的方法,然后按照期待的方向将其格式和名称进行转化就可以。

不过官网代码还不能直接使用,所以我们稍微修改一下,转化为下述形式:

import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块cap = cv.VideoCapture('dnlp-aixmls.mp4') #读取视频
# 声明编码器和创建 VideoWrite 对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output-100.mp4', fourcc, 20.0, (1920, 1040)) #输出视频
while (cap.isOpened()): #自定义函数ret, frame = cap.read()if ret == True:frame = cv.flip(frame, 0) #对图像进行翻转,调用了flip()函数# 写入已经翻转好的帧out.write(frame) #保存视频cv.imshow('frame', frame) #输出视频if cv.waitKey(1) & 0xFF == ord('q'):breakelse:break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()

实际上我们看到这是一个彩色的翻转视频,链接如下。

使用python+opencv翻转视频

结合一下对前面的灰度视频转化的操作,我们尝试保存一下灰度视频。

首先输入下述代码:

import numpy as np #引入计算模块
import cv2 as cv #引入opencv模块cap = cv.VideoCapture('dnlp-aixmls.mp4') #读取视频
# 声明编码器和创建 VideoWrite 对象
fourcc = cv.VideoWriter_fourcc(*'XVID') #指定视频解码器,XVID只是其中一种方法
out = cv.VideoWriter('output-flip-gray.mp4', fourcc, 20.0, (1920, 1040),False) #输出视频
while (cap.isOpened()): #自定义函数ret, frame = cap.read()if ret == True:frame = cv.flip(frame, 0) #对图像进行翻转,调用了flip()函数gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)# 写入已经翻转好的帧out.write(gray) #保存视频cv.imshow('gray', gray) #输出视频if cv.waitKey(1) & 0xFF == ord('q'):breakelse:break
# 释放已经完成的工作
cap.release()
out.release()
cv.destroyAllWindows()

这里和之前纯翻转代码的区别是:

acv.VideoWrite()函数后增加了False,正是False参数的出现实现了灰度视频保存;

【b】out.write()和cv.imshow()的参数是gray,它们和False参数一起,保证了保存灰度视频。

【c】修改out.write()和cv.imshow()的参数gray为frame,代码不可以运行。

在v.VideoWrite()函数的官网OpenCV: cv::VideoWriter Class Reference,可以看到解释:

6b730f4245a44b33a344bc7c533b86c2.png

图1

时间也会发现这是一个小细节,只有在cv.VideoWrite()函数后增加了False参数,灰度视频才会被成功保存。

7b69cc5d9d1a4eb985bb4eff84dd8627.png

图2

保存后的翻转灰度视频为:

python+opencv做灰度视频并将其翻转

【6】 总结

初步学习了使用cv.VideoCapture()函数和cv.VideoWrite()函数处理视频的基本技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/61769.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

题外话 (火影密令)

哥们! 玩火影不! 村里人全部评论! 不评论的忍战李全保底! 哥们! 密令领了不! “1219村里人集合”领了吗! 100金币! 哥们! 我粉丝没人能上影! 老舅说的…

人形机器人训练、机器臂远程操控、VR游戏交互、影视动画制作,一副手套全部解决!

广州虚拟动力基于自研技术推出了多节点mHand Pro动捕数据手套,其最大的特点就是功能集成与高精度捕捉,可以用于人形机器人训练、机器臂远程操控、VR游戏交互、影视动画制作等多种场景。 一、人形机器人训练 mHand Pro动捕数据手套双手共装配16个9轴惯性…

vue3+view-ui-plus+vite+less 实现自定义iview样式

首先是结论: "less": "^2.7.3", "less-loader": "^4.1.0", vite.config.js resolve: {alias: {// 设置路径~: path.resolve(__dirname, ./),// 设置别名: path.resolve(__dirname, ./src)},extensions: [.mjs, .js, .ts…

SpringMVC接收数据

一、访问路径设置: RequestMapping注解的作用就是将请求的URL地址和处理请求的方式(handler方法)关联起来,建立映射关系;SpringMVC接收到指定的请求,就会来找到在映射关系中对应的方法来处理这个请求 1.精准路径匹配: 在RequestMapping注解指定URL地址…

【微服务】Docker

一、Docker基础 1、依赖的兼容问题:Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像Docker应用运行在容器中,使用沙箱机制,相互隔离。 2、如何解决开发、测试、生产环境有差异的问题:Docker镜像…

【自用】管材流转项目前端重部署流程 vue2 webpackage4 vuecli4

一、配置 1.下载项目,使用 IDEA 打开,并配置 Nodejs 它提示我,需要 Node.js,因为 nodejs 14 的 installer 已经官网已经找不到了,使用 fnm 又太麻烦, 所以直接采用在 IDEA 中下载的方式就好了。 2.清除缓…

工程设计行业内外网文件交换解决方案:FileLink助力高效、安全的跨网协作

在工程设计行业,文件交换和信息共享是项目顺利推进的关键。尤其是涉及复杂的设计图纸、技术方案、合同文件等重要资料时,如何确保文件在内外网之间的高效、安全传输,直接影响到项目的进度和质量。FileLink正是为此而生,它为工程设…

Wwise SoundBanks内存优化

1.更换音频格式为Vorbis 2.停用多余的音频,如Random Container的随机脚步声数量降为2个 3.背景音乐勾选“Stream”。这样就让音频从硬盘流送到Wwise,而不是保存在内存当中,也就节省了内存 4.设置最大发声数Max Voice Instances 5.设置音频…

C 语言 “神秘魔杖”—— 指针初相识,解锁编程魔法大门(一)

文章目录 一、概念1、取地址操作符(&)2、解引用操作符(*)3、指针变量1、 声明和初始化2、 用途 二、内存和地址三、指针变量类型的意义1、 指针变量类型的基本含义2、 举例说明不同类型指针变量的意义 四、const修饰指针1、co…

Android 使用OpenGLES + MediaPlayer 获取视频截图

概述 Android 获取视频缩略图的方法通常有: ContentResolver: 使用系统数据库MediaMetadataRetriever: 这个是android提供的类,用来获取本地和网络media相关文件的信息ThumbnailUtils: 是在android2.2(api8)之后新增的一个,该类为…

博泽Brose EDI项目案例

Brose 是一家德国的全球性汽车零部件供应商,主要为全球汽车制造商提供机电一体化系统和组件,涵盖车门、座椅调节系统、空调系统以及电动驱动装置等。Brose 以其高质量的创新产品闻名,在全球拥有多个研发和生产基地,是全球第五大家…

python使用python-docx处理word

文章目录 一、python-docx简介二、基本使用1、新建与保存word2、写入Word(1)打开文档(2)添加标题(3)添加段落(4)添加文字块(5)添加图片(6&#xf…

aws(学习笔记第十五课) 如何从灾难中恢复(recover)

aws(学习笔记第十五课) 如何从灾难中恢复 学习内容: 使用CloudWatch对服务器进行监视与恢复区域(region),可用区(available zone)和子网(subnet)使用自动扩展(AutoScalingGroup) 1. 使用CloudWatch对服务器进行监视与恢复 整体架构 这里模拟Jenkins Se…

lwip raw、netcoon、socket三种接口编程的区别

目录 一、前言 二、LWIP 简介 三、LWIP RAW 编程 1.概念与原理 2.编程模型与流程 3.示例代码 4.优点与缺点 四、LWIP NETCONN 编程 1.概念与原理 2.编程模型与流程 3.示例代码 4.优点与缺点 五、LWIP SOCKET 编程 1.概念与原理 2.编程模型与流程 3.示例代码 …

【XGlassTerminal.js】快速 构建 炫酷 终端 网页 以及 Linux 模拟器 在线!!

XGlassTerminal.js XGlassTerminal.js 是一个用于构建前端终端样式的 JavaScript 库。它允许开发者轻松地创建一个具有终端风格的用户界面,并对用户输入的命令进行事件处理。 该库提供了丰富的功能,包括文本添加、命令处理、点击事件绑定等。 同时还支…

车辆传动系统的simulink建模与仿真,分析加速和刹车两个工况

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 5.完整工程文件 1.课题概述 车辆传动系统的simulink建模与仿真,分析加速和刹车两个工况。模型包括车辆模块,传动模块,发动机模块,换挡模块,刹车油门输入模块…

宝塔配置定时任务详解

文章目录 宝塔配置定时任务详解一、引言二、配置定时任务1、登录宝塔面板2、添加定时任务2.1、步骤 3、配置任务3.1、设置任务名称和执行周期3.2、设置执行命令 4、保存并测试 三、使用示例1、备份数据库2、清理日志文件 四、总结 宝塔配置定时任务详解 一、引言 在服务器管理…

【C++笔记】map和set的使用

【C笔记】map和set的深度剖析 🔥个人主页:大白的编程日记 🔥专栏:C笔记 文章目录 【C笔记】map和set的深度剖析前言一.set1.1 序列式容器和关联式容器1.2 set系列的使用1.3 set类的介绍1.4 set的构造和迭代器1.5 set的增删查1.6…

springboot+mybatis对接使用postgresql中PostGIS地图坐标扩展类型字段

方案一&#xff08;完全集成和自动解析&#xff09;&#xff1a; <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId></dependency> 使用 org.postgresql.geometric包下的 PGpoint 类来接收数据库中POINT…

《只狼》运行时提示“mfc140u.dll文件缺失”是什么原因?“找不到mfc140u.dll文件”要怎么解决?教你几招轻松搞定

《只狼》运行时提示“mfc140u.dll文件缺失”的科普与解决方案 作为一名软件开发从业者&#xff0c;在游戏开发和维护过程中&#xff0c;我们经常会遇到各种运行时错误和系统报错。今天&#xff0c;我们就来探讨一下《只狼》这款游戏在运行时提示“mfc140u.dll文件缺失”的原因…