如何使用Open CV在Jupyter Notebook中逐帧播放视频

时间:2019-08-18 22:51:44

标签: python opencv jupyter-notebook bokeh ipywidgets

我开发了一个应用程序,该应用程序使用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")

0 个答案:

没有答案