opencv进阶09-视频处理cv2.VideoCapture示例(打开本机电脑摄像头)

视频信号(以下简称为视频)是非常重要的视觉信息来源,它是视觉处理过程中经常要处理的一类信号。实际上,视频是由一系列图像构成的,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。获取(播放)帧的速度称为帧速率,其单位通常使用“帧/秒”表示,代表在1 秒内所出现的帧数,对应的英文是 FPS(Frames Per Second)。如果从视频中提取出独立的帧,就可以使用图像处理的方法对其进行处理,达到处理视频的目的。

OpenCV 提供了 cv2.VideoCapture 类和 cv2.VideoWriter 类来支持各种类型的视频文件。在不同的操作系统中,它们支持的文件类型可能有所不同,但是在各种操作系统中均支持 AVI格式的视频文件。

VideoCapture 类

OpenCV 提供了 cv2.VideoCapture 类来处理视频。cv2.VideoCapture 类处理视频的方式非常简单、快捷,而且它既能处理视频文件又能处理摄像头信息。

类函数介绍

cv2.VideoCapture 类的常用函数包括初始化、打开、帧捕获、释放、属性设置等,下面对
这些函数进行简单的介绍。

1. 初始化
OpenCV 为 cv2.VideoCapture 类提供了构造函数 cv2.VideoCapture(),用于打开摄像头并完成摄像头的初始化工作。该函数的语法格式为:

捕获对象=cv2.VideoCapture(“摄像头 ID 号”)

式中:

  • “摄像头 ID 号”就是摄像头的 ID 号码。需要注意的是,这个参数是摄像设备(摄像头)的 ID 编号,而不是文件名。其默认值为-1,表示随机选取一个摄像头;如果有多个摄像头,则用数字“0”表示第 1 个摄像头,用数字“1”表示第 2 个摄像头,以此类推。
    所以,如果只有一个摄像头,既可以使用“0”,也可以使用“-1”作为摄像头 ID 号。在某些平台上,如果该参数值为“-1”,OpenCV 会弹出一个窗口,让用户手动选择希望使用的摄像头。

  • “捕获对象”为返回值,是 cv2.VideoCapture 类的对象。
    例如,要初始化当前的摄像头,可以使用语句:

cap = cv2.VideoCapture(0)

OpenCV 官网在介绍函数 cv2.VideoCapture()时,特别强调:视频处理完以后,要记得释放摄像头对象。
该(构造)函数也能够用于初始化视频文件,初始化视频文件时,参数为文件名。此时函数的形式为:

捕获对象=cv2.VideoCapture(“文件名”)

例如,打开当前目录下文件名为“vtest.avi”的视频文件,可以使用语句:

cap = cv2.VideoCapture('vtest.avi')
  1. cv2.VideoCapture.open()函数和cv2.VideoCapture.isOpened()函数

一般情况下,使用 cv2.VideoCapture()函数即可完成摄像头的初始化。有时,为了防止初始化发生错误,可以使用函数 cv2.VideoCapture.isOpened()来检查初始化是否成功。该函数的语法格式为:

retval = cv2.VideoCapture.isOpened()

该函数会判断当前的摄像头是否初始化成功:

  • 如果成功,则返回值 retval 为 True。
  • 如果不成功,则返回值 retval 为 False。

如果摄像头初始化失败,可以使用函数 cv2.VideoCapture.open()打开摄像头。该函数的语法格式为:

retval = cv2.VideoCapture.open( index )

式中:

  • index 为摄像头 ID 号。
  • retval 为返回值,当摄像头(或者视频文件)被成功打开时,返回值为 True。

同样,函数 cv2.VideoCapture.isOpened()和函数 cv2.VideoCapture.open()也能用于处理视频文件。在处理视频文件时,函数 cv2.VideoCapture.open()的参数为文件名,其语法格式为:

retval = cv2.VideoCapture.open( filename )

3. 捕获帧

摄像头初始化成功后,就可以从摄像头中捕获帧信息了。捕获帧所使用的是函数cv2.VideoCapture.read()。该函数的语法是:

retval, image=cv2.VideoCapture.read()

式中:

  • image 是返回的捕获到的帧,如果没有帧被捕获,则该值为空。
  • retval 表示捕获是否成功,如果成功则该值为 True,不成功则为 False。

4. 释放
在不需要摄像头时,要关闭摄像头。关闭摄像头使用的是函数

cv2.VideoCapture.release()。

该函数的语法是:

None=cv2.VideoCapture.release()

例如,当前有一个 VideoCapture 类的对象 cap,要将其释放,可以使用语句:

cap.release()

5 属性设置
有时,我们需要获取 cv2.VideoCapture 类对象的属性,或是更改该类对象的属性。函数cv2.VideoCapture.get()用于获取 cv2.VideoCapture 类对象的属性,该函数的语法格式是:

retval = cv2.VideoCapture.get( propId )

