OpenCV无法正确写入输出文件(Python)

时间:2018-11-29 05:51:29

标签: 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 = 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,没有传入帧。我缺少什么?预先感谢

3 个答案:

答案 0 :(得分:0)

这是因为frame的大小不是(640,480)。代替

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

尝试

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

答案 1 :(得分:0)

尝试一下:

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

答案 2 :(得分:0)

MNM提出的解决方案-在VideoWriter的最后一个参数上添加0-对我而言效果很好-在Raspbian Stretch(Raspberry Pi 3)上使用OpenCV 3.4.5。

尽管官方文档https://docs.opencv.org/3.4.5/dd/d9e/classcv_1_1VideoWriter.html-声明“ isColor如果它不为零,则编码器将期望并编码颜色框架,否则它将与灰度框架一起使用(该标志当前仅在Windows上受支持)。 ”它可能适用于其他操作系统。