Отображать кадры видео после обработки (один за другим) Python - PullRequest
0 голосов
/ 12 октября 2018

Если у меня есть клип и мне нужно обработать каждый кадр, а затем показать кадры (отобразить их).Я нашел много примеров того, как вы можете получить кадры клипа, а затем сохранить (записать) их как новое видео.Однако я попытался выполнить итерацию для каждого кадра, а затем показать каждое обработанное изображение, но Matplotlib показывает только одно изображение после завершения цикла.

clip = VideoFileClip(filename)
for frame in clip.iter_frames():
    new_frame= Fun(frame)
    plt.imshow(new_frame)

обновление кадра в matplotlib с предварительным просмотром с камеры в реальном времени

Я нашел эту ссылку, но она использует кадры с камеры, мне нужно отображать изображения процессов по мере их поступления от Fun по одному.Поэтому я не хочу сохранять его или создавать список обработанных кадров, а затем показывать их, мне нужно сделать это один за другим.

Я использовал второй метод из ссылки, но он печатает только 0, 0 и показывает только первый кадр!Кажется, он не может изменить индекс, чтобы перейти к следующему кадру!

import cv2
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
index =0


inF=[]
for frames in clip.iter_frames():
    inF.append(frames)

global inF


def grab_frame():
    print(index)
    frame = inF[index]
    return cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)

#Initiate the two cameras
cap1 = clip
#create two subplots
ax1 = plt.subplot(1,2,1)

#create two image plots
im1 = ax1.imshow(grab_frame())

def update(i):
    global index
    im1.set_data(grab_frame())
    index+=1


ani = FuncAnimation(plt.gcf(), update, interval=10)
plt.show()

Не могли бы вы мне помочь?Любой намек?

Спасибо

1 Ответ

0 голосов
/ 12 октября 2018

Это слишком долго для комментария.Так что постинг как ответ.

Я читаю видеофайл напрямую, используя библиотеку.Это работает как хотелось бы.Цвет BGR2RGB работает как нужно, кадры меняются и воспроизводятся до последнего кадра.

import cv2
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import skvideo.io

index =0
inF=skvideo.io.vread('test.avi')


#inF=[]
#for frames in clip.iter_frames():
 #   inF.append(frames)

global inF


def grab_frame():
    print(index)
    frame = inF[index]
    return cv2.cvtColor(frame,cv2.COLOR_BGR2RGB)

#Initiate the two cameras
cap1 = clip
#create two subplots
ax1 = plt.subplot(1,2,1)

#create two image plots
im1 = ax1.imshow(grab_frame())

def update(i):
    global index
    im1.set_data(grab_frame())
    index+=1


ani = FuncAnimation(plt.gcf(), update, interval=10)
plt.show()

Нет проблем с приведенным выше кодом.Источником ошибки является ваше видео или то, как вы читаете видео.Очевидно, он печатает от 0 до 32 (количество кадров в test.avi).

...