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

2024-12-04OpenCV视频处理基础

OpenCV视频处理基础

OpenCV的视频教学:https://www.bilibili.com/video/BV14P411D7MH


1-OpenCV视频捕获


在 OpenCV 中,cv2.VideoCapture() 是一个用于捕获视频流的类。它可以用来从摄像头捕获实时视频,或者从视频文件中读取帧。以下是如何使用 cv2.VideoCapture() 实现视频捕获、设置捕获属性以及释放捕获对象的详细步骤。

1. 使用 cv2.VideoCapture() 捕获摄像头

import cv2# 打开默认摄像头(通常是0)
cap = cv2.VideoCapture(0)if not cap.isOpened():print("无法打开摄像头")exit()while True:# 读取一帧ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法获取帧")break# 显示帧cv2.imshow('Camera Feed', frame)# 按下 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

2. 使用 cv2.VideoCapture() 捕获视频文件

import cv2# 打开视频文件
cap = cv2.VideoCapture('video.mp4')if not cap.isOpened():print("无法打开视频文件")exit()while True:# 读取一帧ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("视频结束或无法读取帧")break# 显示帧cv2.imshow('Video Playback', frame)# 按下 'q' 键退出循环if cv2.waitKey(30) & 0xFF == ord('q'):break# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

3. 设置视频捕获属性

OpenCV 允许你通过 cap.set() 方法来设置视频捕获的属性。常见的属性包括帧宽、帧高、帧率等。

import cv2# 打开默认摄像头
cap = cv2.VideoCapture(0)if not cap.isOpened():print("无法打开摄像头")exit()# 设置帧宽和帧高
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)# 设置帧率(每秒帧数)
cap.set(cv2.CAP_PROP_FPS, 30)while True:# 读取一帧ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法获取帧")break# 显示帧cv2.imshow('Camera Feed', frame)# 按下 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

4. 释放视频捕获对象

无论你是从摄像头还是视频文件捕获视频,在完成视频处理后,都应该释放 cv2.VideoCapture() 对象,并关闭所有打开的窗口。

cap.release()
cv2.destroyAllWindows()

总结

  • cv2.VideoCapture(0) 用于捕获摄像头视频。
  • cv2.VideoCapture('file.mp4') 用于捕获视频文件。
  • cap.set(propId, value) 用于设置视频捕获属性。
  • cap.release() 用于释放视频捕获对象。
  • cv2.destroyAllWindows() 用于关闭所有 OpenCV 窗口。

通过这些步骤,你可以在 OpenCV 中实现视频捕获、设置属性以及释放资源。


2-OpenCV视频写入


在 OpenCV 中,cv2.VideoWriter() 是一个用于将视频帧写入视频文件的类。你可以使用 cv2.VideoWriter() 将捕获到的帧写入到视频文件中。以下是如何使用 cv2.VideoWriter() 实现视频写入、设置写入参数、逐帧写入以及释放写入对象的详细步骤。

1. 使用 cv2.VideoWriter() 写入视频

首先,你需要创建一个 cv2.VideoWriter() 对象,并指定视频文件的输出路径、编解码器、帧率和帧大小。

import cv2# 打开默认摄像头
cap = cv2.VideoCapture(0)if not cap.isOpened():print("无法打开摄像头")exit()# 获取帧的宽度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 定义输出视频文件的参数
out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height))while True:# 读取一帧ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法获取帧")break# 写入帧到视频文件out.write(frame)# 显示帧cv2.imshow('Camera Feed', frame)# 按下 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break# 释放捕获对象和写入对象,并关闭所有窗口
cap.release()
out.release()
cv2.destroyAllWindows()

2. 设置视频写入参数

在创建 cv2.VideoWriter() 对象时,你需要设置以下参数:

  • 文件名:输出视频文件的路径。
  • FourCC:编解码器,这是一个 4 字节的代码,表示视频编解码器。常用的编解码器包括:
    • cv2.VideoWriter_fourcc('M','J','P','G')cv2.VideoWriter_fourcc(*'MJPG') 表示 Motion JPEG。
    • cv2.VideoWriter_fourcc('X','V','I','D')cv2.VideoWriter_fourcc(*'XVID') 表示 XVID。
  • 帧率:每秒帧数(FPS),通常设置为 30 或 25。
  • 帧大小:视频的宽度和高度。
