Не могу сохранить видео в opencv - PullRequest
1 голос
/ 15 марта 2020

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

  import cv2

  cap = cv2.VideoCapture("k1.mp4")
  fgbg = cv2.bgsegm.createBackgroundSubtractorMOG()
  fourcc = cv2.VideoWriter_fourcc(*'MP42')
  out = cv2.VideoWriter('output.mp4', fourcc, 20.0, (640,480))

  while cap.isOpened():
     ret, frame = cap.read()
     gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
     fgmask = fgbg.apply(gray)
     thresh = 2
     maxValue = 255
     ret, th1 = cv2.threshold(fgmask, thresh, maxValue, cv2.THRESH_BINARY)

     color_space = cv2.applyColorMap(th1, cv2.COLORMAP_JET)
     result_vid = cv2.addWeighted(frame, 0.7, color_space, 0.7, 0)
     cv2.imshow("vid", result_vid)
     out.write(result_vid)
     if cv2.waitKey(20) == ord('q'):
         break

 cap.release()
 out.release()
 cv2.destroyAllWindows()

Ответы [ 2 ]

1 голос
/ 16 марта 2020

Проблема в том, что видео код c и видео контейнер формат не совпадают.

При выполнении вашего кода я получаю сообщение об ошибке (в консоли windows):

OpenCV: FFMPEG: тег 0x3234504d / 'MP42' не поддерживается с кодом c id 15 и формат 'mp4 / MP4 (MPEG-4 Part 14)'
[mp4 @ 00000155e95dcec0] Не удалось найти тег для кода c msmpeg4v2 в потоке # 0, код c в настоящее время не поддерживается в контейнер

  • Вы используете fourcc = cv2.VideoWriter_fourcc(*'MP42'), а M420 применяет код видео c MPEG-4v2 .
  • Имя файла вывода видео is 'output.mp4'.
    Расширение .mp4 применяется к контейнеру формата MP4.

Видимо, .mp4 видеофайл не может содержать видео, закодированное с MPEG-4v2 кодом c.

Вы можете изменить код c или изменить формат файла.

Пример:

  • Изменение имени выходного файла на 'output.avi' или 'output.wmv' работает.
  • Изменение кода c на MPEG-4: fourcc = cv2.VideoWriter_fourcc(*'mp4v') (и сохранение имени файла 'output.mp4') также работает.

Еще одна проблема:

Добавьте следующий код после ret, frame = cap.read():

if not ret:
    break;
1 голос
/ 15 марта 2020
 import cv2
 cap = cv2.VideoCapture(0)

 # Automatically grab width and height from video feed
 # (returns float which we need to convert to integer for later on!)
 width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
 height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))


 # MACOS AND LINUX: *'XVID' (MacOS users may want to try VIDX as well just in case)
 # WINDOWS *'VIDX'
 writer = cv2.VideoWriter('local_capture.mp4', cv2.VideoWriter_fourcc(*'VIDX'),25, (width, height))


 # This loop keeps recording until you hit Q or escape the window
 # You may want to instead use some sort of timer, like from time import sleep and then just record for 5 seconds.
while True:

     # Capture frame-by-frame
     ret, frame = cap.read()


     # Write the video
     writer.write(frame)

     # Display the resulting frame
     cv2.imshow('frame',frame)

     # This command let's us quit with the "q" button on a keyboard.
     # Simply pressing X on the window won't work!
     if cv2.waitKey(1) & 0xFF == ord('q'):
         break
cap.release()
writer.release()
cv2.destroyAllWindows()
...