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 中实现视频帧的逐帧读取、处理、显示和保存。

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

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

相关文章

ubuntu安装navicat,并使用navicat连接mysql服务

1.安装宝塔: 登录宝塔官网:https://www.bt.cn/new/download.html 使用对应命令安装宝塔,然后搭建mysql环境。 2.安装navicat 有需要教程的私我,我再更新整理出来 !!! 有需要教程的私我&#xf…

深度学习:MindSpore自动并行

随着模型规模的逐渐增大,需要的算力逐渐增强,但是算力需求增长速度远高于芯片算力增长速度。现在唯一的解决方案只有通过超大规模集群训练大模型。 大集群训练大模型的挑战 内存墙 200B参数量的模型,参数内存占用745GB内存,训练…

Qt Designer Ui设计 功能增加

效果展示 输入密码,密码错误,弹出提示 密码正确,弹出提示并且关闭原窗口 代码(只提供重要关键主代码)lxh_log.py代码: import sysfrom PySide6.QtWidgets import QApplication, QWidget, QPushButtonfrom …

版本控制器git

版本控制git 什么是版本控制? 版本控制是一种跟踪管理文件变化的技术,特别是软件源码的修改、更新、和历史记录。当程序员想要进行用到之前版本的代码可以进行查看、协作、并编辑文件。 举个栗子 当一位初入职场的萌新程序员在进行执行产品经理的需求时…

jetbrain 插件开发初体验

idea插件开发初体验 背景 标准化的git commit Message很重要&#xff0c;一直以来我用的都是commit-template-idea-plugin&#xff0c;他提供的模板遵循了conventionalcommits规范 <type>(<scope>): <subject> <BLANK LINE> <body> <BLANK…

解决raw.githubusercontent.com无法访问的问题

显示报错&#xff1a;ConnectionError: Couldn’t reach https://raw.githubusercontent.com/huggingfac 无法访问 在https://www.ipaddress.com 或者ip138.com网站中的查询框中输入&#xff1a;raw.githubusercontent.com 回车就能有下图中的网页&#xff0c;在里面找到相应的…

高效职场人

文章目录 1.时间效能 ABCD2.高效员工的习惯之 自我掌控的秘诀3.学会做主4.学会互赢5.学会沟通、学会聆听6.学会可持续发展&#xff1a;四个方面更新自我(1)更新身体(2)更新精神(3)更新智力(4)更新人际情感 1.时间效能 ABCD 时间四象限&#xff1a; A类任务&#xff1a;重要且紧…

数据结构 (33)选择类排序

前言 数据结构中的选择类排序主要包括简单选择排序&#xff08;也称为选择排序&#xff09;和堆排序。 一、简单选择排序 基本思想&#xff1a;简单选择排序是一种直观易懂的排序算法。它的工作原理是&#xff0c;在未排序序列中找到最小&#xff08;或最大&#xff09;元素&am…

Kubernetes架构原则和对象设计(二)

云原生学习路线导航页&#xff08;持续更新中&#xff09; kubernetes学习系列快捷链接 Kubernetes架构原则和对象设计&#xff08;一&#xff09;Kubernetes常见问题解答 本文从云计算架构发展入手&#xff0c;详细分析了kubernetes的生态系统、设计理念、分层架构、API设计…

自建服务器,数据安全有保障

在远程桌面工具的选择上&#xff0c;向日葵和TeamViewer功能强大&#xff0c;但都存在收费昂贵、依赖第三方服务器、数据隐私难以完全掌控等问题。相比之下&#xff0c;RustDesk 凭借开源免费、自建服务的特性脱颖而出&#xff01;用户可以在自己的服务器上部署RustDesk服务端&…

发布Apache2.4** 局域网无法访问

1。 防火墙关闭 或者 设置入站规则 2&#xff0c;查看httpd.conf 文件 设置配置 原 Listen 80 修改成 Listen 192.168.31.127:90 3.确保 本地IP 是否正确

