我正在尝试使用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
命令来安装标准编解码器,这些命令也是Google在Google搜索中发现的:
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()