【问题标题】:How to save a video after changing its speed with opencv in your folder?如何在文件夹中使用 opencv 更改视频速度后保存视频?
【发布时间】:2021-08-16 14:23:57
【问题描述】:

使用:OpenCV 和 Python3

我正在使用 Python 3.8.2

操作系统:macOS Big Sur 11.2.3

我在 VScode 上尝试了这段代码,它确实显示了一个使用 cv2.imshow 命令改变速度的视频,但我不知道如何将改变后的视频保存在我的文件夹中:

import cv2
cap = cv2.VideoCapture('Pothole testing.mp4')
frameTime = 100 

while(cap.isOpened()):

    ret, frame = cap.read()
    cv2.imshow('frame',frame)
    if cv2.waitKey(frameTime) & 0xFF == ord('q'):
        break
cap.release()
cv2.destroyAllWindows()

谁能告诉我我应该在这段代码中添加什么以便保存更改的视频?最好是 .mp4 格式。

【问题讨论】:

    标签: python python-3.x opencv save video-processing


    【解决方案1】:

    您可以使用cv2.VideoWriter() 方法的fps 参数。可以通过简单地将 frameTime 变量除以 1000 来计算 fps,因为 cv2.waitKey() 方法接收一个数字并将其用作千分之一秒。

    请注意,如果cap 在while 循环期间从未关闭,则while cap.isOpened() 不会比while True 好,这意味着在读取最后一帧时会发生错误,导致writer.release() 方法永远不会被调用,从而使生成的文件不可读。

    我会这样做:

    import cv2
    
    cap = cv2.VideoCapture('Pothole testing.mp4')
    ret, frame = cap.read() # Get one ret and frame 
    h, w, _ = frame.shape # Use frame to get width and height
    frameTime = 100
    
    fourcc = cv2.VideoWriter_fourcc(*"XVID") # XVID is the ID, can be changed to anything
    fps = 1000 / frameTime # Calculate fps
    writer = cv2.VideoWriter("Pothole testing 2.mp4", fourcc, fps, (w, h)) # Video writing device
    
    while ret: # Use the ret to determin end of video
        writer.write(frame) # Write frame
        cv2.imshow("frame", frame)
        if cv2.waitKey(frameTime) & 0xFF == ord('q'):
            break
        ret, frame = cap.read()
    
    writer.release()
    cap.release()
    cv2.destroyAllWindows()
    

    如果您只需要结果文件而不是进度窗口,则可以省略几行:

    import cv2
    
    cap = cv2.VideoCapture('Pothole testing.mp4')
    ret, frame = cap.read()
    h, w, _ = frame.shape
    frameTime = 100
    
    fourcc = cv2.VideoWriter_fourcc(*"XVID")
    fps = 1000 / frameTime
    writer = cv2.VideoWriter("Pothole testing 2.mp4", fourcc, fps, (w, h))
    
    while ret:
        writer.write(frame)
        ret, frame = cap.read()
    
    writer.release()
    cap.release()
    

    【讨论】:

    • 谢谢!这行得通,我唯一需要改变的是从 XVID 到 mp4v for mp4。
    猜你喜欢
    • 1970-01-01
    • 2018-10-06
    • 2019-01-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 2011-01-29
    • 2019-12-04
    相关资源
    最近更新 更多