刚成立公司如何做网站,手机商城源码,电脑制作网页的软件,网站的标题标签一般是写在第18章#xff1a;视频处理一、VideoCapture类#xff1a;1. VideoCapture类中相关方法介绍#xff1a;(1) 初始化#xff1a;(2) 初始化判断方法#xff1a;(3) 捕获帧#xff1a;(4) 释放#xff1a;(5) 属性设置#xff1a;(6) 捕获多摄像头(视频文件)数据#xff…
第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()来检查初始化是否成功。该函数的语法格式为
retvalcv2.VideoCapture.isOpened() 如果成功则返回值retval为True。如果不成功则返回值retval为False。
如果摄像头或视频文件初始化失败可以使用函数 cv2.VideoCapture.open()打开摄像头或视频文件。该函数的语法格式为
retvalcv2.VideoCapture.open(index) index为摄像头ID号或视频文件名称。retval为返回值当摄像头(或者视频文件)被成功打开时返回值为True。
(3) 捕获帧
摄像头(视频文件)初始化成功后就可以从摄像头中捕获帧信息了。捕获帧所使用的是函数cv2.VideoCapture.read()。
该函数的语法是
retval,imagecv2.VideoCapture.read() image是返回的捕获到的帧如果没有帧被捕获则该值为空。retval表示捕获是否成功如果成功则该值为True不成功则为False。
(4) 释放
在不需要摄像头时要关闭摄像头。关闭摄像头使用的是函数 cv2.VideoCapture.release()。该函数的语法是
Nonecv2.VideoCapture.release()
例如当前有一个VideoCapture类的对象cap要将其释放可以使用语句
cap.release()
(5) 属性设置
有时我们需要获取 cv2.VideoCapture 类对象的属性或是更改该类对象的属性。
获取对象属性 cv2.VideoCapture.get()该函数的语法格式是
retvalcv2.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()该函数的语法是
retvalcv2.VideoCapture.set(propId,value) propId对应cv2.VideoCapture类对象的属性value对应属性propid的值。
例如有一个cv2.VideoCapture类对象cvc则
语句 retcvc.set(cv2.CAP_PROP_FRAME_WIDTH,640)将当前帧对象的宽度设置为640像素。语句 retcvc.set(cv2.CAP_PROP_FRAME_HEIGHT,480)将当前帧对象的高度设置为480像素。
cv2.VideoCapture类对象的属性值及含义如表所示。 (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()用来指向下一帧其语法格式是
retvalcv2.VideoCapture.grab()
如果该函数成功指向下一帧则返回值retval为True。
函数cv2.VideoCapture.retrieve()用来解码并返回函数v2.VideoCapture.grab()捕获的视频帧。该函数的语法格式为
retval,imagecv2.VideoCapture.retrieve() image为返回的视频帧如果未成功则返回一个空图像。retval为布尔型值若未成功返回False否则返回True。
对于一组摄像头可以使用如下代码捕获不同摄像头的视频帧
success0cameraCapture0.grab()
success1cameraCapture1.grab()
if success0 and success1:frame0cameraCapture0.retrieve()frame1cameraCapture1.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用来等待按键当用户按下键盘后该语句会被执行并获取返回值。其语法格式为
retvalcv2.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_shkapp-haokan-suzhouauth_key1639325601-0-0-8ddbd7ccf330e4d61fbbd0dd792b3eb9bcevod_channelsearchbox_feedpd1pt3abtestklogid2601737365)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.VideoWriterfilename,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”则程序运行时会弹出一个对话框如图所示。在该对话框中用户可以根据自己的需要选择合适的压缩程序和压缩质量。 fps为帧速率。 frameSize为每一帧的长和宽。 isColor表示是否为彩色图像。
例如下面的语句完成了cv2.VideoWriter类的初始化工作
fourcccv2.VideoWriter_fourcc*XVID
outcv2.VideoWriteroutput.avi,fourcc,20,1024,768如果希望通过如图所示对话框设置编/解码格式可以使用语句
fourcc-1
outcv2.VideoWriteroutput.avi,fourcc,20,1024,768)(2) write方法
cv2.VideoWriter类中的函数cv2.VideoWriter.write用于写入下一帧视频。该函数的语法格式为
Nonecv2.VideoWriter.writeimage image是要写入的视频帧。通常情况下要求彩色图像的格式为BGR模式。
在调用该函数时直接将要写入的视频帧传入该函数即可。
例如有一个视频帧为frame要将其写入上面的示例中名为out的cv2.VideoWriter类对象内则使用语句
out.writeframe上述语句会把frame传入名为output.avi的out对象内。
(3) 释放
在不需要 cv2.VideoWriter 类对象时需要将其释放。释放该类对象时所使用的是函数cv2.VideoWriter.release。该函数的语法格式是
Nonecv2.VideoWriter.release
例如当前有一个cv2.VideoWriter类的对象out可以用以下语句将其释放
out.release
2. 保存视频
保存视频包括创建对象、写入视频、释放对象等多个步骤下面对各个步骤做简单的介绍。 创建对象 在创建对象前首先需要设置好参数。 设置好要保存的具体路径例如filename’‘out.avi’’。使用 cv2.VideoWriter_fourcc确定编/解码的类型例如 fourcccv2.VideoWriter_fourcc * ‘XVID’。 确定视频的帧速率例如fps20。确定视频的长度和宽度例如size640,480。 然后利用上述参数创建对象。例如 outcv2.VideoWriterfilename ,fourcc ,fps ,size 写入视频 用函数cv2.VideoWriter.write在创建的对象out内写入读取到的视频帧frame。使用的代码为out.writeframe 释放对象 在完成写入后释放对象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_shkapp-haokan-suzhouauth_key1639325601-0-0-8ddbd7ccf330e4d61fbbd0dd792b3eb9bcevod_channelsearchbox_feedpd1pt3abtestklogid2601737365)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()