微信的微网站模板下载,微信的网站怎么做,龙岗在线网站建设,医药企业网站设计制作视频信号#xff08;以下简称为视频#xff09;是非常重要的视觉信息来源#xff0c;它是视觉处理过程中经常要处理的一类信号。实际上#xff0c;视频是由一系列图像构成的#xff0c;这一系列图像被称为帧#xff0c;帧是以固定的时间间隔从视频中获取的。获取#xf… 视频信号以下简称为视频是非常重要的视觉信息来源它是视觉处理过程中经常要处理的一类信号。实际上视频是由一系列图像构成的这一系列图像被称为帧帧是以固定的时间间隔从视频中获取的。获取播放帧的速度称为帧速率其单位通常使用“帧/秒”表示代表在1 秒内所出现的帧数对应的英文是 FPSFrames 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)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, imagecv2.VideoCapture.read() 式中
image 是返回的捕获到的帧如果没有帧被捕获则该值为空。retval 表示捕获是否成功如果成功则该值为 True不成功则为 False。
4. 释放 在不需要摄像头时要关闭摄像头。关闭摄像头使用的是函数 cv2.VideoCapture.release()。 该函数的语法是 Nonecv2.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 c27: #ESC 键break
cap.release()
cv2.destroyAllWindows()