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

sco*_*ang 20 python ubuntu opencv jupyter-notebook

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

这是我的配置:

  1. ubuntu 16.4x64

  2. python 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
Run Code Online (Sandbox Code Playgroud)

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

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

cv2.startWindowThread()
Run Code Online (Sandbox Code Playgroud)

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

这是我的错误的图片: 在此输入图像描述

小智 16

%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()
Run Code Online (Sandbox Code Playgroud)

  • 这会产生不正确的图像输出,因为 OpenCV 使用 BGR 数组而不是 RGB。在使用 plt 之前,我们需要使用 cv2.cvtColor(image, cv2.COLOR_BGR2RGB) 将 BGR 转换为 RGB。 (3认同)
  • 你能为答案添加更多细节吗? (2认同)
  • 这不是一个答案,而是展示如何使用 matplotlib 而不是 opencv。 (2认同)

Sai*_*bot 11

cv2.waitKey()API 文档指出以下内容:

此函数是 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')
Run Code Online (Sandbox Code Playgroud)

  • 您还可以在末尾使用 `cv2.destroyAllWindows()` 来销毁所有窗口。 (3认同)

man*_*ver 8

我遇到了类似的问题,无法cv2.imshow()在Jupyter Notebook中找到好的解决方案。我遵循了这个stackoverflow答案,仅使用matplotlib显示图像。

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

  • cv2.BGR2RGB现在称为cv2.COLOR_BGR2RGB (4认同)

小智 6

如果您在 google collab 中遇到问题,您可以使用此补丁

from google.colab.patches import cv2_imshow
cv2_imshow(img)
Run Code Online (Sandbox Code Playgroud)


小智 5

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

import cv2
cvim2disp = cv2.imread('data/home.jpg')
cv2.imshow('HelloWorld', cvim2disp)
cv2.waitKey(0) 
cv2.destroyWindow('HelloWorld')
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

这将解决。

  • 添加等待键和销毁窗口没有帮助。笔记本仍然死机 (3认同)