OpenCV(9):视频处理
1 介绍
视频是由一系列连续的图像帧组成的,每一帧都是一幅静态图像。视频处理的核心就是对这些图像帧进行处理。常见的视频处理任务包括视频读取、视频播放、视频保存、视频帧处理等。
- 视频分析: 通过视频处理技术,可以分析视频中的运动、目标、事件等。
- 视频增强: 对视频进行去噪、增强、稳定化等处理,提升视频质量。
- 视频编辑: 对视频进行剪辑、拼接、添加特效等操作。
- 实时监控: 通过摄像头实时监控场景,并进行目标检测、行为分析等。
OpenCV 提供了 cv2.VideoCapture 和 cv2.VideoWriter 两个类,分别用于视频的读取和写入。此外,OpenCV 还提供了丰富的图像处理函数,可以对视频帧进行各种操作。
2 视频读取与播放
2.1 读取视频文件
要读取视频文件,首先需要创建一个 cv2.VideoCapture 对象,并指定视频文件的路径。
import cv2# 创建 VideoCapture 对象,读取视频文件
cap = cv2.VideoCapture('example.mp4')# 检查视频是否成功打开
if not cap.isOpened():print("Error: Could not open video.")exit()# 读取视频帧
while True:ret, frame = cap.read()# 如果读取到最后一帧,退出循环if not ret:break# 显示当前帧cv2.imshow('Video', frame)# 按下 'q' 键退出if cv2.waitKey(25) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()

2.2 读取摄像头视频
除了读取视频文件,OpenCV 还可以直接从摄像头读取视频,只需将 cv2.VideoCapture 的参数设置为摄像头的索引(通常为0)即可:
import cv2# 创建 VideoCapture 对象,读取摄像头视频
cap = cv2.VideoCapture(0)# 检查摄像头是否成功打开
if not cap.isOpened():print("Error: Could not open camera.")exit()# 读取视频帧
while True:ret, frame = cap.read()# 如果读取到最后一帧,退出循环if not ret:break# 显示当前帧cv2.imshow('Camera', frame)# 按下 'q' 键退出if cv2.waitKey(25) & 0xFF == ord('q'):break# 释放资源
cap.release()
cv2.destroyAllWindows()
我这里并没有开启摄像头。

3 视频帧处理
3.1 帧的基本操作
在读取视频帧后,可以对每一帧进行各种图像处理操作。例如,可以将帧转换为灰度图像:
import cv2cap = cv2.VideoCapture('example.mp4')
cv2.namedWindow('Gray Video', 0)
cv2.resizeWindow('Gray Video', 640, 480)
while True:ret, frame = cap.read()if not ret:break# 将帧转换为灰度图像gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 显示灰度帧cv2.imshow('Gray Video', gray_frame)if cv2.waitKey(25) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

3.2 帧的保存
在处理视频帧时,有时需要将处理后的帧保存为新的视频文件。可以使用 cv2.VideoWriter 类来实现:
import cv2cap = cv2.VideoCapture('example.mp4')# 获取视频的帧率和尺寸
fps = int(cap.get(cv2.CAP_PROP_FPS))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))# 创建 VideoWriter 对象,保存处理后的视频
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, fps, (width, height))while True:ret, frame = cap.read()if not ret:break# 将帧转换为灰度图像gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 将灰度帧写入输出视频out.write(cv2.cvtColor(gray_frame, cv2.COLOR_GRAY2BGR))# 显示灰度帧cv2.imshow('Gray Video', gray_frame)if cv2.waitKey(25) & 0xFF == ord('q'):breakcap.release()
out.release()
cv2.destroyAllWindows()

4 视频处理的高级应用
4.1 视频中的物体检测
OpenCV 提供了多种物体检测算法,如 Haar 特征分类器、HOG + SVM 等。以下是一个使用 Haar 特征分类器进行人脸检测的示例:
import cv2# 加载 Haar 特征分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')cap = cv2.VideoCapture('example.mp4')while True:ret, frame = cap.read()if not ret:break# 将帧转换为灰度图像gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 检测人脸faces = face_cascade.detectMultiScale(gray_frame, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))# 在帧上绘制矩形框标记人脸for (x, y, w, h) in faces:cv2.rectangle(frame, (x, y), (x + w, y + h), (255, 0, 0), 2)# 显示带有人脸标记的帧cv2.imshow('Face Detection', frame)if cv2.waitKey(25) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()
4.2 视频中的运动检测
运动检测是视频处理中的一个重要应用。可以通过计算帧之间的差异来检测运动物体。以下是一个简单的运动检测示例:
import cv2cap = cv2.VideoCapture('example.mp4')
cv2.namedWindow('Motion Detection', cv2.WINDOW_NORMAL)
cv2.resizeWindow('Motion Detection', 640, 480)# 读取第一帧
ret, prev_frame = cap.read()
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)while True:ret, frame = cap.read()if not ret:break# 将当前帧转换为灰度图像gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)# 计算当前帧与前一帧的差异frame_diff = cv2.absdiff(prev_gray, gray_frame)# 对差异图像进行二值化处理_, thresh = cv2.threshold(frame_diff, 30, 255, cv2.THRESH_BINARY)# 显示运动检测结果cv2.imshow('Motion Detection', thresh)# 更新前一帧prev_gray = gray_frameif cv2.waitKey(25) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()

