Python - 输出 OpenCV VideoWriter 为空

7

我最近开始使用opencv-python编程,但是当我尝试使用cv2写视频时遇到了困难。 脚本的输出为空。以下是我的代码:

import cv2
import numpy as np
import matplotlib.pyplot as plt

cap = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc(*'h263')
out = cv2.VideoWriter('cv2_camera_output.mp4',fourcc, 20.0, (800,600))


while True:
    ret, frame = cap.read()
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    cv2.imshow('frame', frame)
    cv2.imshow('gray', gray)
    out.write(frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break


cap.release()
out.release()
cv2.destroyAllWindows()

我猜测问题一定与fourcc编解码器有关。所以我在谷歌上搜索了一下是否有适用于 Mac 的 fourCC 编解码器(我正在使用 OS X 10.12.3 (Sierra)),但所有的建议都对我的电脑无效,所以问题可能根本不在于 fourCC 编解码器。这些是我访问过的链接:

OpenCV 文档(我没有按照这个做,只是为了确认,并且它也没有起作用)

适用于 OS X 的 FourCC 编解码器测试

有人知道实际问题是什么吗?任何帮助都将不胜感激。
4个回答

13

您的帧宽度和高度必须与您的VideoWriter的宽度和高度相同。只需在out.write(frame)之前添加以下内容,可能就没问题了:

您的帧宽度和高度必须与您的VideoWriter的宽度和高度相同。只需在out.write(frame)之前添加以下内容,可能就没问题了:

frame = cv2.resize(frame,(800,600))

或者将您的VideoWriter大小更改为网络摄像头帧的初始大小。我的尺寸是(640,480)。如果您的操作系统不支持该格式,则它将不会写入任何内容。甚至不会创建一个空文件。我使用的是Linux,我认为'h263'在上面不起作用,但'h264'可以。当我使用'h263'时,它根本不生成文件。


1
我已经尝试过了,我使用了size = (int(cap.get(3)), int(cap.get(4))),然后out = cv2.VideoWriter('cv2_camera_output.avi',fourcc, 20.0, size),但它仍然无法工作。不管怎样,还是非常感谢您的努力! - MisterMM23
虽然这不是一个坏建议,但如果它不是解决方案,那么这不应该成为被接受的答案。 - rgov

10

我解决了这个问题。问题很简单,就是我不能使用VideoWriter来处理灰度图像,所以我必须使用彩色帧来进行处理。


img = cv.cvtColor(img, cv.COLOR_GRAY2BGR) video_Writter.write(img)``` - Wade Wang

0

我的问题实际上是磁盘空间不足,但它没有发出警告。


0

最大的问题是h263规定了它可以编码的确切帧大小(请查看https://en.wikipedia.org/wiki/H.263#Version_1_and_Annex_I上可能的值),而您没有遵守。

解决这个问题后,在OSX上h263仍然不能与mp4容器一起工作(在Linux和Windows上,它不起作用,因为它们使用FFMPEG作为后端,但OSX使用另一个库),所以我建议您使用avi作为容器。

最后,您将不得不调整图像的大小(就像@ROAR所说的那样),或者像这样使用输入设备的尺寸:

width  = int(cap.get(3))
height = int(cap.get(4))

尽管如此,如果您使用h263编解码器进行后者操作,则必须使用符合大小限制的帧的输入设备。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接