opencv.imshow会导致jupyter笔记本崩溃

时间:2017-09-15 09:25:34

标签: python opencv ubuntu jupyter-notebook

我在google或stackoverflow上检查其他问题,他们正在谈论在脚本中运行cv2.imshow,但我的代码在jupyter笔记本中运行。

这是我的配置:

  1. ubuntu 16.4x64

  2. python 3.5

  3. opencv 3.1.0

  4. 我启动了一个jupyter笔记本:这是我把它放在笔记本上的代码:

    %pylab notebook
    import cv2
    
    cvim2disp = cv2.imread('data/home.jpg')
    cv2.imshow('HelloWorld', cvim2disp)
    cv2.waitKey() #image will not show until this is called
    cv2.destroyWindow('HelloWorld') #make sure window closes cleanly
    

    当我执行这些代码时。图像将显示在弹出窗口中,但是我无法通过单击右上角的x关闭此窗口,片刻之后,系统会提示我窗口没有响应,它会给我2个选择:等待“,”退出“。如果我点击等待,那么它将在稍后显示相同的提示,如果我点击'退出',那么jupyter笔记本内核会死掉,我必须重新开始。

    我谷歌周围,许多解决方案建议我应该添加此代码

    cv2.startWindowThread()
    

    imshow之前,但情况变得更糟,内核永远挂起! 任何人都知道发生了什么。

    以下是我的错误图片: enter image description here

9 个答案:

答案 0 :(得分:9)

%matplotlib inline
#The line above is necesary to show Matplotlib's plots inside a Jupyter Notebook

import cv2
from matplotlib import pyplot as plt

#Import image
image = cv2.imread("input_path")

#Show the image with matplotlib
plt.imshow(image)
plt.show()

答案 1 :(得分:3)

我遇到了类似的问题,在Jupyter笔记本电脑中使用cv2.imshow()无法解决问题。我遵循this stackoverflow answer,只是使用matplotlib显示图像。

import matplotlib.pyplot as plt
# load image using cv2....and do processing.
plt.imshow(cv2.cvtColor(image, cv2.BGR2RGB))
# as opencv loads in BGR format by default, we want to show it in RGB.
plt.show()

答案 2 :(得分:3)

很简单。您需要了解正在发生的事情。

import cv2
cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('HelloWorld', cvim2disp)
cv2.waitKey(0) 
cv2.destroyWindow('HelloWorld')

waitKey(0)方法正在无限等待输入。当您看到相应图像的框架时,请勿尝试使用右上角的关闭来关闭图像。

请按一些键。 waitkey方法会将其作为输入,并将返回一个值。此外,您还可以检查按下了哪个键来关闭框架。

另外,waitKey(33)将使框架保持活动状态33 ms,然后自动将其关闭。

destroyWindow()将破坏当前帧。 destroyAllWindows()将破坏当前存在的所有帧。

这将解决。

答案 3 :(得分:2)

API documentation for cv2.waitKey()注意到以下内容:

  

此函数是HighGUI中唯一可以获取和处理事件的方法,因此需要定期调用它以进行正常事件处理,除非在负责事件处理的环境中使用HighGUI。

所以也许在无限循环中调用函数会使窗口响应?我还没有对此进行过测试,但也许你想尝试以下方法:

import cv2

cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('img', cvim2disp)
while(True):
    k = cv2.waitKey(33)
    if k == -1:  # if no key was pressed, -1 is returned
        continue
    else:
        break
cv2.destroyWindow('img')

答案 4 :(得分:1)

从Jupyter打开的新窗口使用与Notebook相同的内核。只需将以下代码添加到代码中,即可正常工作。

cv2.waitKey(0)
cv2.destroyAllWindows()

答案 5 :(得分:1)

image = cv2.imread(file_path)
while True:
    # Press 'q' for exit
    exit_key = ord('q')
    if cv2.waitKey(exit_key) & 255 == exit_key:
        cv2.destroyAllWindows()
        break
    cv2.imshow('Image_title', image)

答案 6 :(得分:1)

如果你在 google collab 中遇到问题,你可以使用这个补丁

from google.colab.patches import cv2_imshow
cv2_imshow(img)

答案 7 :(得分:0)

以下代码在Jupyter中可以正常显示一张图片

%matplotlib inline
import cv2
from matplotlib import pyplot as plt
cap = cv2.VideoCapture(videoFName)
ret, image = cap.read()
image=cv2.resize(image,None,fx=0.25,fy=0.25,interpolation=cv2.INTER_AREA)
plt.imshow(image)
plt.show()

如果要在单独的窗口中显示视频而不是图像,请使用以下代码:

import cv2
cap = cv2.VideoCapture(videoFName)
while cap.isOpened():
    ret, image = cap.read()
    image=cv2.resize(image,None,fx=0.25,fy=0.25,interpolation=cv2.INTER_AREA)
    cv2.imshow('image',image)

    k = cv2.waitKey(30) & 0xff # press ESC to exit
    if k == 27 or cv2.getWindowProperty('image', 0)<0:
        break
cv2.destroyAllWindows()
cap.release()

确保窗口名称匹配,否则将不起作用。在这种情况下,我使用“图像”作为窗口名称。

答案 8 :(得分:-1)

我不确定您是否可以从Jupyter Notebook打开一个窗口。 cv2.imshow期望一个在Jupyter中不起作用的waitKey。

这是我所做的(使用OpenCV 3.3):

from IPython.display import display, HTML
import cv2
import base64

def imshow(name, imageArray):
     _, png = cv2.imencode('.png', imageArray)
     encoded = base64.b64encode(png)
     return HTML(data='''<img alt="{0}" src="data:image/png;base64, {1}"/>'''.format(name, encoded.decode('ascii')))

img = cv2.imread('./media/baboon.jpg',cv2.IMREAD_COLOR)
imshow('baboon', img)

如果您不需要使用cv2,只需:

from IPython.display import Image
Image('./media/baboon.jpg')