图像帧到视频
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()
我已经尝试使用此处已经提到的所有方法,但无论出于何种原因,其中 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()