OpenCV-Python学习(22)—— OpenCV 视频读取与保存处理(cv.VideoCapture、cv.VideoWriter)

1. 学习目标

  1. 学习 OpenCV 的视频的编码格式 cv.VideoWriter_fourcc;
  2. 学会使用 OpenCV 的视频读取函数 cv.VideoCapture;
  3. 学会使用 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 使用

  1. 以写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. 总结

  1. 视频写入类VideoWriter的参数frameSize是元组 (w, h),即视频帧的宽度和高度,而OpenCV图像的形状是 (h, w),注意二者的顺序相反;
  2. write 写入图片的宽高必须保持一直;
  3. 使用摄像头时,index=0 表示默认后端打开默认摄像机,例如笔记本内置摄像头。

猜你喜欢

转载自blog.csdn.net/m0_38082783/article/details/129351439