OpenCV VideoWriter записывает пустое видео

#opencv

#opencv

Вопрос:

 import cv2
import numpy as np
import time
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding = 'utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding = 'utf-8')


img = np.zeros((640,480))

center_x = 0
center_y = 256

videoFile1 = 'D:/Python/6. Const_Speed/sample1.mp4'

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('SaveVideo2.avi', fourcc, 20.0, (640, 480))

while True:
    img = np.zeros((640, 480))
    img = cv2.circle(img, (center_x, center_y), 20, 120, -1)

    cv2.imshow('img', img)
    out.write(img)

    center_x  = 3
    time.sleep(1/30)

    if cv2.waitKey(1) amp; 0xFF == ord('q'):
        break

out.release()
cv2.destroyAllWindows()

 

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

Что я пробовал

  1. Я обнаружил, что видео не записывается, если размер отличается. Таким образом, я подобрал размер, равный (640 480).
  2. Я попытался сменить кодек с XVID на другие кодеки. Наконец, я обнаружил, что кодек ‘XVID’ работает с файлом .avi, поэтому я решил сохранить его.

Комментарии:

1. Почему вы определили videoFile1 переменную?

2. @Ahx Я изменил его, когда отлаживал. первоначально первой переменной VideoWriter был videoFile1.

Ответ №1:

В вашем коде есть три проблемы.

Проблема #1:


  • Если вы собираетесь создавать .avi , я предлагаю вам использовать MJPG .
    • fourcc = cv2.VideoWriter_fourcc(*’MJPG’)

Проблема #2:

  • Вам нужно тщательно определить VideoWriter класс
    • Когда вы определяете размер, он должен быть frame_width и frame_height
    • Например, если вы хотите создать видео с таким размером (640, 480) , вам необходимо инициализировать VideoWriter с помощью (480, 640)
    •  out = cv2.VideoWriter('SaveVideo2.avi', fourcc, 20.0, (480, 640))
       
    • Кроме того, вы планируете создать видео в сером цвете, поэтому вам необходимо инициализировать isColor False
    •  out = cv2.VideoWriter('SaveVideo2.avi', fourcc, 20.0, (480, 640), isColor=False)
       

Выпуск №3:


  • Если вы создаете черное изображение, вам необходимо определить его тип:
    •  while True:
          img = np.zeros((640, 480), dtype=np.uint8)
       

Если вы исправите проблемы, результат будет:

введите описание изображения здесь

Код:


 import cv2
import numpy as np
import time
import sys
import io

sys.stdout = io.TextIOWrapper(sys.stdout.detach(), encoding='utf-8')
sys.stderr = io.TextIOWrapper(sys.stderr.detach(), encoding='utf-8')


img = np.zeros((640, 480))

center_x = 0
center_y = 256

videoFile1 = 'video.mp4'

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('SaveVideo2.avi', fourcc, 20.0, (480, 640), isColor=False)

while True:
    img = np.zeros((640, 480), dtype=np.uint8)
    img = cv2.circle(img, (center_x, center_y), 20, 120, -1)

    cv2.imshow('img', img)
    out.write(img)

    center_x  = 3
    time.sleep(1/30)

    if cv2.waitKey(1) amp; 0xFF == ord('q'):
        break

out.release()
cv2.destroyAllWindows()