微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenCV Python VideoWriter保存损坏的视频

如何解决OpenCV Python VideoWriter保存损坏的视频

在尝试修改视频中的帧之前,我试图获得一个非常简单的复制视频的示例。但是,与2.8 mb barrier.avi视频相比,output.avi视频是5kb损坏的文件。我正在使用OpenCV 4.2.0版和Python 3.7.7版。

代码如下:

import cv2

input = cv2.VideoCapture("../video/barriers.avi")
height = int(input.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(input.get(cv2.CAP_PROP_FRAME_WIDTH))

fourcc = cv2.VideoWriter_fourcc(*'DIVX')
out = cv2.VideoWriter('../video/output5.avi',fourcc,30,(height,width),isColor=True)

while input.isOpened():
    # get validity boolean and current frame
    ret,frame = input.read()

    # if valid tag is false,loop back to start
    if not ret:
        break
    else:
        out.write(frame)

input.release()
out.release()

如果我打印框架形状,则会得到:

(480,640,3)

注意:其他堆栈溢出解决方案都没有帮助。

编辑:如果使用cv2.imshow(),则所有帧均显示正常。

解决方法

我想解决您代码中的两个问题:


问题#1: :您要创建一个.avi视频文件。因此,您需要将fourcc初始化为MJPG

fourcc = cv2.VideoWriter_fourcc(*'MJPG')

创建视频文件有某些组合。例如,如果要创建.mp4,则将Fourcc初始化为*'mp4v'


问题2: 确保输出视频的大小与输入帧的大小相同。例如:您声明了Videowriter对象的大小(height,width)。然后您的相框必须具有相同的尺寸:

frame = cv2.resize(frame,(height,width))

代码:


import cv2

cap = cv2.VideoCapture("output.mp4")
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))

fourcc = cv2.VideoWriter_fourcc(*'MJPG')
out = cv2.VideoWriter('output5.avi',fourcc,30,(width,height),isColor=True)

while cap.isOpened():
    # get validity boolean and current frame
    ret,frame = cap.read()

    # if valid tag is false,loop back to start
    if not ret:
        break
    else:
        frame = cv2.resize(frame,height))
        out.write(frame)

cap.release()
out.release()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。