Отображать кадры видео после обработки (один за другим) Python

1

Если у меня есть клип и вам нужно обрабатывать каждый кадр, а затем показывать кадры (отображать их). Я нашел много примеров того, как вы можете получать кадры клипа, а затем сохранять (записывать) их как новое видео. Однако я попытался выполнить итерацию на каждом кадре, а затем показать каждое обработанное изображение, но 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()

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

Спасибо

  • 0
    Вы действительно попробовали это предложение? Я не вижу никакой причины, по которой чтение с камеры или с видео напрямую влияет на результат. Дело в том, что есть интерактивный сюжет и использование plt.pause. В вашем случае вы можете использовать значение частоты кадров для паузы. Для grab_frame (cap2) вы просто указываете new_frame.
  • 0
    @Dinesh Спасибо. Я попробовал второй подход по ссылке. Но у меня есть проблема, о которой я упоминал в вопросе. Я редактировал это. Не могли бы вы проверить это?
Показать ещё 2 комментария
Теги:
matplotlib
video
cv2
imshow

1 ответ

1

Это слишком долго для комментариев. Поэтому отправляем ответ.

Я прочитал видеофайл напрямую, используя библиотеку. Он работает по своему желанию. Цвет 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).

  • 0
    Спасибо @Dinesh К сожалению, я получил тот же результат 0,0! кажется, что анимация не работает :(

Ещё вопросы

Сообщество Overcoder
Наверх
Меню