使用Python将ppm图像序列转换为视频

3

我想使用IPython(Python 2.7)将PPM图像制作成视频。

我编写了以下代码:

import cv2
import glob

img1 = cv2.imread('C:/Users/Joseph/image0.ppm')
height, width, layers = img1.shape

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

filenames = glob.glob('C:/Users/Joseph/*.ppm')
for filename in filenames:
    print(filename)
    img = cv2.imread(filename)
    video1.write(img)

cv2.destroyAllWindows()
video1.release()

视频已创建,但空的size=0B,无法打开。
没有错误提示信息。
我怀疑问题出在位置的书写上,因为print(filename)输出的是:

C:/Users/Joseph\image0.ppm

C:/Users/Joseph\image1.ppm

C:/Users/Joseph\image2.ppm

C:/Users/Joseph\image2.ppm

而不是我所期望的 :C:/Users/Joseph/image0.ppm 请帮忙确认一下。
编辑:文件类型是type: GIMP 2.10.14 (.ppm)。这个类型的ppm是否有关?
编辑2:看来问题与.ppm格式无关。
import cv2
import glob

i = cv2.imread('C:/Users/Joseph/image0.ppm')
cv2.imwrite('C:/Users/Joseph/image.jpg',i)


img1 = cv2.imread('C:/Users/Joseph/image.jpg')
height, width, layers = img1.shape

# Set FOURCC code to '24BG' - '24BG' is used for creating uncompressed raw video
video1 = cv2.VideoWriter('video1.avi', cv2.VideoWriter_fourcc('D','I','B',' '), 1, (width, height))

filenames = glob.glob('C:/Users/Joseph/*.ppm')

try:
    for filename in filenames:
        print(filename)
        img = cv2.imread(filename)
        cv2.imwrite('C:/Users/Joseph/a.jpg',img)
        img=cv2.imread('C:/Users/Joseph/a.jpg')
        # Display input image for debugging
        cv2.imshow('img', img)
        cv2.waitKey(1000)
        video1.write(img)
except:
     print('An error occurred.')

cv2.destroyAllWindows()
video1.release()

这也不起作用。我也没有看到任何图像显示。

所以看起来这是由于我的cv2视频出现了错误。jpg文件已经成功创建了。

编辑:解决方案。

根据rotem的回答,我尝试了cv2.VideoWriter_fourcc('M','J','P','G'),它奏效了!

1个回答

1
有多个原因导致视频文件为空,但路径看起来是正确的。
在Windows系统中,C:/Users/Joseph\image0.ppmC:/Users/Joseph/image0.ppm是相同的。
手动删除video1.avi文件,以确保文件没有被锁定。
我认为问题涉及到视频编解码器,但我不能确定。
在命令video1 = cv2.VideoWriter('video1.avi', -1, 1, (width, height))中,第二个参数是一个 FOURCC代码,用于选择视频编码器的视频编解码器。 当将值设置为-1时,会打开一个对话框,让您选择编解码器。 在旧版本的OpenCV中,它并不总是有效。
尝试将FOURCC设置为'DIB ',应用“基本Windows位图格式”。用于创建原始(未压缩)AVI视频文件。
以下是代码:
import cv2
import glob

img1 = cv2.imread('C:/Users/Joseph/image0.ppm')
height, width, layers = img1.shape

# Set FOURCC code to '24BG' - '24BG' is used for creating uncompressed raw video
video1 = cv2.VideoWriter('video1.avi', cv2.VideoWriter_fourcc('D','I','B',' '), 1, (width, height))

filenames = glob.glob('*.ppm')

try:
    for filename in filenames:
        print(filename)
        img = cv2.imread(filename)

        # Display input image for debugging
        cv2.imshow('img', img)
        cv2.waitKey(1000)

        video1.write(img)
except:
     print('An error occurred.')

cv2.destroyAllWindows()
video1.release()
  • 我添加了cv2.imshow('img', img)以帮助您调试问题,以防它不是编解码器问题。
  • 确保您没有收到任何异常。

如果我的答案解决了您的问题,请告诉我。


谢谢!但它仍然不起作用。奇怪的是,我也在另一台电脑上尝试了一下,它也不起作用。但我可以用GIMP很好地查看图片。我还编辑了一个关于GIMP的编辑,因为我刚想到这个。 - JoA
我忘了说,也没有错误信息。 - JoA
尝试:将几张图片以PNG格式保存(在GIMP中使用另存为)。 为了确保问题不是PPM格式引起的,请尝试从PNG创建视频。 - Rotem
你也可以尝试使用Python 3和更新版本的OpenCV。同样的代码也适用于Python 3。 - Rotem

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接