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

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()函数处理视频的基本技巧。

相关文章:

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

【1】引言 上一次课学习了用opencv读取图像,掌握了三个函数:cv.imread()、cv.imshow()、cv.imwrite() 相关链接如下: python学opencv|读取图像-CSDN博客 这次课我们继续,来学习用opencv读取视频。 【2】学习资源 首先是官网…...

【Rust WebAssembly 入门实操遇到的问题】

Rust WebAssembly 入门实操遇到的问题 什么是WebAssembly跟着教程走wasm-pack build error总结 什么是WebAssembly WebAssembly(简称Wasm)是一种基于堆栈的虚拟机的二进制指令 格式。Wasm 被设计为编程语言的可移植编译目标,支持在 Web 上部…...

掌握CMake中的变量:设置、使用及实际应用示例详解

掌握CMake中的变量:设置、使用及实际应用示例详解 在CMake中,变量的设置和使用是管理构建配置的核心部分,它使得项目配置更加灵活和动态。变量在CMake中用于保存各种数据,如路径、选项值或文件列表,可以在整个CMake配…...

React基础知识三 router路由全指南

现在最新版本是Router6和Router5有比较大的变化,Router5和Router4变化不大,本文以Router6的写法为主,也会对比和Router5的不同。比较全面。 安装路由 npm i react-router-dom基本使用 有两种Router,BrowserRouter和HashRouter&…...

[VUE]框架网页开发02-如何打包Vue.js框架网页并在服务器中通过Tomcat启动

在现代Web开发中,Vue.js已经成为前端开发的热门选择之一。然而,将Vue.js项目打包并部署到生产环境可能会让一些开发者感到困惑。本文将详细介绍如何将Vue.js项目打包,并通过Tomcat服务器启动运行。 1. 准备工作 确保你的项目能够正常运行,项…...

k8s Quality of Service

文章目录 QoS 分类规则QoS 类别影响创建 QoS 分类的案例1. Guaranteed QoS 示例示例 YAML 文件: 2. Burstable QoS 示例示例 YAML 文件: 3. BestEffort QoS 示例示例 YAML 文件: 4. 混合 QoS 示例(多个容器)示例 YAML …...

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab)

顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab) 目录 顶刊算法 | 鱼鹰算法OOA-BiTCN-BiGRU-Attention多输入单输出回归预测(Maltab)效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实…...

什么语言适合做 Serverless 开发?

随着云计算的普及,**无服务器架构(Serverless Architecture)**成为一种流行的开发模式,它使得开发者无需管理服务器基础设施,专注于编写应用逻辑。无服务器架构通常按需提供计算资源,能够灵活地扩展&#x…...

使用OpenCV和卡尔曼滤波器进行实时活体检测

引言 在现代计算机视觉应用中,实时检测和跟踪物体是一项重要的任务。本文将详细介绍如何使用OpenCV库和卡尔曼滤波器来实现一个实时的活体检测系统。该系统能够通过摄像头捕捉视频流,并使用YOLOv3模型来检测目标对象(例如人)&…...

【25春招前端八股文】——JS数据类型检测方式

检测数据类型 # typeof 总结:数组、对象、null都会被判断为object,其他判断都正确的类型。 可以检测基本数据类型null会检测为Object,因为null也是一个空的引用对象复杂数据类型只能检测function和Object 情况说明: 数组&#x…...

Kafka的学习路径规划

目录标题 1. 记(记忆力)Kafka核心概念Kafka关键配置 2. 懂(理解力)Kafka工作原理Kafka核心功能Kafka架构设计 3. 网(知识网络)技术栈整合用例和场景 4. 拓(全面拓展)学习材料多样化内…...

linux模拟试题

Linux 基础阶段考试笔试模拟试卷 审核人:王旺旺 一.填空题(每题 1 分,共 30 分) 1.验证 httpd 服务是否启动的命令是_______ 答:systemctl status httpd 或 netstat -anptl 或 ss -anpt 2.将目录 xxhf 下所有文件的所属组改为 user1 的命令是_______ 答:chown -R ,user1 …...

Qt-界面优化QSS

QSS介绍 先说下CSS: 在⽹⻚前端开发领域中, CSS 是⼀个⾄关重要的部分. 描述了⼀个⽹⻚的 "样式". 从⽽起到对⽹⻚美化的作⽤。 Qt 仿照 CSS 的模式, 引⼊了 QSS, 来对 Qt 中的控件做出样式上的设定 。 CSS的功能很强大,QSS要逊色一些&#…...

QT实战-qt各种菜单样式实现

本文主要介绍了qt普通菜单样式、带选中样式、带子菜单样式、超过一屏幕菜单样式、自定义带有滚动条的菜单样式, 先上图如下: 1.普通菜单样式 代码: m_pmenu new QMenu(this);m_pmenu->setObjectName("quoteListMenu"); qss文…...

深度学习基础03_BP算法(下)过拟合和欠拟合

目录 一、BP算法(下) 0、反向传播代码回顾 写法一: 写法二(更常用): 1、BP中的梯度下降 1.数学描述 2.传统下降方式 3.优化梯度下降方式 指数加权平均 Momentum AdaGrad RMSProp Adam(常用) 总结 二、过拟合和欠拟合 1、概念 1.过拟合 …...

web vue 滑动选择 n宫格选中 九宫格选中

页面动态布局经常性要交给客户来操作,他们按时他们的习惯在同一个屏幕内显示若干个子视图,尤其是在医学影像领域对于影像的同屏显示目视对比显的更为重要。 来看看如下的用户体验: 设计为最多支持5行6列页面展示后,右侧的布局则动…...

Spring Boot整合EasyExcel

Spring Boot整合EasyExcel主要涉及到以下几个步骤: 1.添加EasyExcel依赖到Spring Boot项目的pom.xml文件中。 2.创建数据模型类,用于映射Excel文件中的数据。 3.编写读取和写入Excel的服务。 以下是一个简单的例子: 1.添加EasyExcel依赖 …...

微软表示不会使用你的 Word、Excel 数据进行 AI 训练

​微软否认使用 Microsoft 365 应用程序(包括 Word、Excel 和 PowerPoint)收集数据来训练公司人工智能 (AI) 模型的说法。 此前,Tumblr 的一篇博文声称,雷德蒙德使用“互联体验”功能抓取客户的 Word 和 Excel 数据,用…...

JavaScript(一)

1.JavaScript 基本使用 2.JavaScript简单事件 3.JavaScript修改样式 4.JavaScript数据类型 JavaScript和Java有什么关系 知识点一 JavaScript基本使用 JS写在哪 还有一种写在中间的&#xff0c;也就是<head>里面 JS一些注意事项 JS修改元素内容 #JS获取对象<…...

Day 32 动态规划part01

今天正式开始动态规划! 理论基础 无论大家之前对动态规划学到什么程度,一定要先看 我讲的 动态规划理论基础。 如果没做过动态规划的题目,看我讲的理论基础,会有感觉 是不是简单题想复杂了? 其实并没有,我讲的理论基础内容,在动规章节所有题目都有运用,所以很重要!…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心

当仓库学会“思考”&#xff0c;物流的终极形态正在诞生 想象这样的场景&#xff1a; 凌晨3点&#xff0c;某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径&#xff1b;AI视觉系统在0.1秒内扫描包裹信息&#xff1b;数字孪生平台正模拟次日峰值流量压力…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...