Как добавить вывод matplotlib в видео - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь создать видео с аннотацией (в настоящее время), сформированной из matplotlib, с оригинальным видео слева и БПФ некоторых параметров справа.

Единственный способ заставить его работать, это сохранить файл .png для каждого кадра, что кажется утомительным. Я надеялся, что кто-то может указать на «правильный» метод.

import cv2
import numpy as np
import matplotlib
import scipy.fftpack
from moviepy.editor import VideoFileClip
from moviepy.editor import AudioFileClip

vid = VideoFileClip('VID.mp4')
aud = AudioFileClip('VID.mp4')
out  = cv2.VideoWriter('1234.avi',cv2.VideoWriter_fourcc('M','J','P','G'), vid.fps, (vid.w*2, vid.h))
audIndex = 0
vidIndex = 0
numberOfSamples = 600
sampleRate = 800;
T = 1.0 / sampleRate;
x = np.linspace(0.0, numberOfSamples*T, numberOfSamples)

for frame in vid.iter_frames():

    # Put the recorded movie on the left side of the video frame
    frame2 = np.zeros((frame.shape[0], 2*frame.shape[1], 3)).astype('uint8')
    frame2[:720, :1280,:] = frame


    # Put, say, a graph of the FFT on the right side of the video frame
    y = np.sin(50.0 * 2.0*np.pi*x) + 0.5*np.sin(80.0 * 2.0*np.pi*x)
    yf = scipy.fftpack.fft(y)
    xf = np.linspace(0.0, 1.0/(2.0*T), numberOfSamples/2)
    fig, ax = matplotlib.pyplot.subplots()
    ax.plot(xf, 2.0/numberOfSamples * np.abs(yf[:numberOfSamples//2]))
    matFigureForThisFrame = ????????

    # Put the FFT graph on the left side of this video frame
    frame2[720:, 1280:, :] = matFigureForThisFrame

    out.write(frame2)
    vidIndex = vidIndex+1;

out.release()
#cv2.destroyAllWindows() 

1 Ответ

0 голосов
/ 08 мая 2019

Вы можете попытаться выбрать путь записи в видеофайл напрямую, но я бы не рекомендовал его (см. здесь почему). Запись в видеофайл сложнее, чем просто смена кадров, вам нужно найти правильных кодеров и решить другие болезненные вопросы. Лично я бы согласился. Некоторые варианты:

1) Создайте файлы png и затем объедините их в видеофайл, используя ffmpeg

2) Сохраните каждый кадр в буфер и сгенерируйте файл .gif впоследствии, непосредственно в python (чтобы вам не приходилось запускать несколько вещей). См. этот вопрос о стеке о том, как это сделать.

...