第18章:视频处理

第18章:视频处理

    • 一、VideoCapture类:
      • 1. VideoCapture类中相关方法介绍:
        • (1) 初始化:
        • (2) 初始化判断方法:
        • (3) 捕获帧:
        • (4) 释放:
        • (5) 属性设置:
        • (6) 捕获多摄像头(视频文件)数据:
      • 2. 捕获摄像头视频:
      • 3. 播放视频文件:
    • 二、VideoWriter类
      • 1. 类函数介绍:
        • (1) 构造方法:
        • (2) write方法:
        • (3) 释放:
      • 2. 保存视频:
    • 三、视频操作基础应用:

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

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

  • cv2.VideoCapture:主要要用来读取处理摄像头或视频信息
  • cv2.VideoWriter:主要用来写入视频

一、VideoCapture类:

OpenCV提供了cv2.VideoCapture类来处理视频。它既能处理视频文件又能处理摄像头信息。

1. VideoCapture类中相关方法介绍:

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

(1) 初始化:

OpenCV中cv2.VideoCapture类的构造方法为cv2.VideoCapture(),用于打开摄像头并完成摄像头的初始化工作或者初始化视频文件对象。

该函数的语法格式为:

  • 捕获对象=cv2.VideoCapture(“需要初始化的对象”)

    • 当cv2.VideoCapture()构造方法中传入的参数是"摄像头的ID号"时,初始化的是摄像头对象。

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

    • 当cv2.VideoCapture()构造方法中传入的"视频的文件名"时,初始化的是视频对象。

      注意:可以是视频的url路径。

    • 捕获对象:返回值,实例化出的视频或摄像头对象。cv2.VideoCapture()构造方法

特别注意:视频处理完以后,要记得释放摄像头或视频对象。

(2) 初始化判断方法:

  • 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。

(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()该函数的语法格式是:

  • 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()该函数的语法是:

  • 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类对象的属性值及含义如表所示。

image-20211213143852905

image-20211213143918872

(6) 捕获多摄像头(视频文件)数据:

  • cv2.VideoCapture.grab():捕获视频中的下一帧。
  • cv2.VideoCapture.retrieve():解码并返回grab()捕获的帧。

​ 一般情况下,如果需要读取一个摄像头的视频数据,最简便的方法就是使用函数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()

2. 捕获摄像头视频:

示例:使用cv2.VideoCapture类捕获摄像头视频。

import cv2
import numpy as npcap = cv2.VideoCapture(0)cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1260)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)while cap.isOpened():ret, frame = cap.read()cv2.imshow('frame', frame)c = cv2.waitKey(1)print(c)if c == 97:breakcap.release()
cv2.destroyAllWindows()

注意:waitKey函数

函数 cv2.waitKey()用来等待按键,当用户按下键盘后,该语句会被执行,并获取返回值。其语法格式为:

  • retval=cv2.waitKey([delay])
    • retval:表示返回值。如果没有按键被按下,则返回−1;如果有按键被按下,则返回该按键的ASCII码。
    • delay:表示等待键盘触发的时间,单位是 ms。当该值是负数或者零时,表示无限等待。该值默认为0。

3. 播放视频文件:

可以通过设置函数cv2.waitKey()中的参数值,来设置播放视频时每一帧的持续(停留)时间。如果函数cv2.waitKey()中的参数值:

  • 较小,则说明每一帧停留的时间较短,视频播放速度会较快。
  • 较大,则说明每一帧停留的时间较长,视频播放速度会较慢。
import cv2cap = cv2.VideoCapture('https://vd3.bdstatic.com/mda-ijurqhuzpqac4fm8/sc/mda-ijurqhuzpqac4fm8.mp4?v_from_s=hkapp-haokan-suzhou&auth_key=1639325601-0-0-8ddbd7ccf330e4d61fbbd0dd792b3eb9&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest=&klogid=2601737365')while cap.isOpened():ret, frame = cap.read()# 设置每一帧的图像大小frame = cv2.resize(frame, (640, 320))cv2.imshow('frame', frame)c = cv2.waitKey(100)if c == 97:breakcap.release()
cv2.destroyAllWindows()

注意:视频文件名称可以是url

二、VideoWriter类

OpenCV中的cv2.VideoWriter类可以将图片序列保存成视频文件,也可以修改视频的各种属性,还可以完成对视频类型的转换。

1. 类函数介绍:

cv2.VideoWriter类常用的成员方法包括:构造方法、write方法等。本节简单介绍这两个常用的方法。

