@bybacapitan

Как выбирать файл в правильной поочередности с названием от нуля до максимального?

Есть функция, которая создает видео из кадров
spoiler
def createvideo():
	img_array = []
	for filename in glob.glob('result/*.png'):
		img = cv2.imread(filename)
		height, width, layers = img.shape
		size = (width,height)
		img_array.append(img)


	out = cv2.VideoWriter('project.avi',cv2.VideoWriter_fourcc(*'DIVX'), 15, size)
	
	for i in range(len(img_array)):
		out.write(img_array[i])
	out.release()


в кажом названии кадра присутсвует цифра.
spoiler
62f3b80e9881b020773335.png


Если я запускаю эту фунцию, то кадры склеиваются рандомно.
Что нужно сделать для того чтобы кадры склеивались в правильной поочередности?
  • Вопрос задан
  • 96 просмотров
Пригласить эксперта
Ответы на вопрос 2
@PavelMos
Если бы в названиях была бы сохранена разрядность, то есть слева дописаны нули, то можно было бы отсортировать сразу по названиям. Но тут надо извлекать цифры с помощью регекспа, делать дополнительный отсортированный список или словарь и проходить уже по нему. Шаблон регекспа для имён типа файл1, файл20, файл200. Если в полном пути файла, если его создаёт glob.glob(...), могут также цифры встречаться, надо шаблон другой делать.

import re
l=['frame1.jpg','frame2.jpg','frame3.jpg','frame13.jpg','frame100.jpg','frame101.jpg','frame200.jpg']
#l = glob.glob('result/*.png'):
r='(\d{1,3})'
out={int(re.search(r,x).group(0)):x for x in l}
for number in sorted(out.keys()):
    filename=out[number]
    img = cv2.imread(filename)
    height, width, layers = img.shape
    size = (width,height)
    img_array.append(img)
Ответ написан
mayton2019
@mayton2019
Bigdata Engineer
Нужно определить какой будет самый максимальный кадр. Ну допустим это 9999. Ну и все остальные попереименовывать к чорту типа frame1.png => frame0001.png.

Для сисадмина-девопса задачка на 5 минут.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы