无法从 Py OpenCV 创建的视频中解复用流

Cannot Demultiplex Stream from Video created by Py OpenCV

我正在尝试使用 OpenCV 从单个帧中创建视频。虽然代码运行没有错误,但我无法播放生成的 avi 文件。当我这样做时,我得到的错误是 Could not demultiplex stream

我用来执行此操作的代码的精简版本是:

import caffe
import cv2
import fnmatch
import os

# Get Image List
image_list = fnmatch.filter('./sample/images','*.png')
image_list.sort()

# Create VideoWriter
# codec = cv2.VideoWriter_fourcc('M', 'J', 'P', 'G')
# codec = -1
codec = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
video = cv2.VideoWriter( './movieT.avi',
                         codec,
                         20,
                         (289, 289))

for img_name in image_list:
    # Load image
    im_path = os.path.join('./sample/images',img_name)
    img = caffe.io.load_image(im_path)

    # Resize image to expected size
    img = caffe.io.resize(img,(289, 289, 3))

    # Write image
    video.write(img)
video.release()

我用 Google 搜索了一下,我看到提到的主要错误是确保图像大小与 cv2.VideoWiter 预期的大小相匹配,并且我有正确的编解码器。我调整图像大小以确保它们大小合适,并尝试了几种不同的编解码器。我还尝试使用一些 apt-get install 命令安装标准编解码器,我也通过谷歌搜索发现:

me@balin:~$ sudo apt update
me@balin:~$ sudo apt install libdvdnav4 libdvdread4 gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly libdvd-pkg
me@balin:~$ sudo apt install ubuntu-restricted-extras

我目前正在使用:

Ubuntu 18.04
Python 2.7.17
cv2.__version__ 4.0.1

我认为你的问题是 fnmatch.filter() 的不正确使用,它不会从文件夹中获取文件名,但它仅用于检查文件名是否匹配模式。

参见 fnmatch

中的示例
import fnmatch
import os

for file in os.listdir('.'):
    if fnmatch.fnmatch(file, '*.txt'):
        print(file)

使用你的代码,我总是得到空列表,所以以后它无法向视频添加任何图像,我也无法显示该视频。

但是你可以用 glob.glob() 来做这个

image_list = glob.glob('./sample/images/*.png')

这段代码对我有用

import cv2
import glob

image_list = glob.glob('./sample/images/*.png')
image_list.sort()
#print(image_list)

codec = cv2.VideoWriter_fourcc('X', 'V', 'I', 'D')
video = cv2.VideoWriter('./movieT.avi', codec, 20, (289, 289))

for img_name in image_list:
    img = cv2.imread(img_name)
    img = cv2.resize(img, (289, 289))
    video.write(img)

video.release()