图像帧到视频

Image frames to video

我已经尝试使用此处已经提到的所有方法,但无论出于何种原因,其中 none 都有效。

import cv2
import os
import glob



path = '.../Desktop/Plot/'
os.chdir(path)
# video_name = 'video.avi'

width=640 
height=400 
size = (width,height)

img_array = []
for filename in sorted(glob.glob(path+'*.png')):
    img = cv2.imread(path+filename+'.png')
    img_array.append(img)



out = cv2.VideoWriter('project.avi',cv2.VideoWriter_fourcc(*'DIVX'), 15, size)

for i in range(len(img_array)):
    out.write(img_array[i])
out.release()

我没有发现这段代码有什么特别的问题,但它所做的只是将一个 6 kb 的文件放在无法播放的文件夹中。

我在代码中看到了很多问题。

1) 大多数系统不知道您在 '.../Desktop/Plot/' 中的路径 ...,它可能需要是 ..../.. 而不是 ...

2) 你使用相对 path - '.../Desktop/Plot/' 并且当你使用 os.chdir() 更改目录时,当前文件夹的相对路径将创建路径

../Desktop/Plot/../Desktop/Plot/

而且路径不正确。

3) glob.glob(path+'*.png') 将使用 path.png 创建 filenames 但您添加 path.png 读取 imread() 中的图像 - 所以你会得到双 path 和双扩展名

的文件名
 ../Desktop/Plot/../Desktop/Plot/filename.png.png

使用 print(path+filename+'.png') 查看您尝试阅读的内容。

顺便说一句:cv2 在无法读取图像时不会引发错误,但它 return 为空 frame/image 并且当它尝试修改空图像时可能会出错。

4) 如果图像的大小与 640x400 不同,那么它将创建空视频,因为当您保存在视频中时它不会调整图像的大小。您必须在保存到文件之前手动调整图像大小

 img = cv2.resize(img, (width, height))

顺便说一句 一些解码器无法使用某些文件扩展名 - 例如 'DIVX' 将不会保存在带有 textension .mov[=37= 的文件中]

顺便说一句 你可以用一个 for 循环完成所有事情,而不需要 img_array


我的版本

import cv2
import os
import glob

path = '../Desktop/Plot/'

#print(os.getcwd())

width = 640 
height = 400 

out = cv2.VideoWriter('project.avi', cv2.VideoWriter_fourcc(*'DIVX'), 15, (width,height))

for filename in sorted(glob.glob(path + '*.png')):
    print(filename)

    img = cv2.imread(filename)
    img = cv2.resize(img, (width, height))

    out.write(img)

out.release()