这是我制作视频文件的第一次尝试,而且我看起来非常笨拙。 受these instructions的启发,将几个图像放在一个视频中,我通过创建一个可以在图像文件夹中循环的函数来修改代码。但这花了太长时间。我认为这是因为有很多图像,但即使我只用两张图像来做,它仍然会永远运行。
我没有收到错误消息,脚本永远不会停止。
有人可以解释我的代码有什么问题吗?必须有一些我没有发现的愚蠢的东西,并使它成为无限循环或其他东西......
import cv2
import os
forexample = "C:/Users/me/Pictures/eg/"
eg = cv2.imread(forexample+'figure.jpg')
height , width , layers = eg.shape
print "ok, got that"
def makeVideo(imgPath, videodir, videoname, width,height):
for img in os.listdir(imgPath):
video = cv2.VideoWriter(videodir+videoname,-1,1,(width,height))
shot = cv2.imread(img)
video.write(shot)
print "one video done"
myexample = makeVideo(forexample,forexample, "example.avi", width, height)
cv2.destroyAllWindows()
myexample.release()
在Windows机器上运行,Python 2.7.12,cv2 3.3.0
更新 最终使用FFmpeg创建了视频。
答案 0 :(得分:3)
当您运行for-loop
时,您将为具有相同文件名的每个帧创建VideoWriters
。因此,它使用新框架覆盖文件
因此,您必须在输入VideoWriter
之前创建for-loop
对象。
但这样做不会使你的代码正常工作。由于误用命令,还有一些其他错误。
首先,os.listdir(path)
将返回文件名列表,但不返回文件路径。因此,在调用文件读取函数(cv2.imread(imgPath+img)
)时,需要将文件夹路径添加到该文件名。
cv2.VideoWriter()
将在文件夹中创建视频文件。因此,它也会列在os.listdir(path)
中。因此,您需要删除所需的图像文件以外的文件。可以通过检查文件扩展名来完成。
将所有帧写入视频后,您需要调用release()
函数来释放文件句柄。
最后,makeVideo()
函数不会返回任何内容。所以没有必要把它变成一个变量。 (你需要release()
是文件处理程序,但不是我上面所说的功能。)
请尝试以下代码..
import cv2
import os
forexample = "C:/Users/me/Pictures/eg/"
eg = cv2.imread(forexample+'figure.jpg')
height , width , layers = eg.shape
print("ok, got that ", height, " ", width, " ", layers)
def makeVideo(imgPath, videodir, videoname, width, height):
video = cv2.VideoWriter(videodir+videoname,-1,1,(width, height))
for img in os.listdir(imgPath):
if not img.endswith('.jpg'):
continue
shot = cv2.imread(imgPath+img)
video.write(shot)
video.release()
print("one video done")
makeVideo(forexample,forexample, "example.avi", width, height)
cv2.destroyAllWindows()