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
相关产品推荐
相关产品推荐