5 常用函数
| 功能 | 函数/方法 | 说明 |
|---|---|---|
| 读取视频 | cv2.VideoCapture() | 读取视频文件或摄像头。 |
| 逐帧读取视频 | cap.read() | 逐帧读取视频。 |
| 获取视频属性 | cap.get(propId) | 获取视频的属性(如宽度、高度、帧率等)。 |
| 保存视频 | cv2.VideoWriter() | 创建视频写入对象并保存视频。 |
| 视频帧处理 | 图像处理函数(如 cv2.cvtColor()) | 对视频帧进行图像处理。 |
| 目标跟踪 | cv2.TrackerKCF_create() | 使用目标跟踪算法跟踪视频中的物体。 |
| 运动检测 | cv2.createBackgroundSubtractorMOG2() | 使用背景减除算法检测视频中的运动物体。 |
5.1 cv2.VideoCapture
从视频文件或摄像头中捕获视频帧。
cv2.VideoCapture(source)
source: 视频文件路径或摄像头索引(通常为0表示默认摄像头)。
import cv2# 打开默认摄像头
cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()if not ret:breakcv2.imshow('Frame', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakcap.release()
cv2.destroyAllWindows()
5.2 cv2.VideoWriter
用于将视频帧写入视频文件。
cv2.VideoWriter(filename, fourcc, fps, frameSize)
filename: 输出视频文件名。fourcc: 视频编码器(如cv2.VideoWriter_fourcc(*'XVID'))。fps: 帧率。frameSize: 帧大小(宽度, 高度)。
import cv2cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'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(1) & 0xFF == ord('q'):breakcap.release()
out.release()
cv2.destroyAllWindows()
5.3 cv2.cvtColor
用于将图像从一种颜色空间转换为另一种颜色空间。
cv2.cvtColor(src, code)
src: 输入图像。code: 颜色空间转换代码(如cv2.COLOR_BGR2GRAY)。
import cv2img = cv2.imread('image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray Image', gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.4 cv2.resize
用于调整图像大小。
cv2.resize(src, dsize)
src: 输入图像。dsize: 输出图像大小(宽度, 高度)。
import cv2img = cv2.imread('image.jpg')
resized = cv2.resize(img, (320, 240))
cv2.imshow('Resized Image', resized)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.5 cv2.Canny
用于边缘检测。
cv2.Canny(image, threshold1, threshold2)
image: 输入图像。threshold1: 第一个阈值。threshold2: 第二个阈值。
import cv2img = cv2.imread('image.jpg', 0)
edges = cv2.Canny(img, 100, 200)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.6 cv2.findContours
用于查找图像中的轮廓。
cv2.findContours(image, mode, method)
image: 输入图像。mode: 轮廓检索模式(如cv2.RETR_TREE)。method: 轮廓近似方法(如cv2.CHAIN_APPROX_SIMPLE)。
import cv2img = cv2.imread('image.jpg', 0)
contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow('Contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.7 cv2.drawContours
用于绘制图像中的轮廓。
cv2.drawContours(image, contours, contourIdx, color, thickness)
image: 输入图像。contours: 轮廓列表。contourIdx: 轮廓索引(-1表示绘制所有轮廓)。color: 轮廓颜色。thickness: 轮廓线宽。
import cv2img = cv2.imread('image.jpg', 0)
contours, _ = cv2.findContours(img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)
cv2.imshow('Contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
5.8 cv2.putText
用于在图像上绘制文本。
cv2.putText(image, text, org, fontFace, fontScale, color, thickness)
image: 输入图像。text: 要绘制的文本。org: 文本左下角坐标。fontFace: 字体类型(如cv2.FONT_HERSHEY_SIMPLEX)。fontScale: 字体缩放比例。color: 文本颜色。thickness: 文本线宽。
import cv2img = cv2.imread('image.jpg')
cv2.putText(img, 'Hello, OpenCV!', (50, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)
cv2.imshow('Text', img)
cv2.waitKey(0)
cv2.destroyAllWindows()相关文章:
OpenCV(9):视频处理
1 介绍 视频是由一系列连续的图像帧组成的,每一帧都是一幅静态图像。视频处理的核心就是对这些图像帧进行处理。常见的视频处理任务包括视频读取、视频播放、视频保存、视频帧处理等。 视频分析: 通过视频处理技术,可以分析视频中的运动、目标、事件等。…...
【C++设计模式】观察者模式(1/2):从基础到优化实现
1. 引言 在 C++ 软件与设计系列课程中,观察者模式是一个重要的设计模式。本系列课程旨在深入探讨该模式的实现与优化。在之前的课程里,我们已对观察者模式有了初步认识,本次将在前两次课程的基础上,进一步深入研究,着重解决观察者生命周期问题,提升代码的安全性、灵活性…...
2025年华为手机解锁BL的方法
注:本文是我用老机型测试的,新机型可能不适用 背景 华为官方已经在2018年关闭了申请BL解锁码的通道,所以华为手机已经无法通过官方获取解锁码。最近翻出了一部家里的老手机华为畅玩5X,想着能不能刷个系统玩玩,但是卡…...
在 CentOS 7.9上部署 Oracle 11.2.0.4.0 数据库
目录 在 CentOS 7.9上部署 Oracle 11.2.0.4.0 数据库引言安装常见问题vim粘贴问题 环境情况环境信息安装包下载 初始环境准备关闭 SELinux关闭 firewalld 安装前初始化工作配置主机名安装依赖优化内核参数限制 Oracle 用户的 Shell 权限配置 PAM 模块配置swap创建用户组与用户,…...
idea里的插件spring boot helper 如何使用,有哪些强大的功能,该如何去习惯性的运用这些功能
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
Docker 搭建 Redis 数据库
Docker 搭建 Redis 数据库 前言一、准备工作二、创建 Redis 容器的目录结构三、启动 Redis 容器1. 通过 redis.conf 配置文件设置密码2. 通过 Docker 命令中的 requirepass 参数设置密码 四、Host 网络模式与 Port 映射模式五、检查 Redis 容器状态六、访问 Redis 服务总结 前言…...
JAVAweb之过滤器,监听器
文章目录 过滤器认识生命周期FilterConfigFilterChain过滤器执行顺序应用场景代码 监听器认识ServletContextListenerHttpSessionListenerServletRequestListener代码 过滤器 认识 Java web三大组件之一,与Servlet相似。过滤器是用来拦截请求的,而非处…...
计算机毕业设计SpringBoot+Vue.js足球青训俱乐部管理系统(源码+文档+PPT+讲解)
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
基于 DeepSeek LLM 本地知识库搭建开源方案(AnythingLLM、Cherry、Ragflow、Dify)认知
写在前面 博文内容涉及 基于 Deepseek LLM 的本地知识库搭建使用 ollama 部署 Deepseek-R1 LLM知识库能力通过 Ragflow、Dify 、AnythingLLM、Cherry 提供理解不足小伙伴帮忙指正 😃,生活加油 我站在人潮中央,思考这日日重复的生活。我突然想,…...
QSplashScreen --软件启动前的交互
目录 QSplashScreen 类介绍 使用方式 项目中使用 THPrinterSplashScreen头文件 THPrinterSplashScreen实现代码 使用代码 使用效果 QSplashScreen 类介绍 QSplashScreen 是 Qt 中的一个类,用于显示启动画面。它通常在应用程序启动时显示,以向用户显…...
「软件设计模式」责任链模式(Chain of Responsibility)
深入解析责任链模式:用C打造灵活的请求处理链 引言:当审批流程遇上设计模式 在软件系统中,我们经常会遇到这样的场景:一个请求需要经过多个处理节点的判断,每个节点都有权决定是否处理或传递请求。就像企业的请假审批…...
蓝桥杯嵌入式客观题以及解释
第十一届省赛(大学组) 1.稳压二极管时利用PN节的反向击穿特性制作而成 2.STM32嵌套向量终端控制器NVIC具有可编程的优先等级 16 个 3.一个功能简单但是需要频繁调用的函数,比较适用内联函数 4.模拟/数字转换器的分辨率可以通过输出二进制…...
你对WebAssembly的看法是什么?
WebAssembly(Wasm)是一种新兴的技术,旨在通过提供一种新的低级字节码格式来提高 Web 应用程序的性能和效率。它与 JavaScript 互补,使得开发者可以将其他编程语言(如 C、C、Rust 等)编译为高效的字节码&…...
Qt在Linux嵌入式开发过程中复杂界面滑动时卡顿掉帧问题分析及解决方案
Qt在Linux嵌入式设备开发过程中,由于配置较低,加上没有GPU,我们有时候会遇到有些组件比较多的复杂界面,在滑动时会出现掉帧或卡顿的问题。要讲明白这个问题还得从CPU和GPU的分工说起。 一、硬件层面核心问题根源剖析 CPU&#x…...
vscode 版本
vscode官网 Visual Studio Code - Code Editing. Redefined 但是官网只提供最新 在之前的版本就要去github找了 https://github.com/microsoft/vscode/releases 获取旧版本vscode安装包的方法_vscode 老版本-CSDN博客...
low rank decomposition如何用于矩阵的分解
1. 什么是矩阵分解和低秩分解 矩阵分解是将一个矩阵表示为若干结构更简单或具有特定性质的矩阵的组合或乘积的过程。低秩分解(Low Rank Decomposition)是其中一种方法,旨在将原矩阵近似为两个或多个秩较低的矩阵的乘积,从而降低复…...
C# string转unicode字符
在 C# 中,将字符串转换为 Unicode 字符(即每个字符的 Unicode 码点)可以通过遍历字符串中的每个字符并获取其 Unicode 值来实现。Unicode 值是一个整数,表示字符在 Unicode 标准中的唯一编号。 以下是实现方法: 1. 获…...
51单片机-串口通信编程
串行口工作之前,应对其进行初始化,主要是设置产生波特率的定时器1、串行口控制盒中断控制。具体步骤如下: 确定T1的工作方式(编程TMOD寄存器)计算T1的初值,装载TH1\TL1启动T1(编程TCON中的TR1位…...
Fisher信息矩阵与Hessian矩阵:区别与联系全解析
Fisher信息矩阵与Hessian矩阵:区别与联系全解析 在统计学和机器学习中,Fisher信息矩阵(FIM)和Hessian矩阵是两个经常出现的概念,它们都与“二阶信息”有关,常用来描述函数的曲率或参数的敏感性。你可能听说…...
有哪些开源大数据处理项目使用了大模型
以下是一些使用了大模型的开源大数据处理项目: 1. **RedPajama**:这是一个开源项目,使用了LLM大语言模型数据处理组件,对GitHub代码数据进行清洗和处理。具体流程包括数据清洗、过滤低质量样本、识别和删除重复样本等步骤。 2. …...
ubuntu离线安装Ollama并部署Llama3.1 70B INT4
文章目录 1.下载Ollama2. 下载安装Ollama的安装命令文件install.sh3.安装并验证Ollama4.下载所需要的大模型文件4.1 加载.GGUF文件(推荐、更容易)4.2 加载.Safetensors文件(不建议使用) 5.配置大模型文件 参考: 1、 如…...
机器学习数学通关指南——泰勒公式
前言 本文隶属于专栏《机器学习数学通关指南》,该专栏为笔者原创,引用请注明来源,不足和错误之处请在评论区帮忙指出,谢谢! 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 一句话总结 泰勒公式是用多…...
目标检测tricks
A. Stochastic Weight Averaging (SWA) 1. 基本思想 SWA 的核心思想是通过对训练过程中不同时间点的模型参数进行加权平均,从而获得一个更好的模型。具体来说,SWA 在训练过程的后期阶段对多个不同的模型快照(snapshots)进行平均…...
JNA基础使用,调用C++返回结构体
C端 test.h文件 #pragma oncestruct RespInfo {char* path;char* content;int statusCode; };extern "C" { DLL_EXPORT void readInfo(char* path, RespInfo* respInfo); }test.cpp文件 #include "test.h"void readInfo(char* path, RespInfo* respInfo…...
【算法】793. 高精度乘法
题目 793. 高精度乘法 思路 把b当作一个整体进行乘法,用A的每一位和b相乘,还要加上判断001的情况,把前面的0删掉。 代码 #include<iostream> #include<vector> using namespace std; vector<int>mul(vector<int>…...
解锁养生密码,拥抱健康生活
在快节奏的现代生活中,养生不再是一种选择,而是我们保持活力、提升生活质量的关键。它不是什么高深莫测的学问,而是一系列融入日常的简单习惯,每一个习惯都在为我们的健康加分。 早晨,当第一缕阳光洒进窗户,…...
OpenCV(6):图像边缘检测
图像边缘检测是计算机视觉和图像处理中的一项基本任务,它用于识别图像中亮度变化明显的区域,这些区域通常对应于物体的边界。是 OpenCV 中常用的边缘检测函数及其说明: 函数算法说明适用场景cv2.Canny()Canny 边缘检测多阶段算法,检测效果较…...
spark的一些指令
一,复制和移动 1、复制文件 格式:cp 源文件 目标文件 示例:把file1.txt 复制一份得到file2.txt 。那么对应的命令就是:cp file1.txt file2.txt 2、复制目录 格式:cp -r 源文件 目标文件夹 示例:把目…...
OpenHarmony全球化子系统
OpenHarmony全球化子系统 简介系统架构目录相关仓 简介 当OpenHarmony系统/应用在全球不同区域使用时,系统/应用需要满足不同市场用户关于语言、文化习俗的需求。全球化子系统提供支持多语言、多文化的能力,包括: 资源管理能力 根据设备类…...
创建私人阿里云docker镜像仓库
步骤1、登录阿里云 阿里云创建私人镜像仓库地址:容器镜像服务 步骤2、创建个人实例 步骤:【实例列表】 》【创建个人实例】 》【设置Registry登录密码】 步骤3、创建命名空间 步骤:【个人实例】》【命名空间】》【创建命名空间】 注意&am…...
