如果我有剪辑并且需要处理每个帧然后显示帧(显示它们)。我找到了许多关于如何获取剪辑帧然后将它们保存(写入)为新视频的示例。 但是,我尝试迭代每一帧,然后显示每个处理后的图像,但 Matplotlib 在循环完成后仅显示一张图像。
clip = VideoFileClip(filename)
for frame in clip.iter_frames():
new_frame= Fun(frame)
plt.imshow(new_frame)
update frame in matplotlib with live camera preview
我找到了这个链接,但它使用来自相机的帧,我需要一一显示从 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 中的帧数)。
关于python - 显示处理后的视频帧(一帧一帧)Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52775904/