1. 学习目标
- 学习 OpenCV 的视频的编码格式 cv.VideoWriter_fourcc;
- 学会使用 OpenCV 的视频读取函数 cv.VideoCapture;
- 学会使用 OpenCV 的视频保存函数 cv.VideoWriter。
2. cv.VideoWriter_fourcc()常见的编码参数
2.1 参数说明
参数 | 说明 |
---|
cv.VideoWriter_fourcc(‘M’,‘P’,‘4’,‘V’) | MPEG-4编码 .mp4 可指定结果视频的大小 |
cv.VideoWriter_fourcc(‘X’,‘2’,‘6’,‘4’) | MPEG-4编码 .mp4 可指定结果视频的大小 |
cv.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’) | 该参数是YUV编码类型,文件名后缀为.avi 广泛兼容,但会产生大文件 |
cv.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’) | 该参数是MPEG-1编码类型,文件名后缀为.avi |
cv.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’) | 该参数是MPEG-4编码类型,文件名后缀为.avi,可指定结果视频的大小 |
cv.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’) | 该参数是Ogg Vorbis,文件名后缀为.ogv |
cv.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’) | 该参数是Flash视频,文件名后缀为.flv |
2.2 使用
- 以写mp4视频为例,以下为等价写法:
fourcc = cv.VideoWriter_fourcc('m', 'p', '4', 'v')
fourcc = cv.VideoWriter_fourcc('M', 'P', '4', 'V')
fourcc = cv.VideoWriter_fourcc(*'MP4V')
fourcc = cv.VideoWriter_fourcc(*'mp4v')
3. 视频读取
3.1 cv.VideoCapture() 函数说明
cv.VideoCapture(filename[, apiPreference[, params]]) → <VideoCapture object>
cv.VideoCapture(index[, apiPreference[, params]]) → <VideoCapture object>
3.2 参数说明
参数 | 说明 |
---|
filename | 表示读取的视频文件的路径,包括扩展名。 |
index | 表示摄像头的 ID 编号,0 表示默认后端打开默认摄像机。 |
apiPreference | 表示决定使用那个第三方库读取视频。 |
4. 视频保存
4.1 cv.VideoWriter() 函数说明
cv.VideoWriter(filename, fourcc, fps, frameSize[, isColor]) → <VideoWriter object>
4.2 参数说明
参数 | 说明 |
---|
filename | 表示保存的视频文件的路径,包括扩展名。 |
fourcc | 表示用于压缩帧的编码器/解码器的字符代码。 |
fps | 表示视频流的帧速率。 |
frameSize | 表示元组 (w, h),视频帧的宽度和高度。 |
isColor | 表示是否彩色图像。 |
5. cv.VideoCapture 和 cv.VideoWriter 的成员函数
函数名 | 说明 |
---|
cv.VideoCapture.isOpened() | 表示检查视频捕获是否初始化成功。 |
cv.VideoCapture.read() | 表示捕获视频文件、视频流或捕获的视频设备。 |
cv.VideoCapture.get(propId) | 表示获取 VideoCapture 类对象的属性。 |
cv.VideoCapture.set(propId, value) | 表示设置 VideoCapture 类对象的属性。 |
cv.VideoCapture.release() | 表示关闭视频文件或设备,释放对象。 |
cv.VideoWriter.fourcc(c1, c2, c3, c4[, ]) | 表示构造编码器/解码器的fourcc代码。 |
cv.VideoWriter.write(image[, ]) | 表示写入下一帧视频。 |
cv.VideoWriter.release() | 表示关闭视频写入,释放对象。 |
6. 实例将 .avi 转 .mp4
6.1 实例代码
import cv2 as cv
import imageio
# 读取视频,将视频按照帧导出图片
def get_video_images(video_path):
cap = cv.VideoCapture(video_path)
images = []
while cap.isOpened():
ret, frame = cap.read() # 读取下一帧视频图像
if ret is True:
cv.imshow("frame", frame)
images.append(frame)
key = cv.waitKey(24)
if key == ord('q'):
break
else:
break
cap.release()
cv.destroyAllWindows()
return images
# 转MP4
def create_mp4(filename, fps, images):
h,w,c = images[0].shape
fourcc = cv.VideoWriter_fourcc(*'mp4v')
writer = cv.VideoWriter(filename, fourcc, fps, (w,h))
for frame in images:
writer.write(frame)
writer.release()
if __name__ == "__main__":
imgs = get_video_images('./images/Megamind.avi')
create_mp4('./images/Megamind.mp4', 24, imgs)
6.2 转换结果使用 gif 展示
7. 总结
- 视频写入类VideoWriter的参数frameSize是元组 (w, h),即视频帧的宽度和高度,而OpenCV图像的形状是 (h, w),注意二者的顺序相反;
- write 写入图片的宽高必须保持一直;
- 使用摄像头时,index=0 表示默认后端打开默认摄像机,例如笔记本内置摄像头。