Flutter解压文件并解析数据

Flutter解压文件并解析数据 前言 在 Flutter 开发中&#xff0c;我们经常需要处理文件的读取和解压。 这在处理应用数据更新、安装包、存档文件等场景中尤为常见。 本文将介绍如何在Flutter中使用archive插件来解压文件并解析数据。 准备 在开始之前&#xff0c;我们需要…

HiveSQL题——炸裂函数(explodeposexplode)

目录 一、炸裂函数的知识点 1.1?炸裂函数 ?explode? posexplode 1.2 lateral view 侧写视图 二、实际案例 2.1 每个学生及其成绩 0 问题描述 1 数据准备 2 数据分析 3 小结 2.2?日期交叉问题 0 问题描述 1 数据准备 2 数据分析 3 小结 2.3?用户消费金额 …

从差分电容到多轴测量:解读 BendLabs 柔性弯曲传感器核心技术

BendLabs是一家技术公司&#xff0c;致力于通过灵活的软传感解决方案将运动测量和理解带给世界。BendLabs柔性弯曲传感器由医用级有机硅制成&#xff0c;能够满足精确、多轴、柔软、灵活的传感需求。BendLabs柔性弯曲传感器采用差分电容原理&#xff0c;具有高精度、低功耗、无…

【数字电路与逻辑设计】实验二 数值比较器

文章总览&#xff1a;YuanDaiMa2048博客文章总览 【数字电路与逻辑设计】实验二 数值比较器 一、实验内容二、设计过程&#xff08;一&#xff09;真值表&#xff08;二&#xff09;设计思路 三、源代码&#xff08;一&#xff09;代码说明&#xff1a;&#xff08;二&#xff…

39 vector深入理解 · 迭代器失效深度浅拷贝

目录 一、迭代器失效 &#xff08;一&#xff09;外部迭代器失效 1、扩容引起的野指针问题 2、删除引起的逻辑问题 二、深度浅拷贝 一、迭代器失效 迭代器可以理解为像指针一样的类对象&#xff0c;但不要一味地认为迭代器就是指针&#xff0c;指针可以实现迭代器&#xff…

2024年认证杯SPSSPRO杯数学建模C题(第一阶段)云中的海盐解题全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 C题 云中的海盐 原题再现&#xff1a; 巴黎气候协定提出的目标是&#xff1a;在2100年前&#xff0c;把全球平均气温相对于工业革命以前的气温升幅控制在不超过2摄氏度的水平&#xff0c;并为1.5摄氏度而努力。但事实上&#xff0c;许多之前的…

AI智能体Prompt预设词指令大全+GPTs应用使用

AI智能体使用指南 直接复制在AI工具助手中使用&#xff08;提问前&#xff09; 可前往SparkAi系统用户官网进行直接使用 SparkAI系统介绍文档&#xff1a;Docs 常见AI智能体GPTs应用大全在线使用 自定义添加制作AI智能体进行使用&#xff1a; 文章润色器 你是一位具有敏锐洞察…

Origin快速拟合荧光寿命、PL Decay (TRPL)数据分析处理-方法二

1.先导入数据到origin 2.导入文件的时候注意&#xff1a;名字短的这个是&#xff0c;或者你打开后看哪个里面有800&#xff0c;因为我的激光重频是1.25Hz&#xff08;应该是&#xff0c;不太确定单位是KHz还是MHz&#xff09;&#xff0c;所以对应的时间是800s。 3.选中两列直接…

Mybatis框架进阶(标签)

1. <if>标签 DROP DATABASE IF EXISTS mybatis_test; CREATE DATABASE mybatis_test DEFAULT CHARACTER SET utf8mb4; use mybatis_test;DROP TABLE IF EXISTS user_info; CREATE TABLE user_info (id INT ( 11 ) NOT NULL AUTO_INCREMENT,username VARCHAR ( 127 ) NOT…