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

news2024/9/28 3:23:44

视频信号(以下简称为视频)是非常重要的视觉信息来源,它是视觉处理过程中经常要处理的一类信号。实际上,视频是由一系列图像构成的,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的。获取(播放)帧的速度称为帧速率,其单位通常使用“帧/秒”表示,代表在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()

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言刷题指南(一)

📙作者简介: 清水加冰,目前大二在读,正在学习C/C、Python、操作系统、数据库等。 📘相关专栏:C语言初阶、C语言进阶、数据结构刷题训练营、有感兴趣的可以看一看。 欢迎点赞 👍 收藏 ⭐留言 &am…

递归算法详解

概述 递归算法,不断调用本身,每调用一次在内存中添加一层,不断地叠加到最底层,直到遇到返回值,然后从最底层一层层的返回到最顶层 举例 public static void main(String[] args) {// System.out.println(fibbonacciF…

一篇文章教会你搭建私人kindle图书馆,并内网穿透实现公网访问

搭建私人kindle图书馆,并内网穿透实现公网访问 在电子书风靡的时期,大部分人都购买了一本电子书,虽然这本电子书更多的时候是被搁置在储物架上吃灰,或者成为盖泡面的神器,但当亚马逊发布消息将放弃电子书在中国的服务…

如何通过本地搭建wamp服务器并实现无公网IP远程访问

文章目录 前言1.Wamp服务器搭建1.1 Wamp下载和安装1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册2.1 本地网页发布2.2 Cpolar云端设置2.3 Cpolar本地设置 3. 公网访问测试4. 结语 前言 软件技术的发展日新月异,各种能方便我们生活、工作和娱乐的新软件层出不穷&…

《cpolar内网穿透》外网SSH远程连接linux(CentOS)服务器

本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的Linux CentOS服务器,无需公网IP,也不需要设置路由器。 视频教程 [video(video-jrpesBrv-1680147672481)(type-csdn)(url-CSDN直播https://live-file.csdnimg.cn/release/live/…

使用netstat查询网络连接状态、端口信息

1、netstat作用 netstat 命令用于显示各种网络相关信息,如网络连接,路由表,接口状态 (Interface Statistics),masquerade 连接,多播成员 (Multicast Memberships) 等等。 2、常见参数 -a (all)显示所有选项&#xff…

36.8k Star! 一款小而美的自动化运维监控工具——Uptime Kuma

自动化运维是指利用计算机科学和信息技术来实现系统和应用程序的自动化管理、监控、维护以及问题解决的过程。它的目标是减少人工干预、提高效率、降低错误率,并确保系统的稳定性和可靠性。 应用简览 Uptime-Kuma 是一个轻量级的监控工具,其独特之处在于…

一百六十、Kettle——Linux上安装的Kettle9.2.0连接Hive3.1.2

一、目标 Kettle9.2.0在Linux上安装好后,需要与Hive3.1.2数据库建立连接 之前已经在本地上用kettle9.2.0连上Hive3.1.2 二、各工具版本 (一)kettle9.2.0 kettle9.2.0安装包网盘链接 链接:https://pan.baidu.com/s/15Zq9w…

PHP使用phpmailer及SMTP服务实现邮件发送

博客升级中,把之前没有想到的功能一点点的完善。 这篇日志记录一下,使用phpmailer实现邮件发送的这样一个操作。 博客偶尔会有留言和评论,我也会及时回复,但是有一个问题,我回复了,给我留言的人如果不再次…

基于Java的ssm图书管理系统源码和论文

基于Java的ssm图书管理系统036 开发工具:idea 数据库mysql5.7 数据库链接工具:navcat,小海豚等 技术:ssm 当今时代是飞速发展的信息时代。在各行各业中离不开信息处理,计算机被广泛应用于信息管理系统的环境。计算机的最大好…

linux鲁班猫代码初尝试[编译镜像][修改根文件系统重编译][修改设备树改屏幕为MIPI][修改屏幕和TP方向]

编译镜像 官方百度云盘资料:https://doc.embedfire.com/linux/rk356x/quick_start/zh/latest/quick_start/baidu_cloud/baidu_cloud.html 解压虚拟机压缩包:"鲁班猫\8-SDK源码压缩包\开发环境虚拟机镜像\ubuntu20.04.7z"后既可以用VMware打开,打开后可以看到已经有…

python+django+mysql高校校园外卖点餐系统--计算机毕设项目

本文的研究目标是以高校校园外卖点餐为对象,使其高校校园外卖点餐为目标,使得高校校园外卖点餐的信息化体系发展水平提高。论文的研究内容包括对个人中心、美食分类管理、用户管理、商家管理、美食信息管理、工作人员管理、安全检查管理、系统管理、订单…

什么是B+树?

B树 B树是B树的一种变体,也属于平衡多路查找树,大体结构与B树相同,包含根节点、内部节点和叶子节点。多用于数据库和操作系统的文件系统中,由于B树内部节点不保存数据,所以能在内存中存放更多索引,增加缓存…

【学会动态规划】等差数列划分(22)

目录 动态规划怎么学? 1. 题目解析 2. 算法原理 1. 状态表示 2. 状态转移方程 3. 初始化 4. 填表顺序 5. 返回值 3. 代码编写 写在最后: 动态规划怎么学? 学习一个算法没有捷径,更何况是学习动态规划, 跟我…

基于Kubernetes云原生技术的低代码PaaS平台,快速构建企业级应用程序

低代码PaaS平台 低代码PaaS平台可以在云端开发、部署、运行低代码应用程序。使用独立数据库模型,基于Kubernetes云原生技术,每个租户均可拥有一套独立的存储、数据库、代码和命名空间,实现了100%的租户数据隔离,并可以随时迁移到…

在本地搭建WAMP服务器并通过端口实现局域网访问(无需公网IP)

文章目录 前言1.Wamp服务器搭建1.1 Wamp下载和安装1.2 Wamp网页测试 2. Cpolar内网穿透的安装和注册2.1 本地网页发布2.2 Cpolar云端设置2.3 Cpolar本地设置 3. 公网访问测试4. 结语 前言 软件技术的发展日新月异,各种能方便我们生活、工作和娱乐的新软件层出不穷&a…

iPhone 15受益:骁龙8 Gen 3可能缺席部分安卓旗舰机

明年一批领先的安卓手机的性能可能与今年的机型非常相似。硅成本的上涨可能是原因。 你可以想象,2024年许多最好的手机都会在Snapdragon 8 Gen 3上运行,这是高通公司针对移动设备的顶级芯片系统的更新,尚未宣布。然而,来自中国的…

Python Web开发 Django 简介

今天来为大家介绍 Python 另一个 Web 开发框架 Django,它是一个基于 Python 定制的开源 Web 应用框架,最早源于一个在线新闻 Web 网站,后于2005年开源。Django 的功能大而全,它提供的一站式解决的思路,能让开发者不用在…

在思科(Cisco)路由器中使用 SNMP

什么是SNMP SNMP,称为简单网络管理协议,被发现可以解决具有复杂网络设备的复杂网络环境,SNMP 使用标准化协议来查询网络上的设备,为网络管理员提供保持网络环境稳定和远离停机所需的重要信息。 为什么要在思科设备中启用SNMP S…

如何在出差期间远程访问企业ERP系统?内网穿透解决您的难题!

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻,不管是财务、生产、销售还是采购,都需要用到ERP系统来协助。…