Картинные рамки для видео - PullRequest
0 голосов
/ 18 апреля 2020

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

import cv2
import os
import glob



path = '.../Desktop/Plot/'
os.chdir(path)
# video_name = 'video.avi'

width=640 
height=400 
size = (width,height)

img_array = []
for filename in sorted(glob.glob(path+'*.png')):
    img = cv2.imread(path+filename+'.png')
    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()

Я не вижу ничего особенно плохого в этом коде, но все, что он делает, это поместите файл 6 КБ в папку, которая не воспроизводится.

1 Ответ

0 голосов
/ 18 апреля 2020

В коде я вижу много вдохов.

1) большинство систем не знает путь ..., который указан в '.../Desktop/Plot/', и, возможно, он должен быть .. или ../.. вместо ...

2) вы используете относительный path - '.../Desktop/Plot/', а когда вы используете os.chdir() для изменения каталога, то относительный путь к текущей папке будет создать путь

../Desktop/Plot/../Desktop/Plot/

и это не правильный путь.

3) glob.glob(path+'*.png') создаст filenames с path и .png, но вы добавите path и .png для чтения изображения в imread() - так что вы получите имя файла с двойным path и двойным расширением

 ../Desktop/Plot/../Desktop/Plot/filename.png.png

, используйте print(path+filename+'.png'), чтобы увидеть то, что вы пытаетесь прочитать.

Кстати: cv2 не вызывает ошибку, когда это может Не читайте изображение, но оно возвращает пустую рамку / изображение, и вы можете получить ошибку при попытке изменить пустое изображение.

4) , если размер изображения отличается от 640x400, тогда он будет создавать пустое видео, потому что оно не изменяет размер изображения при сохранении в видео. Вы должны вручную изменить размер изображения перед сохранением в файл

 img = cv2.resize(img, (width, height))

BTW некоторые декодеры не работают с некоторыми расширениями файлов - например, 'DIVX' не будет сохраняться в файле с расширением .mov

КСТАТИ Вы можете сделать все с одним for -l oop и без img_array


Моя версия

import cv2
import os
import glob

path = '../Desktop/Plot/'

#print(os.getcwd())

width = 640 
height = 400 

out = cv2.VideoWriter('project.avi', cv2.VideoWriter_fourcc(*'DIVX'), 15, (width,height))

for filename in sorted(glob.glob(path + '*.png')):
    print(filename)

    img = cv2.imread(filename)
    img = cv2.resize(img, (width, height))

    out.write(img)

out.release()
...