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通道彩图

你可能感兴趣的:(pyqt,python,cv,opencv)