python opencv videowrite不写视频

Zac*_*hao 10 python video opencv

我刚开始使用opencv编写python.我使用了opencv 3.0.0教程中的以下页面

阅读文档的教程

当我尝试使用保存视频的示例时,它不起作用.它显示来自网络摄像头的内容,并且还创建一个名为output.avi的文件,但是当我检查ouput.avi的大小时,它是零字节.我也尝试使用不同的编解码器,如YUY2

我使用python 2.7.8和opencv 3.0.0和Windows 8.1

小智 13

我有同样的问题,我通过指定视频输出分辨率与输入完全相同来解决它:

cap = cv2.VideoCapture('vtest.avi')
...
out = cv2.VideoWriter('output.avi',fourcc, 20.0,(int(cap.get(3)),int(cap.get(4))))
Run Code Online (Sandbox Code Playgroud)

当然要确保你安装了ffmpeg并正常工作.


Sab*_* 錆兎 13

我在这个问题上挣扎了几个小时,然后我意识到我输入了错误的图像形状。

它是(width, height),即:

(image.shape[1], image.shape[0])
Run Code Online (Sandbox Code Playgroud)

并不是

(image.shape[0], image.shape[1])
Run Code Online (Sandbox Code Playgroud)

这就是我的工作代码最终的样子......(我在 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()
Run Code Online (Sandbox Code Playgroud)


Lam*_*ell 12

更换:

fourcc = cv2.VideoWriter_fourcc(*'XVID')
Run Code Online (Sandbox Code Playgroud)

附:

fourcc = cv2.VideoWriter_fourcc('M','J','P','G')
Run Code Online (Sandbox Code Playgroud)

为我工作......

更普遍:

查一查你后的视频压缩格式的FOURCC码在这里,不管代码-为FFmpeg的实例"FMP4" -通过以下方式将其插入:

cv2.VideoWriter_fourcc('F','M','P','4')
Run Code Online (Sandbox Code Playgroud)


nch*_*ont 7

检查图像的分辨率!我尝试使用奇怪形状的图像 (1284x709),但最终得到了 1k 大小的无法读取的视频。将图像大小调整为最接近的“常见”分辨率后: image = cv2.resize(image, (1280,720)),效果很好。

  • 另外,检查是否有错误消息。我的 jupyter 笔记本上有: OpenCV: FFMPEG: tag 0x5634504d/'MP4V' is not support with codec id 13 and format 'mp4 / MP4 (MPEG-4 Part 14)' OpenCV: FFMPEG:fallback to use tag 0x7634706d/'mp4v ',并按照建议使用确切的 4 个字母 (mp4v),尊重大小写,该消息消失了。 (2认同)

Sco*_*ott 6

确保使用正确的fourcc 4字节代码。教程中的示例具有:

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (640,480))
Run Code Online (Sandbox Code Playgroud)

此“ XVID”代码仅适用于Linux。示例上方的文档指出(在本教程中):“在Windows中:DIVX(尚待测试和添加)。” 因此,如果您还没有,请尝试将上述fourcc行替换为:

fourcc = cv2.VideoWriter_fourcc(*'DIVX')
Run Code Online (Sandbox Code Playgroud)

我在Linux上经常使用cv2.VideoWriter,并且它始终有效。因此,如果上述方法不起作用,您可以随时在linux vm上尝试。


小智 6

就我而言,我认为编解码器是一个障碍,但事实并非如此。相反,调整 videoWriter() 使用的尺寸可以解决问题:

(ok, frame) = cv2.VideoCapture(videoPath).read()

 fourcc = cv2.VideoWriter_fourcc(*'XVID')
 out = cv2.VideoWriter(output, fourcc, 10.0, (1280, 720))
Run Code Online (Sandbox Code Playgroud)

使用 (1280,720) 是因为我的视频输出 (1280, 720, 3) 中的 frame.shape。它使 avi 转 mp4 成为可能,反之亦然。不必担心协调编解码器。


小智 5

我怀疑视频写入失败的原因有很多,就我而言,我的帧是由 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()
Run Code Online (Sandbox Code Playgroud)