【问题标题】:cv2.VideoCapture not working in Jupyter Notebookcv2.VideoCapture 在 Jupyter Notebook 中不起作用
【发布时间】:2019-12-01 15:54:38
【问题描述】:

我目前正在尝试进行一些视频分类,并且正在使用 anaconda 和 jupyter notebook 来进行数据训练。但是,我在 jupyter notebook 中遇到一个错误,我无法使用 cv2.VideoCapture 读取我的视频帧,但它在我的 conda 环境的终端中确实可以工作。

这是我的文件结构,

这是我目前遇到的错误,

在同一 anaconda 环境中的终端工作正常,

我确实在某处读到这可能是由于 conda 和 ffmepg 的问题,但我尝试了其他人建议的许多解决方案来解决该问题,包括从 opencv.org 本身下载 opencv 并设置环境路径变量而不是使用 conda安装了,还是不行。

有人知道如何解决这个问题吗?

【问题讨论】:

  • 这个问题很旧,但是 (1) jupyter notebook 版本中有一个额外的前导斜杠(假设这是原因,这是一个错字问题,应该关闭)和 (2) 始终提供文本形式的代码(图像是可选的)。

标签: python jupyter-notebook anaconda


【解决方案1】:

如果我错了,请原谅我,但我注意到您在两次测试中没有使用相同的文件名。我被困在同一点,直到我意识到我的“终端测试”和 jupyter 笔记本测试之间的路径和文件名不同。 我确认 jupyter 可以访问该文件。

Windows 属性测试:

!attrib data/TownCentreXVID.avi

bash 文件测试。详情见using bash commands in jupyter notebook

!file data/TownCentreXVID.avi

然后再次尝试,从 jupyter 获得相同的结果没有问题。

【讨论】:

    【解决方案2】:

    Python 中的 OpenCV 使您能够从网络摄像头/或视频文件(如您的情况)中抓取帧作为 Numpy 数组,对其进行修改,然后使用 OpenCV 的 cv2.imshow() 显示它。为此,OpenCV 将创建一个窗口并将框架推到那里。但是,这不适用于 IPython 笔记本。

    要在 jupyter notebook 或任何其他 IPython notebook 中显示,您必须使用该函数

    IPython.display.Image(data)
    

    而不是 OpenCV 的 imshow()。

    这是你可以使用的一段代码:

    cam = cv2.VideoCapture(0)
    
    d = IPython.display.display("", display_id=1)
    d2 = IPython.display.display("", display_id=2)
    while True:
        try:
            t1 = time.time()
            frame = get_frame(cam)
            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    
            im = array_to_image(frame)
    
            d.update(im)
    
            t2 = time.time()
    
            s = f"""{int(1/(t2-t1))} FPS"""
            d2.update( IPython.display.HTML(s) )
        except KeyboardInterrupt:
            print()
            cam.release()
            IPython.display.clear_output()
            print ("Stream stopped")
            break
    
    
    def get_frame(cam):
        # Capture frame-by-frame
        ret, frame = cam.read()
    
        #flip image for natural viewing
        frame = cv2.flip(frame, 1)
    
        return frame
    #Use 'jpeg' instead of 'png' (~5 times faster)
    def array_to_image(a, fmt='jpeg'):
        #Create binary stream object
        f = BytesIO()
    
        #Convert array to binary stream object
        PIL.Image.fromarray(a).save(f, fmt)
    
        return IPython.display.Image(data=f.getvalue())
    

    【讨论】:

    • 好吧,在使用您的代码并围绕 abit 进行测试之后,似乎如果我使用 cv2.VideoCapture(0) 从我的网络摄像头获取帧,即使不使用 IPython,cap.isOpened() 也会返回 True。展示。但是,我正在尝试使用 UCF101 数据集训练我的模型,因此,我需要从本地磁盘加载视频,但它似乎无法正常工作。
    猜你喜欢
    • 1970-01-01
    • 2017-06-12
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多