2

Why does the following code not save the video? Also is it mandatory that the frame rate of the webcam matches exactly with the VideoWriter frame size?

import numpy as np
import cv2
import time

def videoaufzeichnung(video_wdth, video_hight, video_fps, seconds):
    cap = cv2.VideoCapture(6)
    cap.set(3, video_wdth) # wdth
    cap.set(4, video_hight) #hight 
    cap.set(5, video_fps) #hight 
    
    # Define the codec and create VideoWriter object
    fps = cap.get(5)
    fourcc = cv2.VideoWriter_fourcc(*'XVID')
    out = cv2.VideoWriter('output.avi', fourcc, video_fps, (video_wdth, video_hight))
    #out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
    
    start = time.time()
    zeitdauer = 0
    while(zeitdauer < seconds):
        end = time.time()
        zeitdauer = end - start
        ret, frame = cap.read()
        if ret == True:
            frame = cv2.flip(frame, 180)
            # write the flipped frame
            out.write(frame)
    
            cv2.imshow('frame', frame)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        else:
            break
    
    # Release everything if job is finished
    cap.release()
    out.release()
    cv2.destroyAllWindows()

videoaufzeichnung.videoaufzeichnung(1024, 720, 10, 30)
Tonechas
  • 13,398
  • 16
  • 46
  • 80
user8495738
  • 147
  • 1
  • 3
  • 14

2 Answers2

2

I suspect you're using the libv4l version of OpenCV for video I/O. There's a bug in OpenCV's libv4l API that prevents VideoCapture::set method from changing the video resolution. See links 1, 2 and 3. If you do the following:

...
frame = cv2.flip(frame,180)
print(frame.shape[:2] # check to see frame size
out.write(frame)
...

You'll notice that the frame size has not been modified to match the resolution provided in the function arguments. One way to overcome this limitation is to manually resize the frame to match resolution arguments.

...
frame = cv2.flip(frame,180)
frame = cv2.resize(frame,(video_wdth,video_hight)) # manually resize frame
print(frame.shape[:2] # check to see frame size
out.write(frame)
...
zindarod
  • 6,328
  • 3
  • 30
  • 58
1

output-frame & input-frame sizes must be same for writing...

SKG
  • 145
  • 1
  • 8