首页 > 解决方案 > 如何修复以随机顺序写入视频的图像

问题描述

我正在尝试将 271 张已经按数字顺序排列的模拟图像('0.jpg'、'1.jpg'、...、'271.jpg')写入视频。cv2.videoWriter 似乎正在以随机顺序写入所有这些图像,产生的视频与模拟中应该发生的情况不一致。

我已经尝试过 using glob,它产生与 using 相同的结果os.path

import numpy as np
import os
from os.path import isfile, join

pathIn= 'path/simulation/'
pathOut = 'video.avi'

fps = 10 

frame_array = []

files = [f for f in os.listdir(pathIn) if isfile(join(pathIn, f))]

# for sorting the file names properly
files.sort(key = lambda x: x[5:-4])
files.sort()
frame_array = []
files = [f for f in os.listdir(pathIn) if isfile(join(pathIn, f))]

for i in range(len(files)):
    filename=pathIn + files[i]
    # reading each file
    img = cv2.imread(filename)
    height, width, layers = img.shape
    size = (width,height)

    # inserting the frames into an image array
    frame_array.append(img)

out = cv2.VideoWriter(pathOut,cv2.VideoWriter_fourcc(*'DIVX'), fps, size)

for i in range(len(frame_array)):
    # writing to a image array
    out.write(frame_array[i])
out.release()

图像转换为视频的预期顺序:

'0.jpg', '1.jpg', ... '271.jpg'

实际结果:

'31.jpg', '230.jpg', '12.jpg', ...

标签: pythoncv2

解决方案


有两个问题

files.sort(key = lambda x: x[5:-4])
files.sort()

首先,'0.jpg'[5:-4]产生一个空字符串。我想你想要类似的东西

file.sort(key = lambda x: int(x[:-4]))

其次,您通过再次排序丢弃了结果。放弃第二种。


推荐阅读