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()