# 定义输出视频文件的参数
out = cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height))

3. 逐帧写入视频

在读取每一帧后,你可以使用 out.write(frame) 将帧写入视频文件。

while True:# 读取一帧ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法获取帧")break# 写入帧到视频文件out.write(frame)# 显示帧cv2.imshow('Camera Feed', frame)# 按下 'q' 键退出循环if cv2.waitKey(1) & 0xFF == ord('q'):break

4. 释放视频写入对象

在完成视频写入后,你应该释放 cv2.VideoCapture()cv2.VideoWriter() 对象,并关闭所有打开的窗口。

# 释放捕获对象和写入对象,并关闭所有窗口
cap.release()
out.release()
cv2.destroyAllWindows()

总结

  • cv2.VideoWriter('output.avi', cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), 30, (frame_width, frame_height)) 用于创建视频写入对象。
  • out.write(frame) 用于逐帧写入视频。
  • out.release() 用于释放视频写入对象。
  • cap.release() 用于释放视频捕获对象。
  • cv2.destroyAllWindows() 用于关闭所有 OpenCV 窗口。

通过这些步骤,你可以在 OpenCV 中实现视频写入、设置参数、逐帧写入以及释放资源。


3-OpenCV视频帧处理


在 OpenCV 中,你可以逐帧读取视频帧,对这些帧进行处理,显示处理后的帧,并将处理后的帧保存到视频文件中。以下是如何实现这些功能的详细步骤。

1. 逐帧读取视频帧

使用 cv2.VideoCapture() 对象的 read() 方法逐帧读取视频帧。

import cv2# 打开视频文件或摄像头
cap = cv2.VideoCapture('video.mp4')  # 或者 cap = cv2.VideoCapture(0) 为摄像头if not cap.isOpened():print("无法打开视频文件或摄像头")exit()while True:# 读取一帧ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法获取帧或视频结束")break# 对帧进行处理processed_frame = process_frame(frame)# 显示处理后的帧cv2.imshow('Processed Frame', processed_frame)# 按下 'q' 键退出循环if cv2.waitKey(30) & 0xFF == ord('q'):break# 释放捕获对象并关闭所有窗口
cap.release()
cv2.destroyAllWindows()

2. 处理视频帧

你可以对视频帧进行各种处理,例如滤波、增强、特征提取等。以下是一个简单的例子,对帧进行灰度处理。

def process_frame(frame):# 将帧转换为灰度gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)return gray_frame

3. 显示视频帧

使用 cv2.imshow() 函数显示处理后的帧。

cv2.imshow('Processed Frame', processed_frame)

4. 保存处理后的视频帧

将处理后的帧写入一个新的视频文件。你需要创建一个 cv2.VideoWriter() 对象来实现这一点。

import cv2# 打开视频文件或摄像头
cap = cv2.VideoCapture('video.mp4')  # 或者 cap = cv2.VideoCapture(0) 为摄像头if not cap.isOpened():print("无法打开视频文件或摄像头")exit()# 获取原始帧的宽度和高度
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 创建 VideoWriter 对象
out = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*'mp4v'), 30, (frame_width, frame_height))while True:# 读取一帧ret, frame = cap.read()# 检查是否成功读取帧if not ret:print("无法获取帧或视频结束")break# 对帧进行处理processed_frame = process_frame(frame)# 显示处理后的帧cv2.imshow('Processed Frame', processed_frame)# 将处理后的帧写入视频文件out.write(processed_frame)# 按下 'q' 键退出循环if cv2.waitKey(30) & 0xFF == ord('q'):break# 释放捕获对象和写入对象,并关闭所有窗口
cap.release()
out.release()
cv2.destroyAllWindows()

