计算机视觉cv2入门之视频处理

在我们进行计算机视觉任务时,经常会对视频中的图像进行操作,这里我来给大家分享一下,cv2对视频文件的操作方法。这里我们主要介绍cv2.VideoCapture函数的基本使用方法。
cv2.VideoCapture函数
当我们在使用cv2.VideoCapture函数时,我们通常使用轮询的方式,即:
while True:if condition1:do somethingif condition2:break...
更一般化的是
import cv2
#这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename='')
cap=cv2.VideoCapture(index=0)
if cap.isOpened():while True:ret,frame=cap.read()#...#... 针对视频中的每一帧图像的其他操作#....if not ret:breakcv2.imshow('test',frame)key=cv2.waitKey(1)if key==27:#置顶一个按键来结束循环,这里使用esc健的ASCII码breakcap.release()cv2.destroyAllWindows()
else:print('摄像头未打开')
初始化
视频文件
如果你需要处理的是已有的视频文件,而不是打开摄像头捕获的实时视频流,那么只需要传入filename即可。apiPerference是可选参数主要用来指定视频捕获的后端,即使用哪种顶层API来读取视频流或摄像头,默认值是cv2.CAP_ANY由opencv自动选择
import cv2
'''
filename:视频文件路径 .mp4
apiPerference:指定视频捕获的后端(即使用哪种底层API来读取视频流或摄像头)apiPerference参数常用flag:
cv2.CAP_ANY: 自动选择默认后端(OpenCV自行决定)跨平台
cv2.CAP_ANDROID: 使用Android的Camera2 API
cv2.CAP_DSHOW: 使用DirectShow(Windows专用)
cv2.CAP_MSMF: 使用Microsoft Media Foundation(Windows 10+)
cv2.CAP_V4L2: 使用Video4Linux2(Linux专用)Linux
cv2.CAP_FFMPEG: 使用FFmpeg解码视频文件跨平台(需安装 FFmpeg)
cv2.CAP_GSTREAMER: 使用 GStreamer(Linux常用)
cv2.CAP_OPENNI: 用于深度摄像头(如Kinect)特定设备
'''
cap=cv2.VideoCapture(r'test.mp4')
实时视频流
如果你处理的是实时视频流,那么需要设置index参数,不使用外接设备时index一般都设置为apiPerference是可选参数主要用来指定视频捕获的后端,即使用哪种顶层API来读取视频流或摄像头,默认值是cv2.CAP_ANY由opencv自动选择
import cv2
'''
index:0或1,0是电脑内置摄像头,1是外接摄像头,没有外接摄像头仍然设置Index=1的话不会报错,只是代码不运行
apiPerference:指定视频捕获的后端(即使用哪种底层API来读取视频流或摄像头)apiPerference参数常用flag:
cv2.CAP_ANY: 自动选择默认后端(OpenCV自行决定)跨平台
cv2.CAP_ANDROID: 使用Android的Camera2 API
cv2.CAP_DSHOW: 使用DirectShow(Windows专用)
cv2.CAP_MSMF: 使用Microsoft Media Foundation(Windows 10+)
cv2.CAP_V4L2: 使用Video4Linux2(Linux专用)Linux
cv2.CAP_FFMPEG: 使用FFmpeg解码视频文件跨平台(需安装 FFmpeg)
cv2.CAP_GSTREAMER: 使用 GStreamer(Linux常用)
cv2.CAP_OPENNI: 用于深度摄像头(如Kinect)特定设备
'''
cap=cv2.VideoCapture(index=1,apiPreference=cv2.CAP_ANY)
常用属性
cap.isOpened()
检查视频源是否打开,返回值为True 或False
import cv2
cap=cv2.VideoCapture(index=0,apiPreference=cv2.CAP_MSMF)
if cap.isOpened():print('摄像头已打开')while True:ret,frame=cap.read()cv2.imshow('test',frame)key=cv2.waitKey(1)if key==27:#按下esc健退出breakcap.release()cv2.destroyAllWindows()
else:print('摄像头未打开')
cap.read()
用来读取视频中的下一帧,返回值为(ret,frame) ret为是否成功,frame为图像数据
cap.read()是我们处理视频文件中最关键的函数,如果没有这一步,那么根本无法处理视频文件中的图像。
import cv2
cap=cv2.VideoCapture(index=0,apiPreference=cv2.CAP_MSMF)
if cap.isOpened():print('摄像头已打开')while True:ret,frame=cap.read()if not ret:breakcv2.imshow('test',frame)key=cv2.waitKey(1)if key==27:#按下esc健退出breakcap.release()cv2.destroyAllWindows()
else:print('摄像头未打开')
cap.release()
用来释放视频源,出现在cv2.destroyAllWindows()前。
import cv2
#这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename='')
cap=cv2.VideoCapture(index=0)
if cap.isOpened():while True:ret,frame=cap.read()#...#...#....cv2.imshow('test',frame)key=cv2.waitKey(1)if key==27:#设定一个按键来结束循环,这里使用esc健的ASCII码breakcap.release()cv2.destroyAllWindows()
else:print('摄像头未打开')
视频属性控制
cap.get(propId)
用来获取当前视频的属性值,比如帧宽,高,FPS等。
这里我们以获取当前帧率并标记在窗口内为例:
fps=cv2.get(cv2.CAP_PROP_FPS)
fps的类型为Float
import cv2
#这里是获取实时视频源,如果是读取已有视频文件cap=cv2.VideoCapture(filename='')
cap=cv2.VideoCapture(index=0)
if cap.isOpened():while True:ret,frame=cap.read()fps=cap.get(cv2.CAP_PROP_FPS)#...#...#....cv2.putText(img=frame,text=f'fps:{fps}',org=(50,50),fontFace=1,fontScale=3,color=(255,0,0))cv2.imshow('test',frame)key=cv2.waitKey(1)if key==27:#设定一个按键来结束循环关闭摄像头,这里使用esc健的ASCII码breakcap.release()cv2.destroyAllWindows()
else:print('摄像头未打开')

