Python cv2.VideoCapture在Jupyter笔记本中不工作

Python cv2.VideoCapture在Jupyter笔记本中不工作,python,jupyter-notebook,anaconda,Python,Jupyter Notebook,Anaconda,我目前正在尝试做一些视频分类,并使用anaconda和jupyter笔记本对数据进行训练。然而,我在jupyter笔记本中遇到了一个错误,我无法使用cv2.VideoCapture读取我的视频帧,但不知何故,它在我的conda环境的终端中确实起作用 这是我的文件结构, 这就是我目前遇到的错误, 终端在同样的蟒蛇环境下工作良好, 我确实在某个地方读到,这可能是由于conda和ffmepg的问题造成的,但我尝试了其他人建议的许多解决方案来解决这个问题,包括从opencv.org下载opencv

我目前正在尝试做一些视频分类,并使用anaconda和jupyter笔记本对数据进行训练。然而,我在jupyter笔记本中遇到了一个错误,我无法使用cv2.VideoCapture读取我的视频帧,但不知何故,它在我的conda环境的终端中确实起作用

这是我的文件结构,

这就是我目前遇到的错误,

终端在同样的蟒蛇环境下工作良好,

我确实在某个地方读到,这可能是由于conda和ffmepg的问题造成的,但我尝试了其他人建议的许多解决方案来解决这个问题,包括从opencv.org下载opencv,设置环境路径变量,而不是使用conda安装,但仍然不起作用


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

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

要在jupyter笔记本或任何其他IPython笔记本中显示,您必须使用该功能

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())

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

Windows属性测试:

!attrib data/TownCentreXVID.avi
Bash文件测试。详情请参阅:

!file data/TownCentreXVID.avi
然后再试一次,从jupyter获得相同的结果没有问题。


好的,在使用您的代码并围绕abit进行测试之后,如果我使用cv2.VideoCapture(0)从我的网络摄像头获取帧,cap.isOpened()即使不使用IPython.display也会返回True。但是,我正在尝试使用UCF101数据集来训练我的模型,因此,我需要从本地磁盘加载视频,但它似乎不起作用。这个问题很老,但(1)jupyter笔记本版本中有一个额外的前导斜杠(假设这是原因,这是一个打字问题,应该关闭)和(2)始终以文本形式提供代码(图像是可选的)。