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