式中,参数 propId 对应着 cv2.VideoCapture 类对象的属性。
例如,有一个 cv2.VideoCapture 类对象 cvc,则:

  • 通过 cvc.get(cv2.CAP_PROP_FRAME_WIDTH),就能获取当前帧对象的宽度。
  • 通过 cvc.get(cv2.CAP_PROP_FRAME_HEIGHT),就能获取当前帧对象的高度。

函数 cv2.VideoCapture.set()用来设置 cv2.VideoCapture 类对象的属性。该函数的语法是:

retval = cv2.VideoCapture.set( propId, value )

式中,propId 对应 cv2.VideoCapture 类对象的属性,value 对应属性 propid 的值。
例如,有一个 cv2.VideoCapture 类对象 cvc,则:

  • 语句 ret = cvc.set(cv2.CAP_PROP_FRAME_WIDTH, 640)将当前帧对象的宽度设置为
    640 像素。
  • 语句 ret = cvc.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)将当前帧对象的高度设置为480 像素。

cv2.VideoCapture 类对象的属性值及含义如表 18-1 所示。

在这里插入图片描述
在这里插入图片描述

5. cv2.VideoCapture.grab()函数cv2.VideoCapture.retrieve()函数

一般情况下,如果需要读取一个摄像头的视频数据,最简便的方法就是使用函数
cv2.VideoCapture.read()。但是,如果需要同步一组或一个多头(multihead)摄像头(例如立体摄像头或 Kinect)的视频数据时,该函数就无法胜任了。可以把函数 cv2.VideoCapture.read()
理解为是由函数 cv2.VideoCapture.grab()和函数 cv2.VideoCapture.retrieve()组成的。函数
cv2.VideoCapture.grab()用来指向下一帧,函数 cv2.VideoCapture.retrieve()用来解码并返回一帧。

因此,可以使用函数 cv2.VideoCapture.grab()和函数cv2.VideoCapture.retrieve()获取多个摄像头的数据。

函数 cv2.VideoCapture.grab()用来指向下一帧,其语法格式是:

retval= cv2.VideoCapture.grab( )

如果该函数成功指向下一帧,则返回值 retval 为 True。
函数 cv2.VideoCapture.retrieve()用来解码,并返回函数 v2.VideoCapture.grab()捕获的视频帧。

该函数的语法格式为:

retval, image = cv2.VideoCapture.retrieve( )

式中:

  • image 为返回的视频帧,如果未成功,则返回一个空图像。
  • retval 为布尔型值,若未成功,返回 False;否则,返回 True。

对于一组摄像头,可以使用如下代码捕获不同摄像头的视频帧:

success0 = cameraCapture0.grab()
success1 = cameraCapture1.grab()
if success0 and success1:
frame0 = cameraCapture0.retrieve()
frame1 = cameraCapture1.retrieve()
与 VideoCapture 类内的其他函数一样,cv2.VideoCapture.grab()和 cv2.VideoCapture.retrieve()

也能用来读取视频文件。

示例:显示帅哥或美女视频

import numpy as np
import cv2
cap = cv2.VideoCapture(0)
while(cap.isOpened()):
 ret, frame = cap.read()
 cv2.imshow('frame',frame)
 c = cv2.waitKey(1)
 if c==27: #ESC 键
    break
cap.release()
cv2.destroyAllWindows()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

react之路由的安装与使用

一、路由安装 路由官网2021.11月初,react-router 更新到 v6 版本。使用最广泛的 v5 版本的使用 npm i react-router-dom5.3.0二、路由使用 2.1 路由的简单使用 第一步 在根目录下 创建 views 文件夹 ,用于放置路由页面 films.js示例代码 export default functio…

如何在前端实现WebSocket发送和接收UDP消息(多线程模式)

目录 简介:步骤1:创建WebSocket连接步骤2:创建Web Workers步骤3:发送和接收UDP消息(多线程模式)结束语: 简介: 本文将继续介绍如何在前端应用中利用WebSocket技术发送和接收UDP消息…

C#生产流程控制(串行,并行混合执行)

开源框架CsGo https://gitee.com/hamasm/CsGo?_fromgitee_search 文档资料: https://blog.csdn.net/aa2528877987/article/details/132139337 实现效果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37…

vue 关闭prettier警告warn

这个就是我们创建vue cli的时候 把这个给默认上了 关闭这个只需在.eslintrc.js页面里边添加一行代码"prettier/prettier": "off"

从零开始创建 Spring Cloud 分布式项目,不会你打我

目录 一、Spring Cloud 和 分布式 二、创建新项目 三、导入 Spring Cloud 依赖 四、配置 Spring Cloud 一、Spring Cloud 和 分布式 Spring Cloud是一个基于Spring框架的开源微服务框架,它提供了一系列工具和组件,用于帮助开发人员构建分布式系统中…

(学习笔记-进程管理)什么是悲观锁、乐观锁?

