使用glob从图像构建电影时,文件顺序相反



我正在使用下面的代码片段从文件夹中构建一个图像电影。这些图像的名称是这样的。。。GS_FE_1.png、GS_FE_2.png和GS_FE_3.png,我希望确保图像以反转/降序使用,这样电影的第一帧将是FE_之后编号最大的文件"FE_";永远是价值的先导。任何想法都将不胜感激!

import cv2
import numpy as np
import glob
frameSize = (2108, 1410)
out = cv2.VideoWriter(r'C:UsersjayDesktopoutput_video.avi',cv2.VideoWriter_fourcc(*'DIVX'), 60, frameSize)
for filename in glob.glob(r'C:UsersjayDesktopImages*.png'):
img = cv2.imread(filename)
out.write(img)
out.release()

您可以按照这个答案使用natsort模块:

>>> from natsort import natsorted
>>> natsorted(['asdf123', 'asdf1234', 'asdf111', 'asdf124'])
['asdf111', 'asdf123', 'asdf124', 'asdf1234']

如果大小写比较复杂,并且文件名包含一些不同的数字,但您希望在FE_之后使用特定的数字,则可以选择正则表达式
我不是这个领域的大专家,但使用链接的答案得到了以下解决方案:

import re
key_pattern = re.compile(r'([^?]*)FE_(d*)')
def sorting_key(item):
m = key_pattern.match(item)
return int(m.group(2)) # m.group(2) is string representation of number after FE

可以用作:

sorted(names, key=sorting_key, reverse=True)

使用合成名称进行测试:

>>> names = [f'GS_FE_{i}.png' for i in range (100)]
>>> sorted(names, key=sorting_key, reverse=True)
['GS_FE_99.png',
'GS_FE_98.png',
'GS_FE_97.png',
...

由于图像命名是统一的,您可以执行:

sorted(filenames, key=lambda x:int(x.split('_')[-1].split('.')[-2]), reverse=True)

最新更新