【问题标题】:OpenCV Python VideoWriter saves corrupted videoOpenCV Python VideoWriter 保存损坏的视频
【发布时间】:2021-01-02 15:09:30
【问题描述】:

在开始修改视频中的帧之前,我正在尝试获取一个非常简单的复制视频的示例。但是,与 2.8 mb 的barriers.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(),所有帧都可以正常显示。

【问题讨论】:

    标签: python opencv save video-processing


    【解决方案1】:

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


    问题#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, (width, height))
            out.write(frame)
    
    cap.release()
    out.release()
    

    【讨论】:

    • 谢谢。这对我来说是正确的。唯一的问题是barriers.avi 具有视频尺寸(宽度=640,高度=480),而输出.avi 保存的文件具有尺寸(宽度=480,高度=640)。对于调整帧的大小,这是假设某些帧的大小不一样吗?或者如果您希望输出更小,这是为了重新缩放?
    • 对不起,我打错了应该是frame = cv2.resize(frame, (width, height))
    • 实际上,随着这种变化,视频再次损坏。也许视频作者的维度被翻转了?编辑:该修复工作。视频作家的暗淡应该是(宽度,高度)而不是(高度,宽度)。谢谢!
    • 好的,我想我找到了问题所在。问题是当您声明尺寸时,请使用(width, height),但是当您获取图像尺寸时,例如:image.shape[:2] 返回高度宽度。我已经更新了代码,如果有任何问题请告诉我。
    猜你喜欢
    • 2020-06-04
    • 1970-01-01
    • 2020-05-19
    • 2019-02-23
    • 2020-08-21
    • 2019-05-10
    • 2015-06-01
    • 2020-04-01
    • 1970-01-01
    相关资源
    最近更新 更多