Проблема с чтением последовательности кадров из папки в Python

У меня есть следующие кадры чтения кода из папки. Мои видеокадры хранятся в формате frame0.jpg, frame1.jpg. Мне нужно прочитать последовательность кадров. Я запускаю код ниже, но результат, который я получаю, не тот, который мне нужен.

filenames = [img for img in glob.glob("video-frames/*.jpg")]
filenames.sort()
images = []
for img in filenames:
 n= cv2.imread(img)
 images.append(n)
 print(img)

полученный результат:

video-frames\frame0.jpg
video-frames\frame1.jpg
video-frames\frame10.jpg
video-frames\frame100.jpg
video-frames\frame101.jpg

Я хочу, чтобы вывод считывал кадры последовательно, как показано ниже.

video-frames\frame0.jpg
video-frames\frame1.jpg
video-frames\frame2.jpg

Спасибо

Вы можете использовать время, которое они созданы. filenames = sorted(filenames, key=os.path.getctime) или filenames.sort(key=os.path.getctime), если они были сгенерированы в правильном порядке.

Thymen 10.12.2020 17:21

@Thymen, спасибо за ваше замечательное предложение. Не могли бы вы опубликовать свой ответ, чтобы другие могли получить лучшую видимость?

gohar shah 10.12.2020 17:27

Файлы обычно считываются с диска в алфавитном порядке. Это означает, что xxx10.jpg читается перед xxx1.jpg. Таким образом, вы должны добавить ведущие нули к именам ваших файлов. Затем чтение их в алфавитном порядке загрузит xxx01, xxx02, ... xxx10... до xxx99. Используйте больше ведущих нулей, если у вас больше 99

fmw42 10.12.2020 18:59
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
222
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Попробуй это

files_list = os.listdir('/content/test1') # use your folderpath here 
files_list.sort(key=lambda f: int(re.sub('\D', '', f))) 

например,

files_list = ['frame0.jpg','frame1.jpg','frame10.jpg','frame100.jpg',
              'frame101.jpg','frame2.jpg','frame20.jpg','frame3.jpg']
files_list.sort(key=lambda name: int(re.sub('\D', '', name)))

Выход сверху

['frame0.jpg',
 'frame1.jpg',
 'frame2.jpg',
 'frame3.jpg',
 'frame10.jpg',
 'frame20.jpg',
 'frame100.jpg',
 'frame101.jpg']

Другой путь. Пытаться:

filenames = sorted(filenames, key=lambda x: int("".join([i for i in x if i.isdigit()])))

Вот один из примеров.

Когда файлы создаются в исходном порядке, вы можете использовать время их создания для сортировки.

import os

filenames = [img for img in glob.glob("video-frames/*.jpg")]
filenames.sort(key=os.path.getctime)

или

import os

filenames = [img for img in glob.glob("video-frames/*.jpg")]
filenames = sorted(filenames, key=os.path.getctime)

Другие вопросы по теме