Search code examples
pythonopencvvideorotationvideo-capture

Rotate video 180 with OpenCV Python


I'm a python beginner so sorry in advance for the mistakes. I'm trying to rotate a video 180 degrees and then work with that video that I should have created.

At the moment I'm doing this:

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

In the end, however, when I go to read the file I find only an empty file that I cannot open. From this, I deduce that there is an error in the steps that I have made. Would anyone have any advice on how am I suppose to do this?

** I've also tried to change the parameter on cv2.Videowriter (for example fps, size) but is still not working


Solution

  • You don't need to accumulate the frames, and write them in another loop.
    You can read a frame, rotate it, and write it in the same loop.

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

    Complete code sample (I named the files input.mp4 and output.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()