首页 > 解决方案 > OpenCV Python的视频输出中的“无法解复用流”

问题描述

我正在尝试保存以下代码的视频输出。对我的其他代码(如斑点检测器)使用完全相同的组合,效果很好,但在我尝试计算背景时却不行。我可能做错了什么?代码本身运行良好,我只需要保存输出,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()

标签: pythonnumpyopencv

解决方案


推荐阅读