【问题标题】:OpenCV won't properly write to output file (Python)OpenCV 无法正确写入输出文件(Python)
【发布时间】:2018-11-29 05:51:28
【问题描述】:

我有用于在静止视频上应用背景减除的工作代码,但它不会正确地将减除背景的帧写入其输出文件。我得到了我在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,并且没有传入任何帧。我错过了什么?提前致谢

【问题讨论】:

  • 尝试将fourcc = cv2.VideoWriter_fourcc('M','J','P','G')改为fourcc = cv2.VideoWriter_fourcc(*'XVID'),因为可能你的系统没有MJPG的编解码器

标签: python python-3.x opencv computer-vision background-subtraction


【解决方案1】:

试试这个:

#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】:

    这是因为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))))

    【讨论】:

    • 感谢您的回答,但恐怕同样的问题仍然存在。最后一个参数有什么作用?我应该传递其他东西吗?
    • 最后一个参数是要保存的帧的形状(宽、高)。 int(cap.get(3)) 是宽度,int(cap.get(4)) 是您从视频中读取的帧的高度。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 2023-01-26
      相关资源
      最近更新 更多