【Python+OpenCV入门学习】四、视频的读取、显示、保存

本篇文章,将学习如何读取视频,显示视频和保存视频。分别学习从相机和视频文件中读取视频。主要学习类VideoCapture和类VideoWrter的使用。

环境:Windows 7(64)   Python 3.6    OpenCV3.4.2

一、视频的读取与显示

1.1 了解类VideoCapture

对于视频的读取,OpenCV提供了接口VideoCapture。要想编程实现视频的读取与显示,需要熟悉一下该类的构造函数和成员函数。类VideoCapture的两个常见构造函数:

 = cv2.VideoCapture(filename)

功能:打开视频文件。

参数filename:视频文件名。

 = cv2.VideoCapture(index)

功能:打开相机设备

参数index:相机设备ID,当只有一个相机时,给0即可。

VideoCapture常用到的成员函数:

retval =cv2.VideoCapture. isOpened()

功能:判断视频捕获是否初始化成功。初始化成功返回true。之前调用过VideoCapture的构造函数或者VideoCapture::open()函数成功,就会返回true。

retval=cv2.VideoCapture.open(filename)/cv2.VideoCapture.open(index)

功能:打开视频文件或者相机设备进行视频捕获。

retval = cv2.VideoCapture.get(propId)

功能:得到相机/视频文件的各种属性。propId常见取值如下:

cv2.CAP_PROP_POS_MSEC:视频文件的当前位置(ms)

cv2.CAP_PROP_POS_FRAMES:从0开始索引帧,帧位置。

cv2.CAP_PROP_POS_AVI_RATIO:视频文件的相对位置(0表示开始,1表示结束)

cv2.CAP_PROP_FRAME_WIDTH:视频流的帧宽度。

cv2.CAP_PROP_FRAME_HEIGHT:视频流的帧高度。

cv2.CAP_PROP_FPS:帧率

cv2.CAP_PROP_FOURCC:编解码器四字符代码

cv2.CAP_PROP_FRAME_COUNT:视频文件的帧数

cv2.CAP_PROP_FORMAT: retrieve()返回的Mat对象的格式。

cv2.CAP_PROP_MODE:后端专用的值,指示当前捕获模式

cv2.CAP_PROP_BRIGHTNESS:图像的亮度,仅适用于支持的相机

cv2.CAP_PROP_CONTRAST:图像对比度,仅适用于相机

cv2.CAP_PROP_SATURATION:图像饱和度,仅适用于相机

cv2.CAP_PROP_HUE:图像色调,仅适用于相机

cv2.CAP_PROP_GAIN:图像增益,仅适用于支持的相机

cv2.CAP_PROP_EXPOSURE:曝光,仅适用于支持的相机

cv2.CAP_PROP_CONVERT_RGB:布尔标志,指示是否应将图像转换为RGB。

retval = cv2.VideoCapture.set(propId,value)

功能:设置属性,第一个参数是选择属性类型,第二个参数是值。

retval,image= cv2.VideoCapture.read([,image])

功能:抓取,解码并返回下一个视频帧。返回值为true表明抓取成功。该函数是组合了grab()和retrieve(),这是最方便的方法。如果没有帧,该函数返回false,并输出空图像。

retval, image = cv2.VideoCapture.retrieve([, image[, flag]])

功能:解码并返回抓取的视频帧。

retval = cv2.VideoCapture.grab()

功能:从视频文件或相机中抓取下一帧。true为抓取成功。该函数主要用于多摄像头时。

none = cv2.VideoCapture.release()

功能:关闭视频文件或相机设备。

1.2 编程实现从相机中读取并显示视频

很多时候我们需要从相机获取实时视频。本次相机选择笔记本电脑内置的摄像头,从中捕获视频并显示它。首先实现捕获一张图片。基本思路是首先打开相机,相机打开成功后,捕获一帧图像,然后显示,最后记的关闭相机。代码如下:

import cv2

cap = cv2.VideoCapture(0)#打开相机

if cap.isOpened():#判断相机是否打开成功
    ret,frame = cap.read()#捕获一帧图像
    #显示3s
    cv2.imshow('frame',frame)
    cv2.waitKey(3000)

cap.release()#关闭相机
cv2.destroyAllWindows()#关闭窗口

