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

按顺序读写多文件:图片处理排序异常的解决方法求助

解决图片读取顺序不符的问题

问题根源是glob.glob()返回的文件列表采用操作系统默认的字典序排序,对带数字后缀的文件名(如results25_00001.png、results25_000010.png)会出现排序错误(00010会排在0002前面)。要保证按文件名中的数字递增顺序读取,需要对文件路径做自然排序,修改代码如下:

完整修改后的代码

import glob
import os
import cv2

path = '/Users/Desktop/FFMPEG/results25'
# 获取所有png文件路径
image_paths = glob.glob("/Users/Desktop/FFMPEG/test25/*.png")

# 自定义排序key:提取文件名中的数字部分转为整数
def get_frame_num(file_path):
    file_name = os.path.basename(file_path)
    # 从results25_00001.png中提取00001并转为整数
    num_str = file_name.split('_')[1].split('.')[0]
    return int(num_str)

# 按帧号从小到大排序
sorted_image_paths = sorted(image_paths, key=get_frame_num)

# 提前读取文本文件,避免循环内重复IO操作
with open('FS_25FULL.txt') as f:
    lines = f.readlines()

# 函数定义移到循环外,避免重复定义
def global_vector_cal(LIST_DATA):
    counter_vector = 0
    # rest of your code

# 遍历排序后的图片
for i, image in enumerate(sorted_image_paths, 1):
    img = cv2.imread(image)
    data_number = i   # frame number and max is 918
    # 注意:Python列表索引从0开始,若第1帧对应文本第3行(索引为2),需调整为n = data_number*3 -1
    # 请根据实际文本行号确认此计算逻辑
    n = data_number * 3

    data = lines[n].split(")")
    list_data = [string.replace('(', '').replace(' ', '').split(",") for string in data]
    list_data.pop(-1)

    cv2.line(img, P_1, P_2, color=(0,255,255), thickness=2) 
    cv2.line(img, P_1, P_3, color=(0,255,255), thickness=2) 

    # 调用向量计算函数
    global_vector_cal(list_data)

    cv2.imwrite(os.path.join(path, 'img_{}.png'.format(i)), img)

关键修改点

  • 强制自然排序:通过sorted()配合自定义get_frame_num函数,提取文件名中的数字作为排序依据,确保图片按00001→00002→...的顺序读取。
  • IO优化:将文本文件的读取操作移到循环外,避免每次循环重复打开读取文件,提升运行效率。
  • 函数定义优化:把global_vector_cal函数移到循环外,避免每次循环重新定义函数。

额外注意事项

检查文本行索引是否正确:Python列表索引从0开始,若第1帧对应文本第3行(实际索引为2),则需将n = data_number*3改为n = data_number*3 -1,避免出现索引越界或取错行的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:25:21