(1) 构造方法:

OpenCV为cv2.VideoWriter类提供了构造函数,用它来实现初始化工作。该函数的语法格式是:

  • < VideoWriter object > =cv2.VideoWriter(filename,fourcc,fps,frameSize[,isColor])

    • filename:指定输出目标视频的存放路径和文件名。如果指定的文件名已经存在,则会覆盖这个文件。

    • fourcc:表示视频编/解码类型(格式)。在OpenCV中用函数cv2.VideoWriter_fourcc()来指定视频编码格式。cv2.VideoWriter_fourcc()有4个字符参数。这4个字符参数构成了编/解码器的“4字标记”,每个编/解码器都有一个这样的标记。下面列出几个常用的标记。

      • cv2.VideoWriter_fourcc(‘I’,‘4’,‘2’,‘0’)表示未压缩的YUV颜色编码格式,色度子采样为4:2:0。该编码格式具有较好的兼容性,但产生的文件较大,文件扩展名为.avi。
      • cv2.VideoWriter_fourcc(‘P’,‘I’,‘M’,‘I’)表示 MPEG-1编码类型,生成的文件的扩展名为.avi。
      • cv2.VideoWriter_fourcc(‘X’,‘V’,‘I’,‘D’)表示MPEG-4编码类型。如果希望得到的视频大小为平均值,可以选用这个参数组合。该组合生成的文件的扩展名为.avi。
      • cv2.VideoWriter_fourcc(‘T’,‘H’,‘E’,‘O’)表示Ogg Vorbis编码类型,文件的扩展名为.ogv。
      • cv2.VideoWriter_fourcc(‘F’,‘L’,‘V’,‘I’)表示Flash视频,生成的文件的扩展名为.flv。

      欲知更多的字符参数组合,可以在网站http://www.fourcc.org上查询。若参数fourcc为“-1”,则程序运行时会弹出一个对话框,如图所示。在该对话框中,用户可以根据自己的需要选择合适的压缩程序和压缩质量。

      image-20211213151233342

    • fps:为帧速率。

    • frameSize为每一帧的长和宽。

    • isColor表示是否为彩色图像。

例如,下面的语句完成了cv2.VideoWriter类的初始化工作:

fourcc=cv2.VideoWriter_fourcc(*'XVID')
out=cv2.VideoWriter('output.avi',fourcc,20,1024,768))

如果希望通过如图所示对话框设置编/解码格式,可以使用语句:

fourcc=-1
out=cv2.VideoWriter('output.avi',fourcc,20,1024,768)

(2) write方法:

cv2.VideoWriter类中的函数cv2.VideoWriter.write()用于写入下一帧视频。该函数的语法格式为:

  • None=cv2.VideoWriter.write(image)
    • image:是要写入的视频帧。通常情况下,要求彩色图像的格式为BGR模式。

在调用该函数时,直接将要写入的视频帧传入该函数即可。

例如,有一个视频帧为frame,要将其写入上面的示例中名为out的cv2.VideoWriter类对象内,则使用语句:

out.write(frame)

上述语句会把frame传入名为output.avi的out对象内。

(3) 释放:

在不需要 cv2.VideoWriter 类对象时,需要将其释放。释放该类对象时所使用的是函数cv2.VideoWriter.release()。该函数的语法格式是:

  • None=cv2.VideoWriter.release()

例如,当前有一个cv2.VideoWriter类的对象out,可以用以下语句将其释放:

out.release()

2. 保存视频:

保存视频包括创建对象、写入视频、释放对象等多个步骤,下面对各个步骤做简单的介绍。

  1. 创建对象

    在创建对象前,首先需要设置好参数。

    • 设置好要保存的具体路径,例如:filename=’‘out.avi’’。
    • 使用 cv2.VideoWriter_fourcc()确定编/解码的类型,例如:
      • fourcc=cv2.VideoWriter_fourcc( * ‘XVID’)。
    • 确定视频的帧速率,例如:fps=20。
    • 确定视频的长度和宽度,例如:size=(640,480)。

    然后利用上述参数,创建对象。例如:

    out=cv2.VideoWriter(filename ,fourcc ,fps ,size)

  2. 写入视频

    用函数cv2.VideoWriter.write()在创建的对象out内写入读取到的视频帧frame。使用的代码为:out.write(frame)

  3. 释放对象

    在完成写入后,释放对象out。代码为:

    out.release()