总结

  • 使用 cv2.VideoCapture() 逐帧读取视频帧。
  • 对每一帧进行处理,例如转换为灰度、应用滤波器等。
  • 使用 cv2.imshow() 显示处理后的帧。
  • 使用 cv2.VideoWriter() 将处理后的帧写入新的视频文件。

通过这些步骤,你可以在 OpenCV 中实现视频帧的逐帧读取、处理、显示和保存。

相关文章:

2024-12-04OpenCV视频处理基础

OpenCV视频处理基础 OpenCV的视频教学:https://www.bilibili.com/video/BV14P411D7MH 1-OpenCV视频捕获 在 OpenCV 中,cv2.VideoCapture() 是一个用于捕获视频流的类。它可以用来从摄像头捕获实时视频,或者从视频文件中读取帧。以下是如何使用…...

D89【python 接口自动化学习】- pytest基础用法

day89 pytest的setup,setdown详解 学习日期:20241205 学习目标:pytest基础用法 -- pytest的setup,setdown详解 学习笔记: setup、teardown详解 模块级 setup_module/teardown_module 开始于模块始末,生…...

七、docker registry

七、docker registry 7.1 了解Docker Registry 7.1.1 介绍 registry 用于保存docker 镜像,包括镜像的层次结构和元数据。启动容器时,docker daemon会试图从本地获取相关的镜像;本地镜像不存在时,其将从registry中下载该镜像并保…...

FlightGear+MATLAB+飞行手柄实现实时飞控视景系统

文章目录 一、软件配置二、FlightGearMATLAB联合仿真第一步 复制文件第二步 新建文件夹第三步 打开demo第四步 demo说明第五步 打开Simulink第六步 连接FlightGear第七步 设置FlightGear第八步 生成FlightGear连接文件FlightGear的设置Network的设置File的设置生成.bat文件 第九…...

深入 Java 基础 XML:高级特性与最佳实践

在上一篇文章中,我们对 Java 基础 XML 有了一个初步的认识,了解了 XML 的基本结构以及在 Java 中常见的解析方式。今天,我们将进一步深入探讨 Java 与 XML 的结合,包括一些高级特性和最佳实践。 一、XML 命名空间 在复杂的 XML …...

【论文阅读】Fifty Years of the ISCA: A Data-Driven Retrospective

学习体会: ISCA会议近五十年文章分析, 了解论文热点方向, 处理器依旧是热点! AI和并行是大趋势, 做XPU相关目前来说还是热点~ 摘录自原文 摘录: 数据来源和分析方法: 作者收集了 ACM 数字图书馆中所有 ISCA 论文,并使用 DBLP、Google Schol…...

TVbox源贡献指南

欢迎各路大佬踊跃提PR,分享爬虫代码。 源码仓库地址 https://github.com/lushunming/AndroidCatVodSpider 快速开始 本工程是一个完整的AndroidStudio工程,请你用AS打开编辑。 工程调试完毕后要需要导出生成jar文件配合软件使用,执行根目…...

qt数据类型定义(包含签名)

