简体   繁体   中英

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM