cv2.imshow() 在 Mac 上崩溃

Posted

技术标签:

【中文标题】cv2.imshow() 在 Mac 上崩溃【英文标题】:cv2.imshow() crashes on Mac 【发布时间】:2018-03-03 02:29:25 【问题描述】:

当我在ipython (MacOS /python 2.7.13) 上运行这段代码时

cv2.startWindowThread()
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

内核崩溃。当图像出现时,我唯一能按的按钮是minimise(中间的那个,当我按任意键时,纺车就会出现,我唯一能做的就是强制退出。

附:我已经通过home-brew下载了最新的python版本。

【问题讨论】:

OpenCV gui 不能很好地与 jupyter/iPython 配合使用。为什么不使用像 pyCharm 这样的本地 IDE? 【参考方案1】:

你只是想看图像吗?我不确定你想用 startWindowThread 做什么,但如果你想以最简单的方式安装 opencv,请打开图像并查看它,试试这个:

安装conda(比自制软件更好的opencv包管理器)

然后创建一个cv环境:

conda create -n cv

激活它并从menpo的频道安装opencv

source activate cv
conda install -c menpo opencv

然后在python中(点击q退出):

import cv2
cv2.namedWindow('imageWindow')
img = cv2.imread('path/to/your/image.png')
cv2.imshow('imageWindow',img)
wait = True
while wait:
  wait = cv2.waitKey()=='q113' # hit q to exit

【讨论】:

【参考方案2】:

我已经重现了 jupyter 内核崩溃问题。以下是测试环境设置。

 - macOS 10.12.16
 - python 2.7.11
 - opencv 4.0.0
 - ipython 5.8.0
 - jupyter notebook server 5.7.4

随着cv2.waitKey() 上的更改为等待 Q 按下,问题就消失了。

代码如下:

import cv2

img = cv2.imread('sample.jpg')
cv2.startWindowThread()
cv2.imshow('img', img)

# wait forever, if Q is pressed then close cv image window
if cv2.waitKey(0) & 0xFF == ord('q'):
   cv2.destroyAllWindows()

希望对您有所帮助。

【讨论】:

【参考方案3】:

我在 Mac OS X 10.14.3 上安装了最新版本的 python (2.7.15)。

为什么我们不能直接将内容保存到文件中并使用命令python filename.py 运行它。尽管如此,它仍然是一样的,并且有效!

我测试的示例代码是:

import cv2

img = cv2.imread('sample.jpg')

cv2.startWindowThread()
cv2.imshow('img', img)
cv2.waitKey()
cv2.destroyAllWindows()

希望对你有帮助!

【讨论】:

【参考方案4】:

遇到了同样的问题,但没有找到适合我的解决方案。我只能通过从google colab tools 复制此函数来解决它。它不会在新窗口中显示图像,而是在 Jupyter 笔记本中内联。

import cv2
from IPython import display
from PIL import Image

def cv2_imshow(a):
    """A replacement for cv2.imshow() for use in Jupyter notebooks.
    Args:
    a : np.ndarray. shape (N, M) or (N, M, 1) is an NxM grayscale image. shape
      (N, M, 3) is an NxM BGR color image. shape (N, M, 4) is an NxM BGRA color
      image.
    """
    a = a.clip(0, 255).astype('uint8')
    # cv2 stores colors as BGR; convert to RGB
    if a.ndim == 3:
        if a.shape[2] == 4:
            a = cv2.cvtColor(a, cv2.COLOR_BGRA2RGBA)
        else:
            a = cv2.cvtColor(a, cv2.COLOR_BGR2RGB)
    display.display(Image.fromarray(a))

【讨论】:

以上是关于cv2.imshow() 在 Mac 上崩溃的主要内容,如果未能解决你的问题,请参考以下文章

为啥在 Jupyter 笔记本中调用 cv2.imshow() 时出现无响应窗口

opencv-python imshow在mac中给出错误

opencv-python 中的 imshow 不起作用

cv2 & PIL(pillow)显示图像

OpenCV 在带有 anaconda 的 Linux 上无法与 python 一起正常工作。收到未实现 cv2.imshow() 的错误

cv2 imshow 有时会显示黑色图像