OpenCV“waitkey”在 Jupyther Notebook 中不起作用

问题描述 投票:0回答:1

cv2.waitkey(0)
显示没有输出,内核仍处于星号 (*) 位置。

我正在研究光学字符识别(OCR),在 Jupyter Notebook 上使用不同的 Python 库。当我写

cv2.waitkey(0)
时,没有显示任何输出,如果显示了一些输出,则星号(*)仍然存在。

python opencv jupyter ocr python-tesseract
1个回答
1
投票

奇怪的是在笔记本中使用

cv2.imshow
。或者一个
cv2.waitKey
。 笔记本的意义在于有点像笔记本、文档。有代码和结果。

cv2.waitKey
就是等待opencv窗口中输入一个按键,而你没有cv2窗口。

在一台独立的机器上,那就是 jupyter 服务器(它是一个服务器,即使对于非常简单的笔记本来说,没有 jupyterlab 或 jupyterhub 或类似的东西。有一个运行 python 内核的 miniwebserver,你可以通过Web 浏览器客户端)在您用来编辑笔记本的同一台计算机上以同一用户等身份运行,那么它可能看起来可以工作。因为尝试从内核打开一个窗口来显示图像是可行的:内核作为同一用户在同一台计算机上运行,因此它可以访问您的屏幕并有权访问您的屏幕。 但那个窗口与笔记本无关。

如果服务器是远程的(google collab,或任何 jupyterhub/jupyterlab 服务器,甚至是从另一台机器访问的简单笔记本),那么这是行不通的。服务器将无法打开窗口。或者,更糟糕的是,它会,但会在距离您数英里的服务器机房中的服务器屏幕上打开窗口:D 然后等待有人进入服务器机房输入密钥:D

有解决方案。

例如

opencv_jupyter_ui
将cv2交互功能替换为可以与笔记本集成的功能。

但对于大多数用途来说,解决方案就是不这样做。你真的需要这样在笔记本中使用opencv的交互方式吗?

您可以非常简单地在笔记本中显示图像。 例如,如果单元格结果是 PIL 图像,则会显示它。

import numpy as np
from PIL import Image

# Just an image. Anything would do
img=(np.sin(np.linspace(0,1,500)[None,:]*(np.linspace(0,1,500)[:,None]+1)*10)*127+128).astype(np.uint8)

# If that is the last code of the cell, that is the result of the cell, 
# then the image is displayed as result
Image.fromarray(img)

所以,真正的问题是,为什么需要

cv2.waitKey
?是因为opencv在调用之前不会显示图像吗?在这种情况下,您不需要在笔记本中使用它。 还是另有原因?然后你需要澄清你真正想做什么。

© www.soinside.com 2019 - 2024. All rights reserved.