【问题标题】:OpenCV fails to create video from imagesOpenCV 无法从图像创建视频
【发布时间】:2018-03-01 07:38:36
【问题描述】:

这是我第一次尝试制作视频文件,我似乎很笨拙。 受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 创建了视频。

【问题讨论】:

  • 注意,我还想知道它是否不接受所有图像格式。但我尝试了 jpg 和 png 都没有成功。
  • 您是否尝试过与“说明”中相同的代码,我的意思是没有包含 2-3 个图像的 for 循环?此外,video 变量应该只创建一次,也就是说,在 for 之外。另外,我认为您应该在使用视频后发布视频(打印在哪里,在循环之外)。最后一件事您不需要销毁所有窗口,因为没有打开任何窗口

标签: python opencv


【解决方案1】:

当您运行for-loop 时,您正在为每个具有相同文件名的帧创建VideoWriters。因此,它正在用新框架覆盖文件。
因此,您必须在输入for-loop 之前创建VideoWriter 对象。

但这样做不会使您的代码正常工作。由于误用命令,还有一些其他错误。

首先,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()

【讨论】:

  • 一些小进展:现在视频制作完成,但无法打开,大小为 0 字节...我什至被提示定义压缩质量,但无论我选择什么都没有区别.
  • 这太荒谬了...我将fourcc从-1更改为1并出现错误。改回来,现在视频制作好了,2.8MB大小,但是打不开。
  • 这里在VideoWriter 中,-1 表示没有使用编码器。因此,系统会提示您从系统中已安装的编码器中选择视频编码器。
    1 表示帧速率。因此,您的图像将显示在视频中,每秒 1 张图像。
    所以改变 -1 和 1 并不能解决问题。
    可能是您的系统中没有安装编码器。尝试安装编解码器包。
猜你喜欢
  • 2017-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-17
  • 2019-04-12
  • 2011-08-08
相关资源
最近更新 更多