我试图构建一个Jupyter笔记本解决方案,用于视频数据集的离群值分析。我想使用Video
小部件来实现此目的,但我在文档中没有找到如何通过调用一些小部件的方法来获取当前视频帧和/或滚动到所需位置。我的问题与这些未回答的问题one和two非常相似(几乎相同)。
我通过将视频帧保存到numpy数组并使用matplotlib的imshow
函数来实现这个想法,但视频播放非常抖动。我使用了位块传输技术来获得一些额外的fps,但没有多大帮助,相比之下,Video
小部件产生了更流畅的体验。看起来Video
小部件本质上是浏览器内置视频播放器的 Package 器。
- 问题**:如何通过编程来控制widget的播放,以便同步多个widget?一些
%%javascript
魔术可以帮助实现IPython.display
交互吗?
- 问题**:如何通过编程来控制widget的播放,以便同步多个widget?一些
下面是一个Python代码片段,仅用于说明目的,让您了解我想要实现的目标。
%matplotlib widget
from videoreader import VideoReader # nice pithonic wrapper for video reading with opencv
import numpy as np
import matplotlib.pyplot as plt
from ipywidgets import IntSlider, Play, link, HBox, VBox
# prepare buffered video frames
vr = VideoReader('Big.Buck.Bunny.mp4')
fps = vr.frame_rate
frames = []
for frame in vr[0:300:1]:
frames.append(frame[:,:,::-1]) # brg2rgb
del vr
vi_buff = np.stack(frames, axis=0) # dimensions (T, H, W, C)
# simulate random signal for demonstration purposes
t = np.linspace(0.0, vi_buff.shape[0], num=vi_buff.shape[0]*10)
s = np.sin(2*np.pi*t)*np.random.randn(vi_buff.shape[0]*10)
plt.ioff()
fig = plt.figure(figsize=(11, 8))
ax1 = plt.subplot2grid((6, 6), (0, 0), rowspan=2, colspan=3)
ax2 = plt.subplot2grid((6, 6), (0, 3), colspan=3)
ax3 = plt.subplot2grid((6, 6), (1, 3), colspan=3)
plt.ion()
# initial plots
img = ax1.imshow(vi_buff[0,...])
l0 = ax2.plot(t, s)
l1 = ax3.plot(t, -s)
# initial scene
lo_y, hi_y = ax2.get_ybound()
ax2.set_xbound(lower=-12., upper=2.)
ax3.set_xbound(lower=-12., upper=2.)
def update_plot(change):
val = change.new
img.set_data(vi_buff[val,...])
ax2.axis([val - 12, val + 2, lo_y, hi_y])
ax3.axis([val - 12, val + 2, lo_y, hi_y])
fig.canvas.draw_idle()
player = Play(
value=0, #intial frame index
min=0,
max=vi_buff.shape[0]-1,
step=1,
interval=int(1/round(fps)*1000) #referesh interval in ms
)
fr_slider = IntSlider(
value=0,
min=0,
max=vi_buff.shape[0]-1
)
fr_slider.observe(update_plot, names='value')
link((player,"value"), (fr_slider,"value"))
VBox([HBox([player, fr_slider]), fig.canvas])
1条答案
按热度按时间uklbhaso1#
我不得不用艰苦的方式学习它,并编写我自己的自定义视频小部件。感谢ipywidgets模块的作者,它不是从头开始的。我还发现,我想做的事情,可能可以用PyViz面板视频以更简单的方式完成。如果有人感兴趣,我会分享我的解决方案,它可以节省你学习前端和Backbone.js的时间。
Python端的小部件模型
前端的小部件视图
我真正要做的是