cv2.VideoWriter 保存图像为视频的几个问题

Posted 老衲要学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cv2.VideoWriter 保存图像为视频的几个问题相关的知识,希望对你有一定的参考价值。

用opencv库的cv2.VideoWriter函数保存图像为视频

一、先确定要保存的视频的编码方式

  1. cv2.VideoWriter_fourcc(‘I’, ‘4’, ‘2’, ‘0’),该参数是YUV编码类型,文件名后缀为.avi
  2. cv2.VideoWriter_fourcc(‘P’, ‘I’, ‘M’, ‘I’),该参数是MPEG-1编码类型,文件名后缀为.avi
  3. cv2.VideoWriter_fourcc(‘X’, ‘V’, ‘I’, ‘D’),该参数是MPEG-4编码类型,文件名后缀为.avi
  4. cv2.VideoWriter_fourcc(‘T’, ‘H’, ‘E’, ‘O’),该参数是Ogg Vorbis,文件名后缀为.ogv
  5. cv2.VideoWriter_fourcc(‘F’, ‘L’, ‘V’, ‘1’),该参数是Flash视频,文件名后缀为.flv
# 两种写法作用相同
fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')
fourcc = cv2.VideoWriter_fourcc(*'I420')

一般情况下,视频保存为以上几种格式即可。

二、选择用本地或网络摄像头拍摄视频并保存

摄像头拍摄的视频一般都是三通道(RGB)的,所以直接保存没有问题

def webcam_save_fun(video_pathname, video_name, fps):
    cap = cv2.VideoCapture(0)
    fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')
    out = cv2.VideoWriter(video_pathname+'/'+video_name, fourcc, fps, (640, 480))
    while cap.isOpened():
        ret, frame = cap.read()
        out.write(frame)
        cv2.imshow('img', frame)
        if cv2.waitKey(1) == 27:
            break
    cap.release()
    out.release()
    cv2.destroyAllWindows()

三、读取本地文件夹下的有序图像序列并保存为视频

由于我的图片是1通道的灰度数据,所以不能保存或打不开文件,
在读取的时候,要将灰度图转为3通道的RGB图

# 图片转视频
def image_to_video_fun(image_pathname, video_pathname, video_name, fps):  
	# image_pathname: 图像保存地址
	# video_pathname: 视频地址
	# video_name: 视频名
	# fps: 帧率
	# eg:image_pathname = 'E:\\program_study\\paperdata\\0710-1430-40'
	#     video_pathname = 'try.avi'
    file_list = os.listdir(image_pathname)
    # 此处必须sort,因为读取的文件顺序按照字符串ASSIC码排序而非数字。
    
    file_list.sort(key=lambda x: int(x.split('_')[1].split('.')[0]))
    fourcc = cv2.VideoWriter_fourcc('I', '4', '2', '0')
    videoWriter = cv2.VideoWriter(video_pathname+'/'+video_name, fourcc, fps, (480, 480))
    for file_name in file_list:
        img = cv2.imread(file_path + '/' + file_name, 1)
        videoWriter.write(img)
    videoWriter.release()

tips:
cv2.imread(“img”.jpg, flag)
此处的flag 必须明白,不能乱写,
flag = -1, 8位深度,原通道,此时读取的是原来的图像
flag = 0, 8位深度,1通道,读取的是灰度图
flag = 1, 8位深度,3通道彩图
flag = 2, 原深度, 灰度
flag = 3,原深度,彩图
flag = 4, 8位深度, 3通道彩图

以上是关于cv2.VideoWriter 保存图像为视频的几个问题的主要内容,如果未能解决你的问题,请参考以下文章

图像转视频

python中的openCV视频保存

如何在 cv2.VideoWriter 中使用 FPS 参数?

创建视频前后的帧大小差异

使用 cv2 VideoWriter 编写 numpy 数组

cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它