【问题标题】:reverse file order in using glob for building a movie from images使用 glob 从图像构建电影的反向文件顺序
【发布时间】:2021-07-07 23:13:57
【问题描述】:

我正在使用此代码 sn-p(如下)从文件夹中构建图像电影。图像命名如下......GS_FE_1.png,GS_FE_2.png,GS_FE_3.png,我想确保图像以 REVERSE / descending 使用,以便电影的第一帧将是文件在 FE_ 之后的数量最多。 “FE_”将始终是该值的前导。任何想法都将不胜感激!

import cv2
import numpy as np
import glob

frameSize = (2108, 1410)

out = cv2.VideoWriter(r'C:\Users\jay\Desktop\output_video.avi',cv2.VideoWriter_fourcc(*'DIVX'), 60, frameSize)

for filename in glob.glob(r'C:\Users\jay\Desktop\Images\*.png'):
    img = cv2.imread(filename)
    out.write(img)

out.release()

【问题讨论】:

    标签: python opencv glob


    【解决方案1】:

    您可以关注this answer并使用natsort模块:

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

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

    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',
    ...
    

    【讨论】:

    • 抱歉打乱了我最初的评论。我的意思是:感谢您的初步回答并跟进!我认为最初的效果会很好,但我确实想为自己的学习检查一些东西:.会对 1,2,3,4,5,6,7,8,9,10,11 或 1,10 等文件进行排序吗?
    • @NightLearner 你是对的:第一个解决方案是按字典顺序对字符串进行排序,所以它不合适(将返回...、3、2、10、1 之类的东西)。所以使用 natsort 或 regex
    • 将字典排序解决方案删除为不相关
    【解决方案2】:

    由于图片命名是统一的,你可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多