最后,我将所有的本文所有的要点都总结在了下方这个表格里。
| 参数/方法 | 说明 |
|---|---|
| 初始化 | |
cap=cv2.VideoCapture() | 创建视频捕获对象,参数可以是设备索引(摄像头)或视频文件路径。 |
| 常用属性 | |
cap.isOpened() | 检查视频源是否成功打开,返回 True/False。 |
cap.read() | 读取下一帧,返回 (ret, frame),ret 为是否成功,frame 为图像数据。 |
cap.release() | 释放视频源。 |
| 视频属性控制 | |
cap.get(propId) | 获取视频属性值(如帧宽、高、FPS 等),propId 为属性标识。 |
cap.set(propId, value) | 设置视频属性值(部分属性可修改)。 |
| 常用属性标识(propId) | |
cv2.CAP_PROP_FRAME_WIDTH | 帧的宽度(像素)。 |
cv2.CAP_PROP_FRAME_HEIGHT | 帧的高度(像素)。 |
cv2.CAP_PROP_FPS | 视频的帧率(Frames Per Second)。 |
cv2.CAP_PROP_FRAME_COUNT | 视频的总帧数(仅对文件有效)。 |
cv2.CAP_PROP_POS_MSEC | 当前帧的时间戳(毫秒,仅对文件有效)。 |
cv2.CAP_PROP_POS_FRAMES | 当前帧的索引(从 0 开始)。 |
| 其他方法 | |
cap.grab() | 快速抓取下一帧(不解码),通常与 cap.retrieve() 配合使用。 |
cap.retrieve() | 解码并返回由 grab() 抓取的帧。 |
cap.getBackendName() | 返回当前使用的后端名称(如 FFMPEG、DSHOW)。 |
相关文章:
计算机视觉cv2入门之视频处理
在我们进行计算机视觉任务时,经常会对视频中的图像进行操作,这里我来给大家分享一下,cv2对视频文件的操作方法。这里我们主要介绍cv2.VideoCapture函数的基本使用方法。 cv2.VideoCapture函数 当我们在使用cv2.VideoCapture函数时ÿ…...
【Linux】Rhcsa复习5
一、Linux文件系统权限 1、文件的一般权限 文件权限针对三类对象进行定义: owner 属主,缩写u group 属组, 缩写g other 其他,缩写o 每个文件针对每类访问者定义了三种主要权限: r:read 读 w&…...
FFmpeg:M3U8的AES加密
1、加密用的key,命令: openssl rand 16>enc.key 2、目的是生成一个enc.key文件 生成iv openssl rand -hex 16 生成后记录下来这个字符串 3、新建一个enc.keyinfo文件,内容有如下三行: key URIenc.key的路径,…...
VMware虚拟机走主机代理上网
🌐 VMware虚拟机走主机代理上网🔑 你是否也遇到过这样的困境?💡 在虚拟机中测试某个项目,却因为网络限制而寸步难行。今天,就让我们一起探索如何让VMware虚拟机轻松调用本机的代理上网工具,开启…...
百级Function架构集成DeepSeek实践:Go语言超大规模AI工具系统设计
一、百级Function系统的核心挑战 1.1 代码结构问题 代码膨胀现象:单个文件超过2000行代码路由逻辑复杂:巨型switch-case结构维护困难依赖管理失控:跨Function依赖难以追踪 // 传统实现方式的问题示例 switch functionName { case "fu…...
Cursor入门教程-JetBrains过度向
Cursor使用笔记 **前置:**之前博主使用的是JetBrains的IDE,VSCode使用比较少,所以会尽量朝着JetBrains的使用习惯及样式去调整。 一、设置语言为中文 如果刚上手Cursor,那么肯定对Cursor中的众多选项配置项不熟悉,这…...
【人工智能】Agent未来市场与技术潜力分析
Agent作为连接大模型与具体场景的桥梁,正在成为AI技术落地的核心载体。结合2025年的市场动态与技术趋势,其未来潜力可从以下多个维度展开分析: 一、市场前景:爆发式增长与多层级需求 市场规模与增速 全球AI Agent市场规模预计从2024年的51亿美元增至2030年的471亿美元(年复…...
计算机视觉与深度学习 | TensorFlow基本概念与应用场景:MNIST 手写数字识别(附代码)
TensorFlow 基本概念 TensorFlow 是一个开源的机器学习框架,由 Google 开发,核心概念包括: 张量(Tensor):多维数组,是数据的基本单位。计算图(Graph):早期版本中用于描述数据流和计算过程,2.x 默认启用即时执行(Eager Execution),兼顾灵活性和性能。层(Layers)…...
Mac OS系统下kernel_task占用大量CPU资源导致系统卡顿
CPU负载突然飙升,如截图: 根本原因,大家从各种博主上已知晓,现在提供自己的解决办法,亲测有效 一、设置开机自动禁用温度管理守护进程 1.创建脚本文件 mkdir -p ~/Scripts touch ~/Scripts/disable_thermald.sh …...
宝塔面板部署 Dify-latest 最新版本
一、本地部署Windows 版本宝塔面板 宝塔面板是一款简单容易上手使用的服务器管理软件,它可以帮助用户方便地管理服务器以及部署网站等。 (1)在宝塔面板官网的下载界面,选择 windows 版本下载。点此进入下载 (2&#x…...
《TCP/IP网络编程》学习笔记 | Chapter 24:制作 HTTP 服务器端
《TCP/IP网络编程》学习笔记 | Chapter 24:制作 HTTP 服务器端 《TCP/IP网络编程》学习笔记 | Chapter 24:制作 HTTP 服务器端HTTP 概要理解 Web 服务器端无状态的 Stateless 协议请求消息(Request Message)的结构响应消息&#x…...
MCP(2)架构篇:深入理解MCP的设计架构
前言 在上一篇《MCP系列之基础篇》中,我们初步了解了MCP(模型上下文协议)的基本概念和价值。本篇文章将深入探讨MCP的技术架构,帮助开发者和技术爱好者更全面地理解这一协议的内部工作机制。我们将剖析MCP的核心组件、通信模型和工作流程,解析Host、Client和Server三者之…...
Origin将双Y轴柱状图升级为双向分组柱状图
当变量同时存在两个数值时的可视化时,往往会想到用双Y轴柱状图来表达我们的数据。 双Y轴柱状图是一种在同一图表中使用左右两个Y轴的可视化形式,常用于展示两组量纲不同或数值范围差异较大的数据。 双向分组柱状图是一种结合了双向柱状图和分组柱状图的…...
Ubuntu 22.04 更换 Nvidia 显卡后启动无法进入桌面问题的解决
原显卡为 R7 240, 更换为 3060Ti 后, 开机进桌面时卡在了黑屏界面, 键盘有反应, 但是无法进入 shell. 解决方案为 https://askubuntu.com/questions/1538108/cant-install-rtx-4060-ti-on-ubuntu-22-04-lts 启动后在开机菜单中(如果没有开机菜单, 需要按shift键), 进入recove…...
JavaScript 笔记 --- part 4 --- Web API (part 2)
(webAPI part2) DOM 基本操作 事件流 定义: 指的是事件完整执行过程中的流动路径 捕获阶段: 事件从最外层的窗口对象开始,逐层向内传播到目标元素,并触发相应的事件处理程序。 冒泡阶段: 事件从目标元素开始,逐层向外传播到最外层的窗口对象…...
测试基础笔记第六天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、操作系统1.什么是操作系统2.操作系统的常见分类 二、linux系统1.linux发行版本2.文件和路径3.远程连接操作常见的远程连接工具远程连接基本步骤 三、linux命令操…...
Edge Impulse 训练openMV分类模型(字母+数字)
前言 使用openMV Cam H7 Plus 固件4.5.9尝试多种方式均失败(模板匹配、ORB特征识别),还毁了一个sd卡,还是老老实实用Edge Impulse 训练吧 准备字母数字图片,使用Python生成,文件名要存成“A.jpg”这样&…...
ChatUI 3.0 正式发布,“对话式交互” 开源组件库
ChatUI 3.0 是阿里达摩院推出的 “对话式交互” 开源组件库,在智能对话领域具有诸多优势,以下为你详细介绍: 组件丰富实用:提供 50 多个基础组件,涵盖电商、零售、餐饮、出行等多种行业需求,包括对话式界面…...
Linux 动、静态库的实现
前言:当我们写了一段代码实现了一个方法,如果我们不想把方法的实现过程暴露给别人看,可以把代码打包成一个库,其中形成后缀为.a的是静态库,后缀为.so的为动态库;当别人想使用你的方法时,把打包好…...
C++11特性补充
目录 lambda表达式 定义 捕捉的方式 可变模板参数 递归函数方式展开参数包 数组展开参数包 移动构造和移动赋值 包装器 绑定bind 智能指针 RAII auto_ptr unique_ptr shared_ptr 循环引用 weak_ptr 补充 总结 特殊类的设计 不能被拷贝的类 只能在堆上创建…...
PcVue助力立讯:精密制造的智能化管控实践!
PcVue助力立讯: 精密制造的智能化管控实践! 客户介绍 立讯精密(Luxshare ICT,股票代码:002475)成立于2004年5月24日,专注于为消费电子产品、汽车领域产品以及企业通讯产品提供从核心零部件、…...
jmeter中文乱码问题解决
修改jmeter.properties配置文件 进入JMeter安装目录的bin文件夹,找到jmeter.properties文件。搜索参数sampleresult.default.encodingUTF-8,取消注释(删除行首的#),并将其值改为UTF-8。保存文件并重启JMeter生效…...
最新扣子空间实操指南
一、首先要先获取到内部测试的邀请码, 我们先打开扣子空间官网:https://space.coze.cn/ 输入邀请码后进入该页面: 它这里支持文件上传,扩展里面有很多插件,页支持MCP各种插件. 探索模式有两种,一种是ai自…...
Java表达式2.0
1 .数据类型转换 自动类型转换的规则 自动类型转换遵循一定的规则,这些规则确保了转换的合理性和安全性。以下是自动类型转换的主要规则: 容量小的类型自动转换为容量大的类型 Java中,数据类型的容量从小到大依次为:byte → shor…...
JavaScript 一维数组转二维数组
题目描述: <script>const num [1,2,3,4]const out (function(num,m,n){if(num.length ! m*n){return []}const newarr []for(let i 0;i<m;i){newarr.push(num.slice(i*n,(i1)*n))}return newarr})(num,2,2)console.log(out)</script>不使用Stri…...
WIN10重启开机不用登录,直接进入桌面
我们个人机不需要登录。 步骤1 置,帐户,登录选项,密码。 输入当前密码后,直接下一步。 再次重启,就会发现不需要密码了。...
JavaScript学习教程,从入门到精通,DOM节点操作语法知识点及案例详解(21)
DOM节点操作语法知识点及案例详解 一、语法知识点 1. 获取节点 // 通过ID获取 const element document.getElementById(idName);// 通过类名获取(返回HTMLCollection) const elements document.getElementsByClassName(className);// 通过标签名获取…...
基于ESP32 - S3实现一个ping百度的C测试程序
环境准备 安装ESP-IDF开发环境,可参考官方文档。确保开发环境已正确配置,能对ESP32 - S3进行编译和烧录。 实现思路 连接WiFi:让ESP32 - S3连接到一个可用的WiFi网络。初始化Ping功能:利用ESP-IDF提供的Ping API初始化Ping功能…...
英语学习4.15
amateur amateur 🔤 读音:/ˈmətər/ 或 /ˈmətʃʊr/ ✅ 词性:名词 / 形容词 ✅ 中文释义: (名词)业余爱好者 👉 指不是以此为职业的人,通常出于兴趣而从事某项活动。 …...
开源项目FastAPI-MCP:一键API转换MCP服务
在当今AI开发的世界中,应用程序与AI模型之间的无缝集成至关重要。 模型上下文协议(Model Context Protocol, MCP)通过允许AI模型访问外部工具和数据源,弥合了这一差距。 FastAPI MCP是一个强大的工具,它可以通过最少的配置将您现有的FastAPI端点转换为MCP兼容的工具。 本…...
