Преобразование последовательности изображений в миллион в видео с python - PullRequest
3 голосов
/ 06 февраля 2020

Я пытаюсь сделать видео из ppm-изображений, используя I Python (python 2.7).

Я написал этот код:

import cv2
import glob

img1 = cv2.imread('C:/Users/Joseph/image0.ppm')
height, width, layers = img1.shape

video1 = cv2.VideoWriter('video1.avi', -1, 1, (width, height))

filenames = glob.glob('C:/Users/Joseph/*.ppm')
for filename in filenames:
    print(filename)
    img = cv2.imread(filename)
    video1.write(img)

cv2.destroyAllWindows()
video1.release()

Видео создано, но пусто size=0B и его нельзя открыть.

Нет сообщения об ошибке.

Я подозреваю, что проблема заключается в написании местоположения, поскольку print(filename) дает:

C: / Users / Joseph \ image0.ppm

C: / Users / Joseph \ image1.ppm

C: / Users / Joseph \ image2.ppm

C: / Users / Joseph \ image2.ppm

вместо того, что я ожидал: C:/Users/Joseph/image0.ppm

Не могли бы вы помочь мне, пожалуйста?

РЕДАКТИРОВАТЬ: Тип файла type: GIMP 2.10.14 (.ppm). Может ли проблема быть связана с этим типом ppm?

РЕДАКТИРОВАТЬ 2: Кажется, что проблема не связана напрямую с .ppm.

Действительно, я пытался (с учетом ответа Rotem):

import cv2
import glob

i = cv2.imread('C:/Users/Joseph/image0.ppm')
cv2.imwrite('C:/Users/Joseph/image.jpg',i)


img1 = cv2.imread('C:/Users/Joseph/image.jpg')
height, width, layers = img1.shape

# Set FOURCC code to '24BG' - '24BG' is used for creating uncompressed raw video
video1 = cv2.VideoWriter('video1.avi', cv2.VideoWriter_fourcc('D','I','B',' '), 1, (width, height))

filenames = glob.glob('C:/Users/Joseph/*.ppm')

try:
    for filename in filenames:
        print(filename)
        img = cv2.imread(filename)
        cv2.imwrite('C:/Users/Joseph/a.jpg',img)
        img=cv2.imread('C:/Users/Joseph/a.jpg')
        # Display input image for debugging
        cv2.imshow('img', img)
        cv2.waitKey(1000)
        video1.write(img)
except:
     print('An error occurred.')

cv2.destroyAllWindows()
video1.release()

И это тоже не работает. И я не получаю никакого изображения.

, поэтому кажется, что это ошибка в моем cv2 для видео. JPG хорошо создан.

РЕДАКТИРОВАТЬ: решение.

В духе ответа Ротема я попытался: cv2.VideoWriter_fourcc('M','J','P','G') и это сработало!

1 Ответ

1 голос
/ 07 февраля 2020

Существует несколько причин получения пустого видеофайла, но путь выглядит правильным.

В Windows система C:/Users/Joseph\image0.ppm и C:/Users/Joseph/image0.ppm одинаковы.

  • Вручную удалите файл video1.avi, просто чтобы убедиться, что файл не заблокирован.

Я думаю, что проблема заключалась в видео код c, но я не уверен в этом.

в команде video1 = cv2.VideoWriter('video1.avi', -1, 1, (width, height)), второй параметр - это код FOUR CC, который выбирает видеокод c для видеокодера.
При установке значения на -1, открывается диалоговое окно, позволяющее выбрать код c.
В старых версиях OpenCV это не всегда работает.

Попробуйте установить для FOUR CC значение 'DIB ', примените «Базовый c Windows формат растрового изображения».
Используйте его для создания необработанного (несжатого) видео файла AVI.

Вот код:

import cv2
import glob

img1 = cv2.imread('C:/Users/Joseph/image0.ppm')
height, width, layers = img1.shape

# Set FOURCC code to '24BG' - '24BG' is used for creating uncompressed raw video
video1 = cv2.VideoWriter('video1.avi', cv2.VideoWriter_fourcc('D','I','B',' '), 1, (width, height))

filenames = glob.glob('*.ppm')

try:
    for filename in filenames:
        print(filename)
        img = cv2.imread(filename)

        # Display input image for debugging
        cv2.imshow('img', img)
        cv2.waitKey(1000)

        video1.write(img)
except:
     print('An error occurred.')

cv2.destroyAllWindows()
video1.release()
  • Я добавил cv2.imshow('img', img), чтобы помочь вам отладить проблему, если это не проблема кода c.
  • Убедитесь, что вы не получаете никаких исключений.

Пожалуйста, дайте мне нет, если мой ответ решит вашу проблему.

...