我正在使用下面的代码片段从文件夹中构建一个图像电影。这些图像的名称是这样的。。。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)