温馨提示:这篇文章已超过379天没有更新,请注意相关的内容是否还可用!
摘要:本文介绍了使用OpenCV库中的cv2.VideoCapture模块进行视频处理的进阶知识。通过示例展示了如何打开本机电脑摄像头并进行视频捕获。文章涵盖了使用cv2.VideoCapture打开摄像头的基本步骤,包括摄像头的初始化、视频的捕获与显示等关键操作。本文旨在为OpenCV学习者提供关于视频处理方面的进阶知识和实践指导。
简介
视频信号是视觉处理过程中经常要处理的一类信号,视频是由一系列图像构成的,这一系列图像被称为帧,帧是以固定的时间间隔从视频中获取的,获取(播放)帧的速度称为帧速率,其单位通常使用“帧/秒”表示,代表在1秒内所出现的帧数,如果从视频中提取出独立的帧,就可以使用图像处理的方法对其进行处理,达到处理视频的目的。
OpenCV 提供了 cv2.VideoCapture 类和 cv2.VideoWriter 类来支持各种类型的视频文件,在不同的操作系统中,它们支持的文件类型可能有所不同,但是在各种操作系统中均支持 AVI 格式的视频文件。
VideoCapture 类
OpenCV 提供了 cv2.VideoCapture 类来处理视频,cv2.VideoCapture 类处理视频的方式非常简单、快捷,而且它既能处理视频文件又能处理摄像头信息。
类函数介绍
初始化
OpenCV 为 cv2.VideoCapture 类提供了构造函数 cv2.VideoCapture(),用于打开摄像头并完成摄像头的初始化工作,其语法格式为:
捕获对象 = cv2.VideoCapture(“摄像头 ID 号”)
“摄像头 ID 号”就是摄像头的 ID 号码,需要注意的是,这个参数是摄像设备(摄像头)的 ID 编号,而不是文件名,其默认值为-1,表示随机选取一个摄像头;如果有多个摄像头,则用数字“0”表示第一个摄像头,用数字“1”表示第二个摄像头,以此类推。
“捕获对象”为返回值,是 cv2.VideoCapture 类的对象。
要初始化当前的摄像头,可以使用语句:
cap = cv2.VideoCapture(0)
OpenCV 官网在介绍函数 cv2.VideoCapture()时特别强调:视频处理完以后,要记得释放摄像头对象,该函数也能够用于初始化视频文件,初始化视频文件时,参数为文件名,此时函数的形式为:
捕获对象 = cv2.VideoCapture(“文件名”)
打开与关闭
有时,为了防止初始化发生错误,可以使用函数 cv2.VideoCapture.isOpened()来检查初始化是否成功,如果成功,则返回值 retval 为 True;如果不成功,则返回值 retval 为 False,如果摄像头初始化失败,可以使用函数 cv2.VideoCapture.open()打开摄像头,在处理完视频后,要使用函数 cv2.VideoCapture.release()关闭摄像头。
捕获帧
摄像头初始化成功后,就可以从摄像头中捕获帧信息了,捕获帧所使用的是函数cv2.VideoCapture.read(),其语法是:retval, image = cv2.VideoCapture.read(),其中image是返回的捕获到的帧,如果没有帧被捕获,则该值为空;retval表示捕获是否成功,如果成功则该值为True,不成功则为False。
属性设置
有时需要获取或更改cv2.VideoCapture类对象的属性,函数cv2.VideoCapture.get()用于获取对象的属性,其语法格式是:retval = cv2.VideoCapture.get(propId),其中propId对应着cv2.VideoCapture类对象的属性,通过cvc.get(cv2.CAP_PROP_FRAME_WIDTH),就能获取当前帧对象的宽度;函数cv2.VideoCapture.set()用来设置对象的属性,其语法是:retval = cv2.VideoCapture.set(propId, value),其中propId对应对象的属性,value对应属性的值,语句ret = cvc.set(cv2.CAP_PROP_FRAME_WIDTH, 640)将当前帧对象的宽度设置为640像素,cv2.VideoCapture类对象的属性值及含义如表所示。
关于属性的具体表格内容需要补充完整。
grab()和retrieve()函数
一般情况下,如果需要读取一个摄像头的视频数据,最简便的方法就是使用函数cv2.VideoCapture.read(),如果需要同步一组或多头(multihead)摄像头的视频数据时(例如立体摄像头或Kinect),该函数就无法胜任了,可以把函数cv2.VideoCapture.read()理解为是由函数cv2.VideoCapture.grab()和函数cv2.VideoCapture.retrieve()组成的,函数cv2.VideoCapture.grab()用来指向下一帧;函数cv2.VideoCapture.retrieve()用来解码并返回一帧,因此可以使用这两个函数获取多个摄像头的数据,具体语法如下:retval = cv2.VideoCapture.grab(),如果该函数成功指向下一帧则返回值retval为True;retval, image = cv2.VideoCapture.retrieve(),image为返回的视频帧如果未成功则返回一个空图像;retval为布尔型值若未成功则返回False否则返回True,对于一组摄像头可以使用如下代码捕获不同摄像头的视频帧:首先使用cv2.VideoCapture分别初始化不同的摄像头然后使用grab()和retrieve()函数分别获取不同摄像头的视频帧进行后续处理操作,需要注意的是这些函数也能用来读取视频文件,示例代码如下:首先使用cv2库中的VideoCapture
还没有评论,来说两句吧...