Попробуйте это:
#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)