import cv2cap = cv2.VideoCapture(0)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output1.avi', fourcc, 50, (int(cap.get(3)), int(cap.get(4))))while cap.isOpened():rst, frame = cap.read()if rst is True:out.write(frame)cv2.imshow('frame', frame)if cv2.waitKey(1) == 97:breakelse:breakcap.release()
out.release()
cv2.destroyAllWindows()

注意: cv2.VideoWriter('output.avi',fourcc, 20.0, (fwidth,fheight)) 中的 fwidth 和 fheight 要和你原始视频的帧宽度和帧高度一致

三、视频操作基础应用:

视频是由视频帧构成的,将视频帧从视频中提取出,对其使用图像处理的方法进行处理,就可以达到处理视频的目的。

示例:提取视频的Canny边缘检测结果。

import cv2cap = cv2.VideoCapture('https://vd3.bdstatic.com/mda-ijurqhuzpqac4fm8/sc/mda-ijurqhuzpqac4fm8.mp4?v_from_s=hkapp-haokan-suzhou&auth_key=1639325601-0-0-8ddbd7ccf330e4d61fbbd0dd792b3eb9&bcevod_channel=searchbox_feed&pd=1&pt=3&abtest=&klogid=2601737365')while cap.isOpened():ret, frame = cap.read()frame = cv2.resize(frame, (640, 320))frame = cv2.Canny(frame, 100, 150)cv2.imshow('frame', frame)c = cv2.waitKey(100)if c == 97:breakcap.release()
cv2.destroyAllWindows()

image-20211213155157526

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

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

相关文章

C++的常量折叠(一)

前言 前几天女票问了我一个阿里的面试题&#xff0c;是有关C语言的const常量的&#xff0c;其实她一提出来我就知道考察的点了&#xff1a;肯定是const常量的内存不是分配在read-only的存储区的&#xff0c;const常量的内存分配区是很普通的栈或者全局区域。也就是说const常量只…

【机器视觉学习笔记】二值图像和灰度图像的膨胀、腐蚀、开运算、闭运算算法(C++)

目录二值图像原理腐蚀结构的原点设置在结构内部情况举例结构的原点设置在结构的外部情况举例膨胀结构的原点设置在结构的内部情况举例结构的原点设置在结构的外部情况举例开闭运算完整源码效果原图腐蚀运算膨胀运算开运算闭运算灰度图像原理腐蚀膨胀开闭运算完整源码效果原图腐…

【机器视觉学习笔记】二值图像连通区域提取算法(C++)

目录原理二值图像连通区域&#xff08;Connected Component&#xff09;连通区域分析&#xff08;Connected Component Analysis,Connected Component Labeling&#xff09;算法&#xff1a;Two-Pass&#xff08;两遍扫描法&#xff09;思路&#xff1a;Two-Pass算法的简单步骤…

【机器视觉学习笔记】Harris 角点检测算法(C++)

目录原理算法步骤优缺点源码效果原图输出平台&#xff1a;Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文摘自2、Harris角点检测算法 —— 诺亚方舟369 原理 Harris算子是对Moravec算子的改进&#xff0c;包括&#xff1a; &#xff08;1&#xff09;Harris算子用…

剖析ASSERT函数

2019独角兽企业重金招聘Python工程师标准>>> &#xfeff;&#xfeff; 搜集与总结了assert函数的用法&#xff0c;记于此&#xff0c;以备后续与查找使用&#xff1a; ****身在Windows的世界&#xff0c;但还是深爱着我的它---Linux****I love Linux forever***** …

MSP430G2553 移植 Contiki RTOS 实时操作系统

目录新建工程移植过程关于时间多任务示例main.c内存使用情况效果平台&#xff1a;Code Composer Studio 10.4.0 MSP-EXP430G2 LaunchPad 试验板 MSP430G2553 LaunchPad™ Development Kit (MSP‑EXP430G2ET) contiki下载&#xff1a;contiki-os Github 本文参考自二、Contiki…

Raphael JS 矢量客户端开源框架

之前有基于svg进行矢量绘制&#xff0c;当时是自己写的一些js类库&#xff0c;最近项目中需要&#xff0c;对Raphael做了一些了解&#xff0c;总体不错。 Raphael可以对浏览器的兼容做的不错&#xff0c;基于IE的会自动使用vml进行绘制&#xff0c;其他浏览器基于svg进行绘制&a…

mac os x10.8下如何使用git与github

