【发布时间】:2015-06-01 23:29:45
【问题描述】:
我使用了OpenCV 3.0.0教程中的以下页面:Tutorial in docs
当我尝试使用保存视频的示例时,它不起作用。
它显示来自网络摄像头的内容,并创建一个名为output.avi 的文件,但当我检查ouput.avi 的大小时,它是零字节。
我也尝试使用不同的编解码器,例如YUY2。
我使用Python 2.7.8 和OpenCV 3.0.0
和Windows 8.1
【问题讨论】:
我使用了OpenCV 3.0.0教程中的以下页面:Tutorial in docs
当我尝试使用保存视频的示例时,它不起作用。
它显示来自网络摄像头的内容,并创建一个名为output.avi 的文件,但当我检查ouput.avi 的大小时,它是零字节。
我也尝试使用不同的编解码器,例如YUY2。
我使用Python 2.7.8 和OpenCV 3.0.0
和Windows 8.1
【问题讨论】:
确保您使用的是正确的fourcc 4 字节代码。教程上的例子有:
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
此“XVID”代码可能仅适用于 linux。示例上方的文档说明(在教程中): “在 Windows 中:DIVX(更多有待测试和添加)。”因此,如果您还没有,请尝试将上面的fourcc 行替换为:
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
我经常在 linux 上使用 cv2.VideoWriter 并且它总是有效的。因此,如果上述方法不起作用,您可以随时在 linux vm 上尝试。
【讨论】:
isColor 标志,但是您可能需要根据需要验证您是否将其正确设置为 True/False。如果您设置不正确,这不会出现异常,您只会得到一个“无法播放”的视频。如果这没有帮助,可能是您需要在您的机器上安装 ffmpeg 或替代方案。
应该是你使用的编解码器有问题。
你试过了吗:
cv.CV_FOURCC('i', 'Y', 'U', 'V')
这个对我有用。
【讨论】:
替换:
fourcc = cv2.VideoWriter_fourcc(*'XVID')
与:
fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
为我工作...
更笼统地说:
查找here 之后的视频压缩格式的fourcc 代码,无论代码是什么——例如FFMpeg 的“FMP4”——按以下方式插入:
cv2.VideoWriter_fourcc('F','M','P','4')
【讨论】:
(*'XVID')和('X', 'V', 'I', 'D')是一样的,看看docs.python.org/dev/tutorial/…
我遇到了同样的问题,我通过将视频输出分辨率指定为与输入完全相同来解决它:
cap = cv2.VideoCapture('vtest.avi')
...
out = cv2.VideoWriter('output.avi',fourcc, 20.0,(int(cap.get(3)),int(cap.get(4))))
当然要确保你安装了 ffmpeg 并且可以正常工作。
【讨论】:
在 Windows 7 上并使用 Python 2.7 和 OpenCV 2.4.8,我体验到如果文件 NAME 是 "output.mpg" 将不会写入。
我改成"output.avi"解决了。
【讨论】:
就我而言,我认为编解码器是一个障碍,但事实并非如此。相反,调整 videoWriter() 消耗的尺寸起到了作用:
(ok, frame) = cv2.VideoCapture(videoPath).read()
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter(output, fourcc, 10.0, (1280, 720))
(1280,720) 被使用,因为 frame.shape 来自我的视频输出 (1280, 720, 3)。它使 avi 到 mp4 成为可能,反之亦然。不必担心协调编解码器。
【讨论】:
我将视频编写器的大小更改为我的屏幕分辨率大小,并且效果很好。
这是解决方案。
out = cv2.VideoWriter("output.avi", fourcc, 5.0, (1920, 1080))
【讨论】:
我有完全相同的问题。我在 C++ 中使用 OpenCV,但我相信您仍然可以传递 -1 而不是选择编解码器,因此即使在 python 中您也可以拥有可用编解码器的下拉菜单。从那里我尝试了所有不同的编解码器,就像 Leonard Zhou 一样,IYUV 编解码器对我有用。另请注意,即使我可以在另一台具有相同代码和相同编解码器安装程序的机器上正常使用 XVID,它也是唯一有效的。
编辑:
我建议作为一个补丁工作,主要问题是通过在可执行文件的文件夹中添加opencv_ffmpeg dll 来解决。
【讨论】:
检查图像的分辨率!
我尝试使用形状奇特的图像 (1284x709),最终得到了 1k 大小的不可读视频。将图像大小调整为最接近的“常见”分辨率后:
image = cv2.resize(image, (1280,720)),
它工作得很好。
【讨论】:
我在这个问题上苦苦挣扎了几个小时,然后我意识到我输入了错误的图像形状。
是(width, height),即:
(image.shape[1], image.shape[0])
而不是
(image.shape[0], image.shape[1])
这就是我的工作代码最终的样子......(我在 Windows 机器上):
video_path = FILENAME + '.avi'
size = images[0].shape[1], images[0].shape[0] ## <<<--- NOTICE THIS
video = cv2.VideoWriter(video_path,cv2.VideoWriter_fourcc(*'DIVX'), 60, size)
for img in images:
video.write(img)
cv2.destroyAllWindows()
video.close()
【讨论】:
我怀疑视频写入失败的原因有很多,就我而言,我的帧是 3 通道图像和 4 通道图像(透明叠加)的合成。将最终结果转换为 BGR 格式如下,可以成功保存视频。
width = 1280
height = 720
FPS = 30
fourcc = VideoWriter_fourcc(*'avc1')
video = VideoWriter('output.mp4', fourcc, float(FPS), (width, height))
for img in images:
frame = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
video.write(frame)
video.release()
【讨论】:
在我分配了实际的帧大小而不是我认为的大小之后,它对我有用:
ret, frame = cap.read()
height, width, channels = frame.shape
codec = cv2.VideoWriter_fourcc(*"DIVX")
out=cv2.VideoWriter('new.avi',codec ,20.0,(width, height))
并将out.write(frame) 放在cv2.imshow("Frame", frame) 之前的while 循环中。
【讨论】:
我尝试使用 pyinstaller Recorder.py 创建它的 exe,它对我有用。
记住在使用pyinstaller之前你必须pip install pyinstaller。
【讨论】:
为了说明这一点,请确保您不仅提供了正确的路径,而且还提供了视频名称。
即path/'video.avi' 而不仅仅是path/。否则它将静默失败。
【讨论】:
在我的情况下,我正在调整图像大小,但以原始大小而不是新大小保存视频
【讨论】:
上述方法仅适用于 RGB 帧/图像。如果您尝试写入灰度图像,请将参数“0”传递给 VideoWriter():
fourcc = cv2.VideoWriter_fourcc(*"MJPG")
out = cv2.VideoWriter('output.avi', fourcc, 30, size, 0)
【讨论】: