OpenCV中对于视频处理提供了VideoCapture和VideoWriter两个类进行处理,理论上支持各种视频格式。不过最终在电脑上支持的格式还是要取决于操作系统和OpenCv的构建配置。接下来,让我尝试了对一个视频进行复制,代码如下:
import cv2
video = cv2.VideoCapture('AMV.mp4')
fps = video.get(cv2.CAP_PROP_FPS) #获得视频帧数
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(video.get(cv2.CAP_PROP_FRAME_HEIGHT))) #获得视频画面的宽高
videowriter = cv2.VideoWriter('MyAmv.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)
success,frame = video.read()
while success: #循环读取帧数
videowriter.write(frame)
success,frame = video.read()
但是这个操作仅仅是对图像进行操作,也就是只复制了视频,没有声音。
关于对视频视频编码器(cv2.VideoWriter_fourcc())的说明:
需要注意的是,帧率和帧的大小也必须指定,可以通过VideoCapture类的get方法进行读取。
摄像头的图像我们也可以可以通过VideoCapture进行获得,通过传递摄像头的设备索引(而不是视频文件名称)来构造VideoCapture对象。
import cv2
camera = cv2.VideoCapture(0)
fps = 30 #设置帧数
size = (int(camera.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(camera.get(cv2.CAP_PROP_FRAME_HEIGHT))) #获得图像宽高
videoWriter = cv2.VideoWriter('camera.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)
success,frame = camera.read() #返回false/True,帧/None
numFramesRemaining = 10*fps - 1 #10 seconds of frames
while success and numFramesRemaining>0:
videoWriter.write(frame)
success,frame = camera.read()
numFramesRemaining -=1
上述代码实现了利用摄像头保存一段十秒的视频。但是如果摄像头出错也可能会无法运行,因此可以在上述代码中加入 VideoCapture.isOpened方法进行判断,返回一个布尔值。
当使用一组多个相机时,read()方法将是不合适的,此时我们可以使用如下方法(一组两台摄像机):
success0 = camera0.grab()
success1 = camera1.grab()
if success0 and success1:
frame0 = camera0.grab()
frame1 = camera1.grab()