简体   繁体   English

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

[英]Resizing video using opencv and saving it

I'm trying to re-size the video using opencv and then save it back to my system.The code works and does not give any error but output video file is corrupted.我正在尝试使用 opencv 重新调整视频大小,然后将其保存回我的系统。代码有效并且没有出现任何错误,但输出视频文件已损坏。 The fourcc I am using is mp4v works well with .mp4 but still the output video is corrupted.我使用的 Fourcc 是 mp4v 与 .mp4 配合良好,但输出视频仍然损坏。 Need Help.需要帮忙。

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()

The problem is the VideoWriter initialization.问题是VideoWriter初始化。

You initialized:你初始化:

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

The last parameter 0 means, isColor = False .最后一个参数0表示isColor = False You are telling, you are going to convert frames to the grayscale and then saves.您是在说,您要将帧转换为灰度,然后保存。 But there is no conversion in your code.但是您的代码中没有转换。

Also, you are resizing each frame in your code based on compress parameter.此外,您正在根据compress参数调整代码中每个帧的大小。

If I use the default compress parameter:如果我使用默认的压缩参数:

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")

Now we have initialized the `VideoWriter` with the desired dimension.

Code:
***
```python
import time
import cv2


def 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"):
        break


cv2.destroyAllWindows()
cap.release()
writer.release()

Possible Question: I don't want to change my VideoWriter parameters, what should I do?可能的问题:我不想更改我的VideoWriter参数,我该怎么办?

Answer: Then you need to change your frames, to the gray image:答:然后你需要改变你的框架,到灰色图像:

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM