«Не удалось демультиплексировать поток» в видеовыходе с OpenCV Python

#python #numpy #opencv

Вопрос:

Я пытаюсь сохранить видеовыход следующего кода. Использование точно такой же комбинации для других моих кодов, таких как детектор больших двоичных объектов, работает идеально, но не тогда, когда я пытаюсь вычислить фон. Что я мог сделать не так? Сам код работает нормально, все, что мне нужно, это сохранить вывод, может ли быть что-то не так с fourcc или размером?

 import numpy as np
import cv2
from skimage import data, filters

# Open Video
cap = cv2.VideoCapture('VID_Data-2021-07-08-17-53-54.mp4')

size = (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)), int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
video = cv2.VideoWriter('output.avi', fourcc, 25, size)

# Randomly select 25 frames
frameIds = cap.get(cv2.CAP_PROP_FRAME_COUNT) * np.random.uniform(size=25)

# Store selected frames in an array
frames = []
for fid in frameIds:
    cap.set(cv2.CAP_PROP_POS_FRAMES, fid)
    ret, frame = cap.read()
    frames.append(frame)

# Calculate the median along the time axis
medianFrame = np.median(frames, axis=0).astype(dtype=np.uint8)    

# Display median frame
cv2.imshow('frame', medianFrame)
cv2.waitKey(0)

# Reset frame number to 0
cap.set(cv2.CAP_PROP_POS_FRAMES, 0)

# Convert background to grayscale
grayMedianFrame = cv2.cvtColor(medianFrame, cv2.COLOR_BGR2GRAY)


while(ret):

  # Read frame
  ret, frame = cap.read()
  # Convert current frame to grayscale
  frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
  # Calculate absolute difference of current frame and 
  # the median frame
  dframe = cv2.absdiff(frame, grayMedianFrame)
  # Treshold to binarize
  th, dframe = cv2.threshold(dframe, 10, 255, cv2.THRESH_BINARY) #was 30, 255
  # Display image
  cv2.imshow('frame', dframe)
  video.write(frame) #added
  cv2.waitKey(20)


# Loop over all frames
ret = True

# Release video object
video.release()

cap.release()

# Destroy all windows
cv2.destroyAllWindows()