我开发了一个应用程序,该应用程序使用openCV逐帧播放视频,并将该帧用于图像处理以对视频进行分类。但是,它是使用spyder开发的。现在,为了获得更好的视觉界面,我希望使用jupyter笔记本。我了解jupyter笔记本提供HTML标记来播放视频,但是对于我的工作,我想使用OpenCV。如果直接在jyputer笔记本中使用OpenCV代码,则问题在于它会打开一个单独的浏览器窗口来播放视频,而我想通过单击事件按钮来使用一个小窗口来播放视频。我还浏览了ipywidgets,但找不到解决我问题的任何可能的解决方案。 经过一番搜索,我发现了一个使用bokeh在用户定义的窗口中播放视频的代码,但是它太慢了。我想知道有什么方法可以有效地在Jupiter笔记本中逐帧播放视频。我使用的代码如下:
from bokeh.plotting import figure
from bokeh.io import output_notebook, show, push_notebook
import cv2
import time
output_notebook()
cap = cv2.VideoCapture('QingPing.mp4')
ret, frame = cap.read()
frame=cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) # because Bokeh expects a RGBA image
frame=cv2.flip(frame, -1) # because Bokeh flips vertically
width=frame.shape[1]
height=frame.shape[0]
p = figure(x_range=(0,width), y_range=(0,height), output_backend="webgl",
width=width, height=height)
myImage = p.image_rgba(image=[frame], x=0, y=0, dw=width, dh=height)
show(p, notebook_handle=True)
while True:
ret, frame = cap.read()
if ret is False:
break
if ret is True:
frame=cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA)
else:
continue
frame=cv2.flip(frame, -1)
myImage.data_source.data['image']=[frame]
push_notebook()
time.sleep(0.05)
print("releasing cap")
cap.release()
cv2.destroyAllWindows()
print("eneded")