cv2.VideoCapture在Jupyter Notebook中不起作用

时间:2019-12-01 15:54:38

标签: python jupyter-notebook anaconda

我目前正在尝试对视频进行分类,并且正在使用anaconda和jupyter笔记本进行数据培训。但是,我在jupyter笔记本电脑中遇到错误,无法使用cv2.VideoCapture读取视频帧,但是在某种程度上,它可以在conda环境的终端中正常工作。

这是我的文件结构, This is my file structure

这是我目前遇到的错误, This is the error I'm currently encountering

在相同anaconda环境中的端子工作正常, Terminal in the same anaconda environment works fine

我确实读过某个地方,这可能是由于conda和ffmepg的问题,但是我尝试了其他人建议的许多解决方案来解决该问题,包括从opencv.org本身下载opencv并设置环境路径变量而不是使用conda。安装,但仍然无法正常工作。

有人对如何解决此问题有任何想法吗?

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

!file data/TownCentreXVID.avi

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

read first image