Macciseiono
Macciseiono

Reputation: 39

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

Upvotes: 3

Views: 6520

Answers (1)

Rotem
Rotem

Reputation: 32084

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

Upvotes: 4

Related Questions