open cv——视频的操作

cv2.VideoCapture(),cv2.VideoWriter(),Capture.read(),Capture.isOpen(),cv2.VideoWriter_fourcc(),Capture.release(),VideoWrite.release(),Capture.set()

目标

·学会读取视频,播放视频和保存视频

·学会使用摄像机捕获视频并且展示

·使用函数cv2.VideoCapture(),cv2.VideoWriter()

使用摄像头获取视频

我们经常使用摄像机获取现场的画面。对此Open cv提供了一个非常简单的接口。下面让我们从摄像机里面获取一端视频(使用笔记本电脑内置的网络摄像机)。把视频转化为灰度视频并且把它展示出来。这是一项很简单的任务。

要去获取视频,你需要创建一个VideoCapture对象。参数可以是设备的索引值或者视频名称。设备的索引值只是为了区分不同的设备。像我,一台电脑一般只有一个摄像设备。所以我只传了一个简单的0(或者-1)作为参数。你可以使用别的摄像头,这个时候参数就是1或者其他的什么数字。在那之后,一帧一帧地获取你视频。最后别忘了释放VideoCapture对象。

import numpy as np

import cv2

#导入库

cap = cv2.VideoCapture(0)

#创建Capture对象cap,由于传入的参数是'0',因此使用内置的摄像头

while(True):

ret, frame = cap.read()

# 不断一帧一帧读入视频,ret是一个布尔值,可以判断是否正确读入帧,frame就是帧(视频就是一帧一帧播放)

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

# 把读入的帧转化为灰度图

cv2.imshow('frame',gray)

if cv2.waitKey(1) & 0xFF == ord('q'):

#当在键盘上输入'q'的时候就执行下面的break操作,waiteKey的参数1代表播放的帧速率是1ms/帧

    break

cap.release()

#释放Capture对象

cv2.destroyAllWindows()

#关闭所有窗口

Cap.read(返回一个布尔值。如果正确读入了帧,那么这个布尔值就是True。所以你可以检查这个值来检查这个视频是否正确。

有时候这个Capture对象不能正确创建,这个时候可以调用Capture.isOpen()来检查,如果这个值是True,那么就可以了。否则还要调用Capture.open()函数。

你也可以调用Capture.get(propld)方法,propld是从0-18的数字。每一个数字代表视频的一个属性(如果对视频是可用的属性的话),比如视频的尺寸分别是参数3和4。完整的属性可以通过:Property Identifier来查看(dir()等)。改变属性的方法是Capture.set(propld,value)来改变。Value参数就是你想要的属性。

从文件中读取视频

与从摄像头中读取视频很类似,知识把摄像头的索引值变成视频文件的名称。同样在播放视频的时候使用合适的帧间隔函数cv2.waitKey(),括号内的数字代表帧与帧之间的间隔,0代表静态帧。数值设置为25是比较合适的。

import numpy as np

import cv2

cap = cv2.VideoCapture('vtest.avi')

while(cap.isOpened()):

#判断能不能打开文件

ret, frame = cap.read()

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

cv2.imshow('frame',gray)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

cap.release()

cv2.destroyAllWindows()


注意:

确保你已经安装了正确版本的ffmpeg或者gstream。

保存视频

我们一帧一帧把视频拿出来了,接下来就是如何保存视频。对于图像,保存是非常简单的,就是cv2.imwrite()。但是视频的保存要复杂一点。

保存视频需要一个VideoWrite对象。需要明确给出要保存的视频的名称,需要加后缀,比如:output.avi。然后是FourCC代码(在下文会有说明)。然后是帧速率(fps)和帧尺寸。最后一个是isColor标志。如果是True,那么视频的编码就需要色彩帧,否则就是灰度帧。

上面提到的FourCC是一个四字节的代码,明确视频的编码或者解码器。可用的视频编码格式在fourcc.org里面有说明。下面是一些可用的编码解码器:

·在Fedora操作系统中:DIVX, XVID, MJPG, X264, WMV1, WMV2.(XVID受人们欢迎,MJPG是高尺寸的视频,X264是低尺寸视频)

·对于windows:DIVX

·对于OSX:

上面的解码器都是四个字节(可能不是那么准确)的,也就是FourCC,在使用FourCC的时候,需要传递参数:cv2.VideoWriter_fourcc(‘M’,’J’,’P’,’G’),或者是cv2.VideoWriter_fourcc(*’MJPG)

import numpy as np

import cv2

cap = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc(*'XVID')

out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))

#创建一个VideoWrite对象

while(cap.isOpened()):

ret, frame = cap.read()

if ret==True:

frame = cv2.flip(frame,0)

# 调转帧方向

out.write(frame)

cv2.imshow('frame',frame)

if cv2.waitKey(1) & 0xFF == ord('q'):

break

else:

break

cap.release()

out.release()

cv2.destroyAllWindows()

你可能感兴趣的:(open cv——视频的操作)