Hello,
I am trying to write a video with the .write() function of cv2 and the frames of the video written don’t match with the frame I enter in the function.
It could be a problem of compression or bytes based.
I tried to apply the function np.uint8() on my matrix and change the format of the video but nothing works.
Thanks for your help.
Here’s my script :
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import math
import cv2
import ffmpeg
from PIL import Image
theta = math.radians(0)
size = 255
def rotation (x, y, theta): 
    x_rot = x*np.cos(theta) + y*np.sin(theta)
    y_rot = -x*np.sin(theta) + y*np.cos(theta)
    return(x_rot, y_rot)
def gabor(x, y, t, sf, sigma_x, sigma_y, w, phase) :
    carrier = np.cos(2*np.pi*sf*rotation(x, y, theta)[0] - w*t + phase)
    gaussian_window = np.exp(-0.5*((rotation(x, y, theta)[0]/sigma_x)**2 + (rotation(x, y, theta)[1]/sigma_y)**2 ))
    return carrier*gaussian_window
M = np.zeros((size, size))
def image (t) : 
    x=-(size/2) # initialization in x
    for i in range (size):
        y=-(size/2) # initialization in y
        x = x + 1
    
        for j in range (size):
            y = y + 1
            M[i,j] = gabor(x, y, t, 0.02, 30, 30, 2*np.pi, np.pi/1) 
    return M
N_frame = 20
N = size
    
fourcc = cv2.VideoWriter_fourcc('X','V','I','D')
out = cv2.VideoWriter('output.avi',fourcc, 20.0, (N,N), 0)
i = 0
for i in range (N_frame - 1) :
    t = i*0.1
    frame = image(t)
out.release()