python - OpenCV VideoWriter 输出空
python - Output by OpenCV VideoWriter empty
最近开始用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 codec有关。所以我在谷歌上搜索了 mac 是否有 fourCC 编解码器(我使用的是 OS X 10.12.3 (Sierra)),但是 所有建议都不适用于我的计算机,所以问题甚至可能不在 fourCC 编解码器中。这些是我访问过的链接:
OpenCV Documentation (I didn't follow this one, it was just to make sure, and it didn't work either)
GitHub Tests for FourCC codecs on OS X
有人知道真正的问题吗?任何帮助都会很棒
您的框架宽度和高度必须与您的 VideoWriter
的宽度和高度相同。只需在 out.write(frame)
之前添加它,您可能就没事了:
frame = cv2.resize(frame,(800,600))
或者将 VideoWriter
的大小更改为网络摄像头框架的初始大小。我的是(640,480)。我想如果你的 OS 不支持这种格式,它就不会写任何东西。甚至不会创建空文件。我在 Linux 上,我认为 'h263' 不适用,但 'h264' 可以。当我使用 'h263' 时,它不会生成任何文件。
最大的问题是 h263 指定了它可以编码的确切帧大小(查看 https://en.wikipedia.org/wiki/H.263#Version_1_and_Annex_I 中的可能值)而您不遵守该规定。
解决此问题后,h263 可能仍无法在 OSX 上与 mp4 容器一起使用(在 Linux 和 Windows 上不会,因为它们使用 FFMPEG 作为后端,但 OSX 使用另一个库)所以我建议你使用 avi 作为容器。
最后,您必须调整图像大小(就像@ROAR 所说的那样)或像这样使用输入设备的尺寸:
width = int(cap.get(3))
height = int(cap.get(4))
尽管如果您使用 h263 编解码器执行后者,则必须使用生成符合大小限制的帧的输入设备。
我解决了这个问题。问题很简单,我不能将 VideoWriter 用于灰度,所以我不得不将它用于彩色帧。
我的问题实际上是我的磁盘上没有 space。它没有给出警告。
最近开始用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 codec有关。所以我在谷歌上搜索了 mac 是否有 fourCC 编解码器(我使用的是 OS X 10.12.3 (Sierra)),但是 所有建议都不适用于我的计算机,所以问题甚至可能不在 fourCC 编解码器中。这些是我访问过的链接:
OpenCV Documentation (I didn't follow this one, it was just to make sure, and it didn't work either)
GitHub Tests for FourCC codecs on OS X
有人知道真正的问题吗?任何帮助都会很棒
您的框架宽度和高度必须与您的 VideoWriter
的宽度和高度相同。只需在 out.write(frame)
之前添加它,您可能就没事了:
frame = cv2.resize(frame,(800,600))
或者将 VideoWriter
的大小更改为网络摄像头框架的初始大小。我的是(640,480)。我想如果你的 OS 不支持这种格式,它就不会写任何东西。甚至不会创建空文件。我在 Linux 上,我认为 'h263' 不适用,但 'h264' 可以。当我使用 'h263' 时,它不会生成任何文件。
最大的问题是 h263 指定了它可以编码的确切帧大小(查看 https://en.wikipedia.org/wiki/H.263#Version_1_and_Annex_I 中的可能值)而您不遵守该规定。
解决此问题后,h263 可能仍无法在 OSX 上与 mp4 容器一起使用(在 Linux 和 Windows 上不会,因为它们使用 FFMPEG 作为后端,但 OSX 使用另一个库)所以我建议你使用 avi 作为容器。
最后,您必须调整图像大小(就像@ROAR 所说的那样)或像这样使用输入设备的尺寸:
width = int(cap.get(3))
height = int(cap.get(4))
尽管如果您使用 h263 编解码器执行后者,则必须使用生成符合大小限制的帧的输入设备。
我解决了这个问题。问题很简单,我不能将 VideoWriter 用于灰度,所以我不得不将它用于彩色帧。
我的问题实际上是我的磁盘上没有 space。它没有给出警告。