#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()