2019独角兽企业重金招聘Python工程师标准>>> 1、准备工作&#xff1a; 下载安装git客户端 http://code.google.com/p/git-osx-installer/downloads/list?can3(安装了git客户端&#xff0c;命令行中才有git命令) 注册github账号 https://github.com/ -->Pricing …

使用 VS 附加到进程 调试发布的网站

适用场景&#xff1a;调试已发布的网站。 1、把项目 bin 目录下的 pdb 文件复制到服务器上相应网站的 bin 目录下。 2、把VS的调试工具中的 x64 文件夹复制到服务器任意位置。 3、服务器中打开调试工具&#xff0c;并配置端口&#xff08;注意端口是否可用&#xff09;。 4、在…

Github git 命令下载加速

目录手动输入法批处理文件系统&#xff1a;Windows 10 20H2 手动输入法 在要下载到的目录按住shift右键 选择在此处打开Powershell窗口 如要下载的仓库地址&#xff1a; 通常的git命令下载&#xff1a; git clone https://github.com/apache/incubator-nuttx.gitCNPMJS.ORG…

MySql 自动更新时间为当前时间

字段类型 : timestamp默认值 : CURRENT_TIMESTAMP如果是创建时间&#xff0c;则下面的“根据当前时间戳更新”不勾选。转载于:https://blog.51cto.com/9625815/1630767

ZKP Mathematical Building Blocks (2)

MIT IAP 2023 Modern Zero Knowledge Cryptography课程笔记 Lecture 3: Mathematical Building Blocks (Yufei Zhao) Fiat Shamir heuristic Turn an interactive proof to a non-interactive proofP can simulate V whenever V picks a random valueP can simulate V’s ran…

【AVR ASF4库函数学习笔记】一、使用Microchip Studio图形化配置工程

目录新建工程配置点灯效果平台&#xff1a;Microchip Studio (原Atmel Studio 7) 欣世纪 DMAVR-L Atmega 128A - AU 新建工程 选择所用的芯片后点击CREATE NEW PROJECT创建工程 配置 设置CPU 根据所用晶振设置频率 点灯示例&#xff1a; D7由PE7控制&#xff0c;低电平点…

Jenkins部署Web项目到远程tomcat

原网址&#xff1a;http://blog.sina.com.cn/s/blog_b5fe6b270102v7xi.html 之前讲到的是如何构建一个项目&#xff0c;并且将代码进行编译、打包&#xff0c;那么打包完成最后的结果就需要发布到应用服务器&#xff0c;将项目部署成功。在之前的项目中我们采用的shell脚本来部…

奔跑的小车……

转载于:https://www.cnblogs.com/hebaichuanyeah/archive/2013/06/07/3124244.html

【机器视觉学习笔记】OpenCV C++的安装、配置及多版本共存 (VS2015)

目录下载&#xff08;可选 —— 二选一&#xff09;添加环境变量新建项目和配置配置包含目录配置库目录添加库&#xff08;可选 —— 二选一&#xff09;添加dll文件的路径测试平台&#xff1a;Windows 10 20H2 Visual Studio 2015 OpenCV 2.4.13.6 本文参考自最新opencv-c安…

Java环境搭建若干问题

2019独角兽企业重金招聘Python工程师标准>>> 0.总体说明 本次搭建环境&#xff0c;为了偷懒&#xff0c;使用的是&#xff0c;阿里云镜像。 自带了Nginx、Tomcat、JDK等。 比较坑爹的是&#xff0c;虽然镜像带了很多安装好的软件&#xff0c;但是也有各种问题&#…

JAVASCRIPT 等比例缩放图片 限定最大宽度和最大高度

在Web上显示图片&#xff0c;通常都会有图片显示比例问题&#xff0c;如果不给<img />限制width和height&#xff0c;那么如果图片大了就会将整个页面挤乱&#xff0c;图片小了又会使图片失真。 1、预先定义好图片显示的标准宽度和高度。 2、如果图片的大小超过了…

【机器视觉学习笔记】python安装OpenCV并设置自动补全及代码提示

目录安装测试设置自动补全及代码提示平台&#xff1a;Windows 10 20H2 Python 3.8.12 (default, Oct 12 2021, 03:01:40) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32 OpenCV 4.5.4.58 安装 本节内容引自使用pip安装Opencv —— xwc2 在要安装的环境内使用如下…

Android背景色渐变效果(shape,gradient) (转)

Android设置背景色可以通过在res/drawable里定义一个xml,如下&#xff1a; [代码]xml代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/android"> <gradie…