如何在文件夹中使用 opencv 更改视频速度后保存视频?

How to save a video after changing its speed with opencv in your folder?

使用: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 格式本身。

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

请注意,如果 capwhile 循环期间从未关闭,则 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()

如果你只需要结果文件而不是进度window,你可以省略几行:

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