可以发现,这与图像的读取和显示类似,只不过本次图像是从相机中捕获的,捕获是采用的是VideoCapture的成员函数read()。以上功能实现后,可以考虑视频的读取和显示了,也就是连读从相机中捕获图像并显示。在以上代码中加个循环即可,本次实现采用死循环,加了死循环就需要考虑怎么退出循环,本次实现采用按键盘上的’q’键退出循环。代码如下:

import cv2

cap = cv2.VideoCapture(0)#打开相机

while(True):
    ret,frame = cap.read()#捕获一帧图像
    cv2.imshow('frame',frame)
    #判断按键,如果按键为q,退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()#关闭相机
cv2.destroyAllWindows()#关闭窗口

以上功能编程实现很简单,有兴趣可以尝试修改相机参数,如修改图像的大小等,思路是采用set(),也可以编程实现获取相机参数。

1.3 编程实现从视频文件中读取并显示视频

我们有时候也会从视频文件读取视频。它的编程实现和相机捕获图像类似,将设备号改为视频文件名即可。但是在显示时,我们需要加一定延迟,不然视频播放过快。延迟设置正常是25ms。此外,前面采用的是死循环,视频文件是有长度的,读取完毕后就应该退出,应该怎么退出,前面是不是很好奇ret有什么用,在这里就用上了,可以用于判断视频文件是否读取完毕。代码如下:

import cv2

cap = cv2.VideoCapture(‘vtest.avi’)#打开相机

while( True):
    ret,frame = cap.read()#捕获一帧图像
    if ret:
        cv2.imshow('frame',frame)
        cv2.waitKey(25)
    else:
        break

cap.release()#关闭相机
cv2.destroyAllWindows()#关闭窗口

可以尝试改变延时参数,让视频慢放或快放。此外有兴趣可以考虑采用别的方式判断视频文件是否读取完了,思路是通过判断frame是否为空。

二、保存视频

2.1 了解类VideoWriter

对于视频的保存,OpenCV提供了接口VideoWriter。要想编程实现保存视频,需要熟悉一下该类的构造函数和成员函数。

 = cv.VideoWriter( filename, fourcc, fps, frameSize[, isColor] )

参数:

filename:给要保存的视频起个名字

fourcc:指定视频编解码器的4字节代码

fps:帧率

frameSize:帧大小

isColor:如果为true,则视频为彩色,否则为灰度视频,默认为true

在此再介绍一下fourcc。它是用于压缩帧的4字符编解码器代码。如VideoWriter :: fourcc('P','I','M','1')是MPEG-1编解码器,VideoWriter :: fourcc('M','J','P','G ')是一个运动jpeg编解码器等。要想详细了解fourcc,可以百度搜索进行详细的学习。get()、set()、isOpened()、release()等和VideoCapture的成员函数类似,不坐赘述。介绍几个新的成员函数:

retval = cv2.VideoWriter_fourcc( c1, c2, c3, c4 )

功能:将4字符串接为fourcc代码。

None = cv.VideoWriter.write( image )

功能:将帧图像保存为视频文件。

2.2 编程实现保存视频

很多时候我们捕获视频,并对其进行帧处理,希望保存处理后的视频。要想保存视频,首先当然是进行捕获视频,代码和前面一样,本次实现保存相机中捕获的视频。将视频保存,思路是首先创建VideoWriter类对象,需要指定一些参数,在windows下fourcc取值为DIVX,帧率一般给20,帧大小一般给640*480,创建对象后,采用write()函数保存帧,保存完后记得关闭VideoWriter类对象。所以代码如下:

import cv2

cap = cv2.VideoCapture(0)#打开相机

#创建VideoWriter类对象
fourcc = cv2.VideoWriter_fourcc(*’XVID’)
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

while(True):
    ret,frame = cap.read()#捕获一帧图像
    out.write(frame)#保存帧
    cv2.imshow('frame',frame)#显示帧
    #判断按键,如果按键为q,退出循环
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()#关闭相机
out.release()
cv2.destroyAllWindows()#关闭窗口

该行代码fourcc = cv2.VideoWriter_fourcc(*’XVID’)可以改为fourcc = cv2.VideoWriter_fourcc(’X’,’V’,’I’,’D’),他们是一样的。有兴趣可以考虑对每帧画面进行一个简单处理后再保存。

三、总结

本次学习了如何从相机或视频文件中读取,显示并保存视频。主要学了两个类:VideoCapture和VideoWriter。

你可能感兴趣的:(Python,opencv)