OpenCV赢得';无法正确写入输出文件(Python)

OpenCV赢得';无法正确写入输出文件(Python),python,python-3.x,opencv,computer-vision,background-subtraction,Python,Python 3.x,Opencv,Computer Vision,Background Subtraction,我有在静止视频上应用背景减法的工作代码,但它不能正确地将减法后的背景帧写入其输出文件。我得到了我在cv2.VideoWriter中指定的.avi文件和文件名,但它似乎并没有写入我通过的每一帧: import cv2 import numpy as np cap = cv2.VideoCapture('traffic-mini.mp4') fgbg = cv2.createBackgroundSubtractorMOG2() cv2.startWindowThread() fourcc = cv

我有在静止视频上应用背景减法的工作代码,但它不能正确地将减法后的背景帧写入其输出文件。我得到了我在
cv2.VideoWriter
中指定的.avi文件和文件名,但它似乎并没有写入我通过的每一帧:

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
始终为6KB,并且没有传入任何帧。我错过了什么?提前感谢

这是因为
帧的大小
不是
(640480)
。而不是

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

试一试

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

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

MNM提出的解决方案—将0添加为VideoWriter的最后一个参数—在我这方面效果很好—在Raspbian Stretch(Raspberry Pi 3)上使用OpenCV 3.4.5


尽管官方文档-声明“isColor如果它不是零,编码器将期望并编码彩色帧,否则它将使用灰度帧(该标志目前仅在Windows上受支持)。”它可能适用于其他操作系统。

感谢您的回答,但恐怕同样的问题仍然存在。最后一个参数是做什么的?我应该传入其他参数吗?最后一个参数是要保存的帧的形状(宽度、高度)
int(cap.get(3))
是从视频中读取的帧的宽度,
int(cap.get(4))
是帧的高度。请尝试将fourcc=
cv2.VideoWriter\u fourcc('M','J','P','G')
更改为
fourcc=cv2.VideoWriter\u fourcc(*'xvideowriter')
,因为您的系统可能没有MJPG的编解码器