视频基础操作

1.1. 例子

读取mp4格式的视频,将每一帧改为灰度图,并且打上水印(“WaterMark”),并将其输出保存为out.mp4,在这个例子中可以看到视频读取,每帧数据处理,视频保存的整体流程简单示例

import cv2try:cap=cv2.VideoCapture("CatCloth.mp4")if not cap.isOpened():print("Video can't be opened")raise IOError# 获取视频的宽度、高度和帧率width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))fps = cap.get(cv2.CAP_PROP_FPS)delay=int(1000/(fps)) #计算每帧视频播放延时# 创建 VideoWriter 对象fourcc = cv2.VideoWriter_fourcc(*'mp4v')output_path="OutPut.mp4"out = cv2.VideoWriter(output_path, fourcc, fps, (width, height))while True:ret,frame=cap.read() #读取一帧数据if not ret:break#对每一帧图像进行处理# 转换为灰度图像gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 打上水印cv2.putText(gray_frame, "WaterMark", (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)# 写入输出文件out.write(gray_frame)# 显示处理后的帧cv2.imshow("Processed Video", gray_frame)#此处延迟FPS计算出来的时间,按照视频原有速度播放视频 按q键退出if(cv2.waitKey(delay)&0xff==ord('q')):break# 释放 VideoCapture 和 VideoWriter 对象及所有窗口资源cap.release() out.release()cv2.destroyAllWindows() 
except IOError as e:print(f'IOError:{e}')
except Exception as e:print(f"Error: {e}")

1.2. 常见操作补充说明

1.2.1. 读取视频文件或摄像头

使用 cv2.VideoCapture() 可以读取视频文件或摄像头。

cv2.VideoCapture 是一个用于捕获视频的类,可以从视频文件、摄像头或网络视频流中读取视频帧。它的构造函数和方法支持多种参数和重载形式,以便灵活地处理不同的视频源。

  1. 默认构造函数
cap = cv2.VideoCapture()
    • 创建一个空的 VideoCapture 对象,通常用于后续调用 open() 方法打开视频源。
  1. 从视频文件或摄像头打开
cap = cv2.VideoCapture(filename, apiPreference=CAP_ANY)
    • filename:视频文件路径或摄像头索引(整数,如 0 表示默认摄像头)。
    • apiPreference:指定使用的后端 API(如 cv2.CAP_ANYcv2.CAP_FFMPEG 等)。默认值为 cv2.CAP_ANY,表示自动选择合适的后端。
  1. 从视频文件或摄像头打开(带参数)
cap = cv2.VideoCapture(filename, apiPreference, params)
    • params:一个参数列表,用于指定额外的配置(如分辨率、帧率等)。参数以 (paramId, paramValue) 的形式传递。

常用参数解释:

  • filename
    • 可以是视频文件路径(如 'video.mp4')。
    • 可以是摄像头索引(如 0)。
    • 可以是网络视频流的 URL(如 'http://192.168.1.100:8080/video')。
  • apiPreference
    • 指定使用的后端 API,例如:
      • cv2.CAP_ANY:自动选择后端。
      • cv2.CAP_FFMPEG:使用 FFmpeg 后端。
      • cv2.CAP_MSMF:使用 Microsoft Media Foundation 后端(Windows)。
      • cv2.CAP_V4L:使用 Video4Linux 后端(Linux)。
  • params
    • 一个参数列表,用于指定额外的配置。例如:
      • cv2.CAP_PROP_FRAME_WIDTH:设置帧宽度。
      • cv2.CAP_PROP_FRAME_HEIGHT:设置帧高度。
      • cv2.CAP_PROP_FPS:设置帧率。

# 读取视频文件 自动选择后端,且无其他设置
cap = cv2.VideoCapture("example.mp4")# 读取摄像头
# cap = cv2.VideoCapture(0)  # 默认摄像头(索引0)#检查视频是否正确读取
if not cap.isOpened():print("Video can't be opened")return

1.2.2. 获取视频属性

可以通过 cap.get() 获取视频的各种属性,例如宽度、高度、帧率等。

width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)  # 帧宽
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)  # 帧高
fps = cap.get(cv2.CAP_PROP_FPS)  # 帧率
print(f"Width: {width}, Height: {height}, FPS: {fps}")

1.2.3. 逐帧读取视频

通过循环逐帧读取视频,并处理每一帧。

