OpenCV не будет правильно записывать в выходной файл (Python) - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть рабочий код для применения вычитания фона к неподвижному видео, но он не будет правильно записывать кадры вычтенного фона в свой выходной файл.Я получаю файл .avi и файл с именем .avi, которые я указал в cv2.VideoWriter, но, похоже, он не записывает каждый передаваемый кадр:

import cv2
import numpy as np
cap = cv2.VideoCapture('traffic-mini.mp4')
fgbg = cv2.createBackgroundSubtractorMOG2()
cv2.startWindowThread()

fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
out = cv2.VideoWriter('test_output.avi',fourcc, 20.0, (640,480))

while True:
    ret, frame = cap.read()
    if ret == True:
        frame = fgbg.apply(frame)
        out.write(frame)
        cv2.imshow('fg',frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    else:
        break



cap.release()
out.release()
cv2.destroyAllWindows()
for i in range (1,5):
    cv2.waitKey(1)

Выходное видео test_output.avi всегда 6 КБ и имееткадры не переданы. Что мне не хватает?Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 07 декабря 2018

Попробуйте это:

#Add a 0 to the end of the out after (640, 480)
out = cv2.VideoWriter('test_output.avi',fourcc, 20.0, (640,480),0)

while True:
   ret, frame = cap.read()

   if ret == True:
      frame = cv2.resize(frame, (640,480))
      frame = fgbg.apply(frame)
      out.write(frame)
      cv2.imshow('fg',frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break
    else:
       break

Причина, по которой вы пишете черно-белые кадры, в конце нужна 0, чтобы сказать opencv, что канал не задействован.
Возможно, вам придетсяпереключите два числа для изменения размера, как я помню, это ширина или высота кадра, но суть в том, что размер видеокадра должен совпадать как для вашего вывода, так и для вашего ввода.Также подсказка для вычитания фона заключается в том, чтобы выделить видео серым цветом, например

gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
0 голосов
/ 08 января 2019

Предложенное решение MNM - добавление 0 в качестве последнего параметра VideoWriter - хорошо работает с моей стороны - использование OpenCV 3.4.5 на Raspbian Stretch (Raspberry Pi 3).

Хотя официальная документация https://docs.opencv.org/3.4.5/dd/d9e/classcv_1_1VideoWriter.html - указывает, что «isColor Если он не равен нулю, кодировщик будет ожидать и кодировать цветные кадры, в противном случае он будет работать с кадрами в градациях серого (флаг в настоящее время поддерживается только в Windows)».Это может быть применимо к другим ОС.

0 голосов
/ 29 ноября 2018

Это потому, что размер frame не (640,480).Вместо

out = cv2.VideoWriter('test_output.avi',fourcc, 20.0, (640,480))

попробуйте

out = cv2.VideoWriter('test_output.avi',fourcc, 20.0, (int(cap.get(3)), int(cap.get(4))))

...