OpenCV无法从图像创建视频

时间:2017-09-20 09:48:37

标签: python opencv

这是我制作视频文件的第一次尝试,而且我看起来非常笨拙。 受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创建了视频。

1 个答案:

答案 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()