问题描述
我在名为jupyter的jpg格式文件夹中有一些图形,我想将它们放在一起以制作视频,但是当我运行代码时,它不会保存并显示视频。
import cv2
import os
from os.path import isfile,join
def convert_pictures_to_video(pathIn,pathOut,fps,time):
frame_array=[]
files= [f for f in os.listdir(pathIn) if isfile(join(pathIn,f))]
for i in range (len(files)):
filename=pathIn+files[i]
img=cv2.imread(filename)
height,width,layers=img.shape
size=(width,height)
for k in range (time):
frame_array.append(img)
out=cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'mp4v'),size)
for i in range(len(frame_array)):
out.write(frame_array[i])
cv2.destroyAllWindows()
out.release()
pathIn='/Users/jupyter/'
pathOut='/Users/jupyter/video.avi'
fps=1
time=20
convert_pictures_to_video(pathIn,time
解决方法
-
- 您要根据图像创建一个
.avi
文件。因此,您应该将fourcc
初始化为MJPG
。
-
fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
-
要创建
mp4v
文件时应使用.mp4
-
fourcc = cv2.VideoWriter_fourcc('m','p','4','v')
-
- 您要根据图像创建一个
-
-
所有图片的大小和
VideoWriter
的大小必须相同。例如:我所有的图像尺寸均为(300,167)。因此:
-
out = cv2.VideoWriter('video.avi',fourcc,25,(300,167),isColor=True)
-
因为要创建彩色图像,所以将
isColor
变量设置为true
-
-
-
-
我更喜欢
glob
来收集所有图像:-
for img in sorted(glob.glob("ball_tracking/*.png")): img = cv2.imread(img) img = cv2.resize(img,167)) out.write(img)
-
-
代码:
import cv2
import glob
fourcc = cv2.VideoWriter_fourcc('M','G')
out = cv2.VideoWriter('video.avi',isColor=True)
for img in sorted(glob.glob("ball_tracking/*.png")):
img = cv2.imread(img)
img = cv2.resize(img,167))
out.write(img)
out.release()
更新
-
如果质量真的很差,您可以做两件事。要降低视频速度,您可以降低帧速率。
-
- 将
.avi
更改为.mp4
-
fourcc = cv2.VideoWriter_fourcc('m','v')
- 将
-
- 您可以更改
image size
。例如,如果您所有图像的大小都相同。然后获取第一张图片的高度和宽度,并将其设置为视频的大小。
-
(h,w) = cv2.imread(glob("<your-path-here>*.png")[0]).shape[:2]
-
如果图像不相同,您仍然可以使用上面的代码,但是质量可能无法提高。
- 您可以更改
-
- 您可以降低帧速率以降低视频播放速度。例如:25到2。
-
out = cv2.VideoWriter('video.avi',2,(w,h),isColor=True)
-
更新代码:
import cv2
import glob
fourcc = cv2.VideoWriter_fourcc('M','V')
(h,w) = cv2.imread(glob("<your-path-here>*.png")[0]).shape[:2]
out = cv2.VideoWriter('video.mp4',isColor=True)
for img in sorted(glob.glob("<your-path-here>*.png")):
img = cv2.imread(img)
img = cv2.resize(img,h))
out.write(img)
out.release()