Использование matplotlibs 'FuncAnimation' для вывода данных на видео - PullRequest
0 голосов
/ 03 апреля 2020

У меня есть некоторые данные об участниках, которые смотрели несколько коротких (12-14 с) видео. Теперь, чтобы получить представление о данных, я хотел бы нанести фиксацию на видео.

Я нашел matplotlib s FuncAnimation, который может создавать анимацию и может создавать анимацию, показывающую фиксации на презентации видео.

fig = plp.figure()
plp.xlim(0, 1920)
plp.ylim(0, 1080)
interval = 1000/sample_rate
frames = len (sub1[0][0])
graph, = plp.plot([],[],'o')
def animate(i):
    graph.set_data(sub1[0][0][:i+1], sub1[1][0][:i+1])
    return (graph,)
ani = FuncAnimation(fig, func=animate, frames=frames, interval=interval, blit=True)
#HTML(ani.to_html5_video())

Я также могу открыть и воспроизвести видео, используя cv2.VideoCapture и нанести на экран свою фиксацию по кадру, а также перезаписать кадры.

fig, ax = plp.subplots(figsize=(10,10)) # create figure
cap = cv2.VideoCapture('Video.mp4') # open video file
fps = cap.get(cv2.CAP_PROP_FPS) # get video framerate
frame_time = 1.0/fps
counter = 0
while counter <75:
    ret, frame = cap.read() # get frame
    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) #convert in correct colourspace
    ax.imshow(frame) # plot frame
    ax.plot(data.X_Coord[(data.TimeStamp>counter*frame_time)&(data.TimeStamp<frame_time*(counter+1))],
            data.Y_Coord[(data.TimeStamp>counter*frame_time)&(data.TimeStamp<frame_time*(counter+1))],'.') #plot eyetracking data
    counter+=1
    time.sleep(1.0/fps) # let python wait till it is time for the next frame
cap.release()

Но Я не могу создать анимацию, используя FuncAnimation. Я попробовал это:

fig, ax = plp.subplots(figsize=(10,10))
cap = cv2.VideoCapture('Video.mp4') 
def animate(i):
    ret, frame = cap.read()
    ax.imshow(frame)
    ax.plot(data.X_Coord[(data.TimeStamp>counter*frame_time)&(data.TimeStamp<frame_time*(counter+1))],
            data.Y_Coord[(data.TimeStamp>counter*frame_time)&(data.TimeStamp<frame_time*(counter+1))],'o')
    time.sleep(1.0/fps)
    counter += 1
    return (ax,)
cap.release()
ani = FuncAnimation(fig, func=animate)

и некоторые варианты, но ни один не работает. Я не уверен, правильно ли я использую эту функцию анимации. В большинстве примеров он возвращает график (как в моем примере), но это не работает с моим фреймом (по крайней мере, я так думаю).

Я работаю в Jupyter Notebook.

1 Ответ

0 голосов
/ 05 апреля 2020

Хорошо, разобрался. Глупый я закрыл VideoCaption перед вызовом FuncAnimation
Для каждого, кто хочет нанести данные на видео:

%matplotlib inline
fig, ax = plp.subplots(figsize=(10,10))
cap = cv2.VideoCapture('in.mp4') 
num_frames = int (cap.get(cv2.CAP_PROP_FRAME_COUNT))
fps = cap.get(cv2.CAP_PROP_FPS)
frame_time = 1.0/fps

graph, = ax.plot([],[],'o')
ret,frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
im = ax.imshow (frame)
def animate(i):
    ret, frame = cap.read()
    if ret:
        frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        im.set_array(frame)
    graph.set_data (data.X_Coord[(data.TimeStamp>i*frame_time)&(data.TimeStamp<frame_time*(i+1))],
            data.Y_Coord[(data.TimeStamp>i*frame_time)&(data.TimeStamp<frame_time*(i+1))])
    time.sleep(frame_time)
    return ax, im,

ani = FuncAnimation(fig, func=animate, frames=num_frames, interval=frame_time)
Writer = animation.writers['ffmpeg']
writer = Writer(fps=fps, metadata=dict(artist='Me'), bitrate=1800)
ani.save('out.mp4',writer=writer)
cap.release()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...