使用OpenCV Python将视频旋转180度

3

我是一名Python初学者,因此请原谅我的错误。

我想要将一个视频旋转180度,然后对那个我应该创建的视频进行操作。

目前我的做法如下:

import cv2
import numpy as np
    
#that's my original video - the one that I want to rotate 180 degrees 

cap = cv2.VideoCapture('/Users/name/Desktop/VIDEO 12.05/PIC_P01.mp4')
    
    frame_number = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
    
    # Original Frames
    frames = []
    for i in range(frame_number):
        ret, frame = cap.read()
        frames.append(frame)

    #here's where I try to rotate the video 
    new = cv2.rotate(frame, cv2.ROTATE_180)
    
    cv2.imshow('output', new)
     if cv2.waitKey(1) & 0xFF == ord('q'):
                break

    #here I'm trying to write the new rotated video
    newvideoR = cv2.VideoWriter('PIC_P01R.mp4',0x7634706d, 50, (360, 640))
    for jj in range(len(new)):
        newvideoR.write(new[jj])
    newvideoR.release()
    cap.release()

最终,当我尝试读取文件时,却发现只是一个无法打开的空文件。由此推断,我在操作过程中出现了错误。请问是否有任何建议,我应该如何去做?
我也尝试更改cv2.Videowriter的参数(例如fps、size),但仍然无法解决问题。

你能解释一下“还是不工作”是什么意思吗?你有输出结果吗?代码出错了吗?你怎么知道它不工作?有错误信息可以提供吗? - undefined
没有出现任何错误或警告信息。代码看起来没问题,但最后我就是无法用任何程序打开这个视频(因为它是一个空白视频)。 - undefined
1个回答

4

您无需累积帧并在另一个循环中编写它们。
您可以读取一帧,旋转它,并在同一个循环中编写它。

  • Get width and height:

     frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
     frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
    
  • Open the output video file before the loop:

     newvideoR = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*"mp4v"), 50, (frame_width, frame_height))
    
  • Read the frame, rotate it and write it in a loop:

     for i in range(frame_number):
         ret, frame = cap.read()
    
         new = cv2.rotate(frame, cv2.ROTATE_180)
    
         cv2.imshow('output', new)
         if cv2.waitKey(1) & 0xFF == ord('q'):
             break
    
         newvideoR.write(new)
    
  • Release video reader and writer:

     newvideoR.release()
     cap.release()
    

完整的代码示例(我将文件命名为input.mp4output.mp4):

import cv2
    
#that's my original video - the one that I want to rotate 180 degrees 
cap = cv2.VideoCapture('input.mp4')
    
frame_number = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))

# Get width and height
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))

# here I'm trying to write the new rotated video
# Open the output video file before the loop, cv2.VideoWriter_fourcc(*"mp4v") = 0x7634706d
newvideoR = cv2.VideoWriter('output.mp4', cv2.VideoWriter_fourcc(*"mp4v"), 50, (frame_width, frame_height))
    
# Original Frames
#frames = []
for i in range(frame_number):
    ret, frame = cap.read()
    #frames.append(frame)  # No need to append the original frames

    #here's where I try to rotate the video 
    new = cv2.rotate(frame, cv2.ROTATE_180)
    
    cv2.imshow('output', new)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

    newvideoR.write(new)

newvideoR.release()
cap.release()

太好了!非常感谢你清晰的解释和示例。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接