while cap.isOpened():ret, frame = cap.read()  # 读取一帧if not ret:break  # 视频结束## 显示当前帧cv2.imshow("Frame", frame)# 按下 'q' 键退出if cv2.waitKey(25) & 0xFF == ord('q'):breakcap.release()  # 释放视频流
cv2.destroyAllWindows()

1.2.4. 保存视频

使用 cv2.VideoWriter() 可以将处理后的视频保存为文件。

cv2.VideoWriter() 是 OpenCV 库中用于创建视频写入对象的函数,可以将一组图像帧保存为视频文件。

#函数参数介绍
cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor])

参数介绍:

  • filename (str): 输出视频文件的路径。
  • fourcc (int): 指定编码器的四字符代码(FourCC)。
    • 例如:
    • - FFmpeg 使用:
        • cv2.VideoWriter_fourcc(*'mp4v')
        • cv2.VideoWriter_fourcc(*'XVID')
    • Windows 开发版 上编译的 OpenCV 使用
      • cv2.VideoWriter_fourcc(*'MJPG')
  • fps (float): 视频的帧率(每秒帧数)。
  • frameSize (tuple): 视频帧的尺寸(宽,高)。
  • isColor (bool, optional): 指示视频是否为彩色。默认为 True(彩色)。如果设置为 False,输出视频将为灰度。
# 设置视频编码器和帧率
fourcc = cv2.VideoWriter_fourcc(*'XVID')  # 使用 XVID 编码器
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))  # 文件名、编码器、帧率、尺寸# 写入帧
while cap.isOpened():ret, frame = cap.read()if not ret:breakout.write(frame)  # 写入帧cv2.imshow("Frame", frame)if cv2.waitKey(25) & 0xFF == ord('q'):breakcap.release()
out.release()  # 关闭视频写入
cv2.destroyAllWindows()

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

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

相关文章

21vue3实战-----git husky和git commit规范

21vue3实战-----git husky和git commit规范 1.husky工具1.1目的1.2如何做到这一点?1.3步骤 2.git commit规范2.1使用Commitizen自动生成规范格式供选择2.2代码提交风格2.3代码提交验证 之前在https://blog.csdn.net/fageaaa/article/details/145474065文章中已经讲了在vue项目…

arduino扩展:Arduino Mega 控制 32 个舵机(参考表情机器人)

参考:表情机器人中使用22个舵机的案例 引言 在电子制作与自动化控制领域,Arduino 凭借其易用性和强大的扩展性备受青睐。Arduino Mega 作为其中功能较为强大的一款开发板,具备丰富的引脚资源,能够实现复杂的控制任务。舵机作为常…

PyQt学习记录03——批量设置水印

0. 目录 PyQt学习记录01——加法计算器 PyQt学习记录02——串口助手 1. 前言 本次主要是为了学习Qt中的 QFileDialog 函数, QFileDialog.getExistingDirectory:用于选择文件夹,返回的是一个文件夹路径。 QFileDialog.getOpenFileName&…

Visual Studio 使用 “Ctrl + /”键设置注释和取消注释

问题:在默认的Visual Studio中,选择单行代码后,按下Ctrl /键会将代码注释掉,但再次按下Ctrl /键时,会进行双重注释,这不是我们想要的。 实现效果:当按下Ctrl /键会将代码注释掉,…

社区版IDEA中配置TomCat(详细版)

