【问题标题】:Python creating video from images using opencvPython使用opencv从图像创建视频
【发布时间】:2017-08-20 07:08:25
【问题描述】:

我试图创建一个视频来显示数据的动态变化,就像只是快速地一张一张地连续显示图像,所以我使用了图像(图像只是称为 1,2,3,4,... ..) 并编写了以下代码:

import cv2
import numpy as np

img=[]
for i in range(0,5):
    img.append(cv2.imread(str(i)+'.png'))

height,width,layers=img[1].shape

video=cv2.VideoWriter('video.avi',-1,1,(width,height))

for j in range(0,5):
    video.write(img)

cv2.destroyAllWindows()
video.release()

并引发了错误:

TypeError: image is not a numpy array, neither a scalar

我认为我以错误的方式使用了该列表,但我不确定。那我哪里做错了?

【问题讨论】:

标签: python opencv


【解决方案1】:

您正在编写整个帧数组。尝试逐帧保存:

...
for j in range(0,5):
  video.write(img[j])
...

reference

【讨论】:

  • 是的,我刚刚意识到我犯了一个愚蠢的错误......无论如何,谢谢!
  • 不客气。请将此答案标记为解决方案。谢谢 :) (@YingqiangGao)
  • 我是新来的堆栈溢出,我怎样才能将你的答案标记为你想要的?
  • 答案左侧有一个勾号。这将标志着您的问题得到了正确回答。 (@YingqiangGao)
  • @Vaclav,这仅适用于 png 文件.. 读取保存为 jpeg 的帧时出现以下错误:2019-01-21 00:15:25.527 python3[96196:35304132] AVF: AVAssetWriter状态:无法保存..有什么想法吗?
【解决方案2】:

您可以循环读取帧并将它们写入视频。以下是您的代码,稍作修改以删除一个 for 循环。

  import cv2
  import numpy as np
  
  # choose codec according to format needed
  fourcc = cv2.VideoWriter_fourcc(*'mp4v') 
  video = cv2.VideoWriter('video.avi', fourcc, 1, (width, height))

  for j in range(0,5):
     img = cv2.imread(str(i) + '.png')
     video.write(img)

  cv2.destroyAllWindows()
  video.release()

或者,您可以使用 skvideo 库来创建视频形式的图像序列。

  import numpy as np
  import skvideo.io
   
  out_video =  np.empty([5, height, width, 3], dtype = np.uint8)
  out_video =  out_video.astype(np.uint8)
  
  for i in range(5):
      img = cv2.imread(str(i) + '.png')
      out_video[i] = img

  # Writes the the output image sequences in a video file
  skvideo.io.vwrite("video.mp4", out_video)

  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-01
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多