使用 cv2.videowriter 时如何处理文件名读取约定

How to deal with filename reading convention when using cv2.videowriter

基本上我有一个包含具有以下命名约定 frame{framenumber}.jpeg 的图像的目录。但是,当我实现以下旨在使用 cv2 包将这些图像拼接成视频的功能时,会出现这种意外行为,即按以下顺序读取文件: ['frame0.jpg', 'frame1.jpg', frame10.jpg', '100.jpg', '101.jpg', '102.jpg', '103.jpg ', 'frame104.jpg', 'frame105.jpg', 'frame106.jpg', 'frame107.jpg', 'frame108.jpg', 'frame109.jpg', 'frame11.jpg', 'frame110.jpg', ...] 所以它没有按时间顺序排列,看起来有点有趣,因为至少每 10 帧都来自视频的完全不同的片段。这个问题是否有一个明显的解决方案(一些更好的方式来读取我不知道的一些命名约定的图像)?

def makevideo():
    img_array = []
    filenames = [] 
    for filename in glob.glob(r'D:\Uni work\Engineering Mathematics Work\MDM3\Mojo\mojo_sperm_tracking_data_bristol\tp49\*.jpg'):
        img = cv2.imread(filename)
        height, width, layers = img.shape
        size = (width,height)
        filenames.append(filename)
        img_array.append(img)
    
    print(filenames)   
    out = cv2.VideoWriter('project.avi',cv2.VideoWriter_fourcc(*'DIVX'), 60, size)

    for i in range(len(img_array)):
        out.write(img_array[i])
    out.release()

提前致谢!

文件系统上的文件未排序。您需要使用 sorted() 函数自行对生成的文件名进行排序:

import re
numbers = re.compile(r'(\d+)')
def numericalSort(value):
    parts = numbers.split(value)
    parts[1::2] = map(int, parts[1::2])
    return parts

 for filename in sorted(glob.glob(r'D:\Uni work\Engineering Mathematics Work\MDM3\Mojo\mojo_sperm_tracking_data_bristol\tp49\*.jpg'), key=numericalSort):