2017-09-15 533 views
1

我检查其他问题在谷歌或stackoverflow,他们正在谈论脚本中运行cv2.imshow,但我的代码运行在jupyter笔记本。opencv.imshow会导致jupyter笔记本崩溃

这里是我的配置:

  1. Ubuntu的16.4x64

  2. 蟒蛇3.5

  3. 的OpenCV 3.1.0

我开始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笔记本内核就会死机,我必须重新开始。

我Google的中心,许多解决方案建议我应该加入这样的代码

cv2.startWindowThread() 

imshow过,但情况变得更糟,内核永远挂!任何人都有一些想法是怎么回事。

这里是我的错误的PIC: enter image description here

+0

'cv.imshow'并没有真正意义的客户机/服务器环境下,如Jupyter。你需要一些东西来显示图像作为笔记本的一部分(在客户端),而不是在服务器端运行GUI窗口 - 当客户端和服务器在同一台机器上时,这可能会“起作用”,但就是这样。 |你已经使用matplotlib中的'imshow'函数(不像你似乎认为的那样numpy),所以坚持这一点(记住它使用RGB而不是颜色平面的BGR顺序)。 –

回答

0

API documentation for cv2.waitKey()注意事项如下:

This function is the only method in HighGUI that can fetch and handle events, so it needs to be called periodically for normal event processing unless HighGUI is used within an environment that takes care of event processing.

因此,也许调用函数中无限循环就会使窗口响应?我没有测试过这一点,但也许你想尝试以下操作:

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