先推荐一个处理markdown表格的网站,超级好用:markdown表格处理,我就是用这个表格处理的excel中的数据上传。 下表整理了数据类型的值范围、签名、qt如何定义等内容。 类型范围/子类型dbus签名qt支持的签名qt类型定义方式转换为variantint8(…...

docker逃逸总结

一、 检查是否在docker容器中 通过以下两个地方来判断 # 是否存在此文件 ls -al /.dockerenv# 在其中是否包含docker字符串 cat /proc/1/cgroup除了上面两种外还有其他方式判断,如检测mount、fdisk -l查看硬盘 、判断PID 1的进程名等也可用来辅助判断。 容器逃逸…...

MySql:表的操作

目录 创建表 查看创建表时的信息 查看表的结构描述 删除一张表 修改表 创建表 CREATE TABLE [IF NOT EXISTS] table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; field 表示列名 datatype 表示…...

LVGL9 开关控件 (lv_switch) 使用指南

文章目录 前言主体1. **控件概述**2. **控件的样式和组成部分**3. **使用控件**改变开关状态 4. **事件处理**5. **按键支持**6. **示例代码** 总结 前言 lv_switch 是 LittlevGL 提供的一个开关控件,外观类似一个小型滑块,常用于实现开关功能&#xff…...

fastadmin 登录退出忽略中间提示页面

背景 研究了一圈CMS,从fastadmin、easyadmin、buildadmin、onethink等等几乎所有的框架CMS,当然也包括若依。 最后,根据当前项目综合考虑,还是选择的fastadmin: 预算经济实惠、维护成本低;工期端&#x…...

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中,目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎,这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…...

准确率99.9%的离线IP地址定位库 ip2region - python 示例

简介:ip2region是一个离线IP地址定位库和IP定位数据管理框架,10微秒级别的查询效率,提供了众多主流编程语言的 xdb 数据生成和查询客户端实现。号称准确率99.9%的开源离线IP地址定位库。 历史攻略: Python:暴力破解密…...

wordpress网站使用Linux宝塔面板和SQL命令行导入导出超过50M限制的数据库

wordpress网站使用Linux宝塔面板添加mysql数据库,使用phpMyAdmin工具导入sql数据库文件,会有最大限制50M。即使把sql数据库文件压缩为gzip或zip压缩包,压缩包也超过50M,该怎么办?怎样导入超过50M数据库呢? …...

开发基础(3):开发应用沉浸式效果 组件安全区方案

什么是沉浸式效果 典型应用全屏窗口UI元素包括状态栏、应用界面和底部导航条,其中状态栏和导航条,通常在沉浸式布局下称为避让区;避让区之外的区域称为安全区。 开发应用沉浸式效果主要指通过调整状态栏、应用界面和导航条的显示效果来减少状态栏导航条等系统界面的突兀感…...

Python中的数据可视化实战

一、前言 数据可视化是数据分析和报告中不可或缺的环节,它能够帮助我们直观地理解数据规律。Python提供了多个强大的可视化库,如Matplotlib、Seaborn、Plotly等。本文将通过实例演示这些工具的基本用法和高级技巧。 二、Matplotlib基础 1. Matplotlib的基本用法 import ma…...

计算机毕设-基于springboot的甜品店管理系统的设计与实现(附源码+lw+ppt+开题报告)

博主介绍:✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围:Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...

SpringMVC纯注解快速开发

此文章适合具有一定的java基础的同学看哦,如果有看不懂的基本代码还是先补补java基础哦。 此教程带您不使用xml文件而是纯注解开发,易懂、快捷、迅速,从0开始搭建,很快就能构建起一个SpringMVC项目,能学到两种使用tom…...

【JAVA】Java高级:多数据源管理与Sharding:在Spring Boot应用中实现多数据源的管理

一个电商平台可能需要一个数据库来存储用户信息,另一个数据库来存储订单信息,甚至可能还有一个数据库用于数据分析。这种情况下,如何在Spring Boot应用中实现多数据源的管理就显得尤为重要。 1. 多数据源管理的重要性 在实际应用中&#xf…...

Python|GIF 解析与构建(5):手搓截屏和帧率控制

目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件

今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

基于Docker Compose部署Java微服务项目

一. 创建根项目 根项目&#xff08;父项目&#xff09;主要用于依赖管理 一些需要注意的点&#xff1a; 打包方式需要为 pom<modules>里需要注册子模块不要引入maven的打包插件&#xff0c;否则打包时会出问题 <?xml version"1.0" encoding"UTF-8…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

MFC 抛体运动模拟:常见问题解决与界面美化

在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

【网络安全】开源系统getshell漏洞挖掘

审计过程&#xff1a; 在入口文件admin/index.php中&#xff1a; 用户可以通过m,c,a等参数控制加载的文件和方法&#xff0c;在app/system/entrance.php中存在重点代码&#xff1a; 当M_TYPE system并且M_MODULE include时&#xff0c;会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...