使用 opencv 调整视频大小并保存

我正在尝试使用 opencv 重新调整视频大小,然后将其保存回我的系统。代码有效并且不会给出任何错误,但输出视频文件已损坏。我使用的 fourcc 是 mp4v,与 .mp4 配合良好,但输出视频仍然损坏。需要帮忙。


import numpy as np

    import cv2

    import sys

    import re

    vid=""

    

    if len(sys.argv)==3:

        vid=sys.argv[1]

        compress=int(sys.argv[2])

    else:

        print("File not mentioned or compression not given")

        exit()

    

    if re.search('.mp4',vid):

        print("Loading")

    else:

        exit()

    

    cap = cv2.VideoCapture(0)

    ret, frame = cap.read()

    

    def rescale_frame(frame, percent=75):

        width = int(frame.shape[1] * percent/ 100)

        height = int(frame.shape[0] * percent/ 100)

        dim = (width, height)

        return cv2.resize(frame, dim, interpolation =cv2.INTER_AREA)

    

    FPS= 15.0

    FrameSize=(frame.shape[1], frame.shape[0])

    fourcc = cv2.VideoWriter_fourcc(*'mp4v')

    

    out = cv2.VideoWriter('Video_output.mp4', fourcc, FPS, FrameSize, 0)

    

    while(cap.isOpened()):

        ret, frame = cap.read()

    

        # check for successfulness of cap.read()

        if not ret: break

        

        rescaled_frame=rescale_frame(frame,percent=compress)

        # Save the video

        out.write(rescaled_frame)

    

        cv2.imshow('frame',rescaled_frame)

        if cv2.waitKey(1) & 0xFF == ord('q'):

             break

    

    cap.release()

    out.release()

    cv2.destroyAllWindows()


LEATH
浏览 359回答 1
1回答

翻翻过去那场雪

问题是VideoWriter初始化。您初始化了:out = cv2.VideoWriter('Video_output.mp4', fourcc, FPS, FrameSize, 0)最后一个参数的0意思是,isColor = False。您告诉我们,您要将帧转换为灰度然后保存。但是您的代码中没有转换。此外,您还根据compress参数调整代码中每个框架的大小。如果我使用默认的压缩参数:cap = cv2.VideoCapture(0)if cap.isOpened():    ret, frame = cap.read()    rescaled_frame = rescale_frame(frame)    (h, w) = rescaled_frame.shape[:2]    fourcc = cv2.VideoWriter_fourcc(*'mp4v')    writer = cv2.VideoWriter('Video_output.mp4',                             fourcc, 15.0,                             (w, h), True)else:    print("Camera is not opened")现在我们已经VideoWriter用所需的尺寸初始化了 。完整代码:import timeimport cv2def rescale_frame(frame_input, percent=75):    width = int(frame_input.shape[1] * percent / 100)    height = int(frame_input.shape[0] * percent / 100)    dim = (width, height)    return cv2.resize(frame_input, dim, interpolation=cv2.INTER_AREA)cap = cv2.VideoCapture(0)if cap.isOpened():    ret, frame = cap.read()    rescaled_frame = rescale_frame(frame)    (h, w) = rescaled_frame.shape[:2]    fourcc = cv2.VideoWriter_fourcc(*'mp4v')    writer = cv2.VideoWriter('Video_output.mp4',                             fourcc, 15.0,                             (w, h), True)else:    print("Camera is not opened")while cap.isOpened():    ret, frame = cap.read()    rescaled_frame = rescale_frame(frame)    # write the output frame to file    writer.write(rescaled_frame)    cv2.imshow("Output", rescaled_frame)    key = cv2.waitKey(1) & 0xFF    if key == ord("q"):        breakcv2.destroyAllWindows()cap.release()writer.release()可能的问题:我不想更改VideoWriter参数,该怎么办?答案:那么你需要将框架更改为灰色图像:while cap.isOpened():    # grab the frame from the video stream and resize it to have a    # maximum width of 300 pixels    ret, frame = cap.read()    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python