由于cv.imread()函数只能读取图像的数据,不能读取视频文件,所以对于数据需要从摄像头加载的要求,需要使用cv.VideoCapture()函数,通过该函数可以对摄像头进行调用,并读取视频文件数据。该函数是专门用于处理视频文件读取。
cv.VideoCapture()函数,通过该函数可以对摄像头进行调用,并读取视频文件数据。
从函数的原型中可以得知,cv.VideoCapture()函数是用于构造一个能够读取与处理视频文件的的视频对象,并且函数可以将该视频对象返回。
<VideoCapture object> = cv.VideoCapture()
<VideoCapture object> = cv. VideoCapture(filename,
[,apipreference])
#filename:读取的视频文件名称。
# apipreference:读取数据时设置的属性,例如编码格式、是否调用OpenNI等
函数的主要作用就是定义一个视频对象,即默认构造函数video = cv.VideoCapture(),通过cv.VideoCapture()函数仅仅是创建VideoCapture对象video,如果需要具体读取视频文件,需要使用该VideoCapture对象的open()函数,通过open()函数指出视频文件的路径以及名称。
例如video.open(“./videos/test.mp4”)表示video视频对象读取在本级文件夹中videos的test.mp4视频文件,将视频数据返回。而且当我们输入错误的视频文件名称时,程序不会报错,而且会继续执行,但是当使用视频对象变量时,程序将会报错。为了避免这个问题,需要通过VideoCapture对象video中的isOpened()函数判断是否成功读取到视频文件数据。如果读取成功返回值为True;如果读取失败,则返回值为False,
代码如下(示例):
import cv2 as cv
if __name__ == '__main__':
video = cv.VideoCapture()
video.open('./video/test.avi')
#判断是否成功创建视频流
while video.isOpened():
ret,frame = video.read()
print(ret)
if ret is True:
cv.imshow('video',frame)
#设置播放速速
cv.waitKey(int(1000 / video.get(cv.CAP_PROP_FPS)))
#按下q键退出
if cv.waitKey(1) & 0xFF == ord('q'):
break
else:
break
#输出相关参数信息
print('视频中的图像宽度{}'.format(video.get(cv.CAP_PROP_FRAME_WIDTH)))
print('视频中的图像高度{}'.format(video.get(cv.CAP_PROP_FRAME_HEIGHT)))
print('视频帧率{}'.format(video.get(cv.CAP_PROP_FPS)))
print('视频帧数{}'.format(video.get(cv.CAP_PROP_FRAME_COUNT)))
#释放资源并关闭窗口
video.release()
cv.destroyAllWindows()
cv.VideoCapture()函数不仅仅可以将读取读取的视频数据赋值给申明的变量,而且在读取文件种类上包含多种格式,例如普通视频文件(video.avi)、图像序列或者视频流的URL。通过cv.VideoCapture()函数创建一个视频对象之后,可以利用cv.VideoCapture()对象中的read()函数读取一帧图像,例如ret,frame=video.read(),其中读取一张图像的数据存放在frame中;ret中存放成功读取图片的标志位,如果读取成功,则返回True;若读取失败,则返回False。通常,可以利用ret标志判断视频文件是否到达了末尾。
cv.VideoCapture对象同时可以利用get(propId)函数来查看视频的属性,通过设定propId获取不同的视频属性,例如视频的宽度、高度、帧数等,其取值为0~18的任意整数,如图2-4所示。Get()方法中propId的可选标志。
标志 | 简记 | 含义 |
---|---|---|
cv.CAP_PROP_POS_MSEC | 0 | 视频文件的当前位置(以毫秒为单位) |
cv.CAP_PROP_POS_FRAMES | 1 | 下一个被解码的帧索引,以0为起点 |
cv.CAP_PROP_POS_AVI_RATIO | 2 | 视频文件的相关位置,0表示开始,1表示结束 |
cv.CAP_PROP_FRAME_WIDTH | 3 | 视频流中图像的宽度 |
cv.CAP_PROP_FRAME_HEIGHT | 4 | 视频流中图像的高度 |
cv.CAP_PROP_FPS | 5 | 视频流中图像的帧率(每秒帧数) |
cv.CAP_PROP_FOURCC | 6 | 编解码器的4字符代码 |
cv.CAP_PROP_FRAME_COUNT | 7 | 视频流中的帧数 |
cv.CAP_PROP_FRAME | 8 | 返回的Mat对象的格式 |
cv.CAP_PROP_MODE | 9 | 指示当前捕捉的模式 |
cv.CAP_PROP_BRIGHTNESS | 10 | 图像的亮度(仅相机) |
cv.CAP_PROP_CONTRAST | 11 | 图像的对比度(仅相机) |
cv.CAP_PROP_STAURATION | 12 | 图像饱和度(仅相机) |
cv.CAP_PROP_HUE | 13 | 图像的色相(仅相机) |
cv.CAP_PROP_GAIN | 14 | 图像的增益(仅相机) |
cv.CAP_PROP_EXPOSURE | 15 | 曝光(仅相机) |
cv.CAP_PROP_CONVERT_RGB | 16 | 布尔值,确定是否应该将图像转换为RGB格式 |
cv.CAP_PROP_WHITE_BALANCE_BLUE_U | 17 | 白平衡 |
cv.CAP_PROP_RECTIFCATION | 18 | 立体相机校正标记 |
cv.VideoCapture()函数同时也可以通过调用摄像头的方式来获取视频,其获取方式与从文件中读取视频类似。函数同样返回一个视频对象,只是参数变成了摄像头索引。由于摄像头拍摄的画面可能与实际相反,所以为了解决这个问题,将frame中的数据进行水平翻转处理,即frame=cv.flip(frame,1),实现了摄像头拍摄的图像进行翻转。
<VideoCapture object> = cv. VideoCapture(index,
[,apipreference])
#index:摄像头索引,参数0表示使用计算机默认摄像头,同样改用其他参数可以调用其他摄像头。
# apipreference:读取数据时设置的属性,例如编码格式、是否调用OpenNI等