文章目录 1、下载Smart TomCat2、配置TomCat3、运行代码 1、下载Smart TomCat 由于小编的是社区版,没有自带的tomcat server,所以在设置的插件里面搜索,安装第一个(注意:安装时一定要关闭外网,小编因为这个…

Flink-DataStream API

一、什么样的数据可以用于流式传输 Flink的DataStream API 允许流式传输他们可以序列化的任何内容。Flink自己的序列化程序用于 基本类型:即字符串、长、整数、布尔值、数组复合类型:元组、POJO和Scala样例类 基本类型我们已经很熟悉了,下…

渗透利器:Burp Suite 联动 XRAY 图形化工具.(主动扫描+被动扫描)

Burp Suite 联动 XRAY 图形化工具.(主动扫描被动扫描) Burp Suite 和 Xray 联合使用,能够将 Burp 的强大流量拦截与修改功能,与 Xray 的高效漏洞检测能力相结合,实现更全面、高效的网络安全测试,同时提升漏…

Java 大视界 -- 深入剖析 Java 在大数据内存管理中的优化策略(49)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

JVM ②-双亲委派模型 || 垃圾回收GC

这里是Themberfue 在上节课对内存区域划分以及类加载的过程有了简单的了解后,我们再了解其他两个较为重要的机制,这些都是面试中常考的知识点,有必要的话建议背出来,当然不是死记硬背,而是要有理解的背~~~如果对 JVM …

html文件怎么转换成pdf文件,2025最新教程

将HTML文件转换成PDF文件,可以采取以下几种方法: 一、使用浏览器内置功能 打开HTML文件:在Chrome、Firefox、IE等浏览器中打开需要转换的HTML文件。打印对话框:按下CtrlP(Windows)或CommandP(M…

2025 西湖论剑wp

web Rank-l 打开题目环境: 发现一个输入框,看一下他是用上面语言写的 发现是python,很容易想到ssti 密码随便输,发现没有回显 但是输入其他字符会报错 确定为ssti注入 开始构造payload, {{(lipsum|attr(‘global…

Web前端开发--HTML

HTML快速入门 1.新建文本文件&#xff0c;后缀名改为.html 2.编写 HTML结构标签 3.在<body>中填写内容 HTML结构标签 特点 1.HTML标签中不区分大小写 2.HTML标签属性值中可以使用单引号也可使用双引号 3.HTML语法结构比较松散&#xff08;但在编写时要严格一点&…

网络工程师 (30)以太网技术

一、起源与发展 以太网技术起源于20世纪70年代&#xff0c;最初由Xerox公司的帕洛阿尔托研究中心&#xff08;PARC&#xff09;开发。最初的以太网采用同轴电缆作为传输介质&#xff0c;数据传输速率为2.94Mbps&#xff08;后发展为10Mbps&#xff09;&#xff0c;主要用于解决…

ONES 功能上新|ONES Copilot、ONES TestCase、ONES Wiki 新功能一览

ONES Copilot 支持基于当前查看的工作项相关信息&#xff0c;利用 AI 模型&#xff0c;在系统中进行相似工作项的查找&#xff0c;包括基于已关联工作项的相似数据查找。 应用场景&#xff1a; 在查看工作项时&#xff0c;可利用 AI 模型&#xff0c;基于语义相似度&#xff0c…

从 X86 到 ARM :工控机迁移中的核心问题剖析

在工业控制领域&#xff0c;技术的不断演进促使着工控机从 X86 架构向 ARM 架构迁移。然而&#xff0c;这一过程并非一帆风顺&#xff0c;面临着诸多关键挑战。 首先&#xff0c;软件兼容性是一个重要问题。许多基于 X86 架构开发的工业控制软件可能无法直接在 ARM 架构上运行…

《qt open3d网格平滑》

qt open3d网格平滑 效果展示二、流程三、代码效果展示 二、流程 创建动作,链接到槽函数,并把动作放置菜单栏 参照前文 三、代码 1、槽函数实现 void on_actionFilterSmoothSimple_triggered();void MainWindow::on_actionF

Redis 的缓存雪崩、缓存穿透和缓存击穿详解,并提供多种解决方案

本文是对 Redis 知识的补充&#xff0c;在了解了如何搭建多种类型的 Redis 集群&#xff0c;并清楚了 Redis 集群搭建的过程的原理和注意事项之后&#xff0c;就要开始了解在使用 Redis 时可能出现的突发问题和对应的解决方案。 引言&#xff1a;虽然 Redis 是单线程的&#xf…

路由过滤方法与常用工具

引言 在前面我们已经学习了路由引入&#xff0c;接下来我们就更进一步来学习路由过滤 前一篇文章&#xff1a;重发布&#xff1a;路由引入&#xff08;点击即可&#xff09; 路由过滤 定义&#xff1a;路由器在发布或者接收消息时&#xff0c;可能需要对路由信息进行过滤。 作用…

元宵佳节,我的创作纪念日:技术之路的回顾与展望

今天是元宵节&#xff0c;一个象征着团圆与美好的节日。巧合的是&#xff0c;今天也是我作为技术博客博主的创作纪念日。在这个特别的日子里&#xff0c;我想和大家分享我的创作故事&#xff0c;回顾初心、总结收获、展望未来&#xff0c;同时也希望能为正在技术道路上探索的你…

【STM32】H743的以太网MAC控制器的一个特殊功能

调试743的MAC&#xff0c;翻阅手册的时候&#xff0c;发现了一个有意思的功能 混杂模式 H743的MAC控制器&#xff0c;可以设置为混杂模式&#xff0c;这就意味着它可以做一些网络监控的应用&#xff0c;譬如连接具备端口镜像功能的交换机&#xff0c;然后直接代替PC实现网络数据…