You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python视频帧固定位数序号命名需求:解决排序混乱问题

解决帧文件名排序混乱问题

你提到的把文件名改成固定位数格式(比如img001.png、img002.png)完全可行,这是让字符串排序符合数字顺序的最直观方法;另外也可以不用修改文件名,通过自定义排序逻辑来解决,两种方案如下:

方案一:修改帧保存时的命名为固定位数

在你提取并保存帧的代码环节,把文件名的计数器格式化为固定长度的数字(比如3位,可根据总帧数调整位数),用Python格式化字符串就能实现:

# 假设保存帧的代码里有从1开始递增的计数器counter
counter = 1
# 用固定位数格式生成文件名
save_path = os.path.join(image_folder, f"img{counter:03d}.png")
cv2.imwrite(save_path, frame_with_box)
counter += 1

{counter:03d}表示把counter格式化为3位数字,不足位用0填充,生成的文件名就是img001.png、img002.png……img100.png,这时直接调用images.sort()就能得到正确的顺序。

方案二:不修改文件名,自定义排序逻辑

如果已经生成了img1.png、img10.png这类文件,不想重新生成,可以给sort()方法传一个自定义排序键,提取文件名里的数字来排序:
修改现有代码中的排序部分:

images = [img for img in os.listdir(image_folder) if img.endswith(".png")]
# 提取文件名中的数字并转为整数,以此作为排序依据
images.sort(key=lambda x: int(x.replace('img', '').replace('.png', '')))

如果想更严谨,也可以用正则表达式提取数字:

import re
images = [img for img in os.listdir(image_folder) if img.endswith(".png")]
images.sort(key=lambda x: int(re.search(r'\d+', x).group()))

这种方式即使文件名格式有小变动,也能准确提取数字完成排序。

修改后的完整代码(方案二示例)

import os
import cv2
import re

image_folder = 'dnn_model\images_for_video'
video_file = 'dnn_model\\video_output\\video_output.mp4'
image_size = (480, 848)
fps = 29.99

images = [img for img in os.listdir(image_folder) if img.endswith(".png")]
# 按文件名中的数字排序
images.sort(key=lambda x: int(re.search(r'\d+', x).group()))

out = cv2.VideoWriter(video_file, cv2.VideoWriter_fourcc(*'MP4V'), fps, image_size)

img_array = []
for filename in images:
    img = cv2.imread(os.path.join(image_folder, filename))
    if img is not None:  # 增加判断避免读取失败的情况
        img_array.append(img)
        out.write(img)

out.release()

内容的提问来源于stack exchange,提问作者Pablo Biosca

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 10:15:35