互斥锁与自旋锁 最底层的两种就是 [互斥锁和自旋锁],有很多高级的锁都是基于它们实现的。可以认为它们是各种锁的地基,所以我们必须清楚它们之间的区别和应用。 加锁的目的就是保证共享资源在任意时间内,只有一个线程访问,这样就…

韦东山老师 RTOS 入门课程(一)RTOS 介绍,熟悉裸机的汇编逻辑

韦东山老师 RTOS 入门课程 课程链接:韦东山直播公开课:RTOS实战项目之实现多任务系统 第1节:裸机程序框架和缺陷_哔哩哔哩_bilibili RTOS 介绍 裸机:固定顺序执行。 中断:可以一直专心做循环里的事情,直…

最长回文子串

给你一个字符串 s,找到 s 中最长的回文子串。 示例 1: 输入:s “babad” 输出:“bab” 解释:“aba” 同样是符合题意的答案。 示例 2: 输入:s “cbbd” 输出:“bb” 提示&#xff…

排序算法-冒泡排序(C语言实现)

简介😀 冒泡排序是一种简单但效率较低的排序算法。它重复地扫描待排序元素列表,比较相邻的两个元素,并将顺序错误的元素交换位置,直到整个列表排序完成。 实现🧐 以下内容为本人原创,经过自己整理得出&am…

SQL-Injection

文章目录 引入columns表tables表schemata表以sqli-labs靶场为例路径获取常见方法文件读取函数文件写入函数防注入 数字型注入(post)字符型注入(get)搜索型注入xx型注入 引入 在MYSQL5.0以上版本中,mysql存在一个自带数据库名为information_schema,它是一个存储记录…

C++之模板进阶

模板进阶 非类型模板参数模板的特化概念函数模板特化类模板特化全特化偏特化 模板分离编译什么是分离编译模板的分离编译解决方法 模板总结 非类型模板参数 模板参数分两种:类型形参与非类型形参。 类型形参:出现在模板参数列表中,跟在class…

华为OD机试关于无输入截止条件的ACM输入逻辑

无输入截止条件的ACM输入 华为OD机试题中有一些题目是没有输入截止条件的,比如 华为OD机试 - 数字游戏(Java & JS & Python)_伏城之外的博客-CSDN博客 从输入描述来看,每组有两行输入,但是并没有告诉我们具体有几组? 那么输入该如何截止呢? 此时,有两种输入…

计网第三章(数据链路层)(三)

一、点对点协议PPP 在第一篇里有提到数据链路层的信道分为两种:点对点信道和广播信道。 PPP协议就属于点对点信道上的协议。 如果对前面数据链路层的三个基本问题了解的比较透彻,那么这一块很多东西都很好理解。 从考试的角度来讲,PPP协议…

Docker基础入门:从0开始学习容器化技术

Docker基础入门:从零开始学习容器化技术 一、Docker基础1.1、Docker起源1.2、Docker概念1.3、Docker优势1.4、Docker 的组成 二、Docker安装2.1、卸载旧版Docker2.2、需要的安装包依赖2.3、设置镜像仓库2.4、更新yum软件包索引2.5、安装Docker--社区版2.6、配置镜像…

线程池原理

一、线程池的定义 线程池,按照配置参数(核心线程数、最大线程数等)创建并管理若干线程对象,没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,就分配一个空闲线程执行。如果所有线程都处于…

[三次握手]TCP三次握手由入门到精通(知识精讲)

⬜⬜⬜ 🐰🟧🟨🟩🟦🟪(*^▽^*)欢迎光临 🟧🟨🟩🟦🟪🐰⬜⬜⬜ ✏️write in front✏️ 📝个人主页:陈丹宇jmu &am…

删除有序链表中重复的元素-II(链表)

乌!蒙!山!连!着!山!外!山! 题目: 思路: 双指针,slow和fast,并且增加标记flag初始为1。 如果slow指向节点值等于fast指向节点值&…

pytorch3d成功安装

一、pytorch3d是什么? PyTorch3D的目标是帮助加速深度学习和3D交叉点的研究。3D数据比2D图像更复杂,在从事Mesh R-CNN和C3DPO等项目时,我们遇到了一些挑战,包括3D数据表示、批处理和速度。我们开发了许多有用的算子和抽象&#xf…

React快速入门

最近需要学到react&#xff0c;这里进行一个快速的入门&#xff0c;参考react官网 1.创建和嵌套组件 react的组件封装是个思想&#xff0c;我这里快速演示代码&#xff0c;自己本身也不太熟悉。 代码的路径是src底下的App.js function MyButton() {return (<button>I…

JVM前世今生之JVM内存模型

JVM内存模型所指的是JVM运行时区域&#xff0c;该区域分为两大块 线程共享区域 堆内存、方法区&#xff0c;即所有线程都能访问该区域&#xff0c;随着虚拟机和GC创建和销毁 线程独占区域 虚拟机栈、本地方法栈、程序计数器&#xff0c;即每个线程都有自己独立的区域&#…