OpenCV imshow 没有响应

Posted

技术标签:

【中文标题】OpenCV imshow 没有响应【英文标题】:OpenCV imshow not responding 【发布时间】:2021-03-30 20:34:21 【问题描述】:

我有下面的小 test.py 代码

import cv2

image = cv2.imread("sample.png")
print(image) #not None

cv2.imshow("Photo", image)

cv2.waitKey()
cv2.destroyAllWindows()

我在安装了 opencv 的 Pycharm 上运行虚拟环境。 Python版本是3.8.6

但是,当我在 Pycharm 终端中运行 python test.pypython3 test.py 时,Python 启动器会弹出,但它只是没有响应并显示任何照片。

这是Photo显示的内容

有人遇到过同样的问题吗?

更新:我认为这是使用 Pycharm 的,我在 Anadconda 上再次尝试使用 Spyder,它工作正常。窗口出现。

【问题讨论】:

【参考方案1】:

如果您查看documentation,waitKey 会等待按下的键。

但是,您没有在 waitKey 中指定任何延迟。

delay 延迟以毫秒为单位。 0 是表示“永远”的特殊值。

因此,如果您指定waitKey(0),图像将永远显示(直到您按下按钮。)

代码:


import cv2

image = cv2.imread("sample.png")
print(image) #not None

cv2.imshow("Photo", image)

cv2.waitKey(0)  # delay 0
cv2.destroyAllWindows()

【讨论】:

谢谢Ahx,我也试过了,但觉得不行。 你试过不同的参数吗?不是 0? 如果在 imshow 之后 if 没有打印(参见下面的讨论),它似乎没有到达 waitKey。我确实用 Pycharm 社区版运行了这个程序,没问题。 cv2.waitKey() 的作用类似于 (0),它只是等到按下,但是提出问题时,图像根本没有出现?我怀疑 Highgui 库可能缺少依赖项或其他东西。【参考方案2】:

编辑:我怀疑 Highgui 模块的依赖项丢失或损坏 - GTK、QT;甚至不是在他们的支持下构建的 OpenCV?

你能包括一行吗:

print(cv2.getBuildInformation())

在您的代码中查看输出的 GUI 部分?

对于 Windows,它是:

GUI: 
    Win32 UI:                    YES
    OpenGL support:              YES (opengl32 glu32)
    VTK support:                 NO

请参阅下面的 cmets 和链接:https://docs.opencv.org/master/db/d05/tutorial_config_reference.html

...

你说它不是无,但你是否尝试过使用照片的绝对路径,它是否在 PyCharm 搜索的同一文件夹中?

当您在映像目录中时,您是否尝试从系统控制台 shell 运行它?

编辑:另外,如果它似乎加载了图像,但没有显示它,请尝试保存它:cv2.imwrite("save.png", image)

另外,如果你在 cv2.imshow() 之后添加 print() 是否会显示输出?

顺便说一句,另一个可能的问题来源可能是在创建新项目时设置虚拟环境等:

【讨论】:

您是否尝试过使用照片的绝对路径,它是否在 PyCharm 搜索的同一文件夹中?是的,我做到了。当您位于映像目录中时,您是否尝试从系统控制台 shell 运行它?是的,我也这样做了,但同样的问题仍然存在。如果它似乎加载了图像,但没有显示它,请尝试保存它: cv2.imwrite("save.png", image) -> 是的,它已将图像保存到新图像中。如果在 cv2.imshow() 之后添加 print() 会显示输出吗? -> 不,它不会打印。看起来程序在尝试启动 python 启动器时挂起,但没有响应。 如果在 imshow 之后没有打印,那么可能是 cv2.imshow 挂起,这让我怀疑 HighGui 库,可能缺少某些依赖项?吗? OpenCV 在构建过程中有很多选择。您是否尝试过其他示例程序,它们只是省略了 imshow/GUI 并保存了输出?例如。 image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) sobelX = cv2.Sobel(image, cv2.CV_64F, 1, 0) sobelY = cv2.Sobel(image, cv2.CV_64F, 0, 1) sobelX = np.uint8( np.absolute(sobelX)) sobelY = np.uint8(np.absolute(sobelY)) sobelCombined = cv2.bitwise_or(sobelX, sobelY) cv2.line(image, (0,0), (40,40), 255, 3) Highgui 可以基于 GTK(默认为 ON)或 Qt,取决于编译期间的选项:docs.opencv.org/master/db/d05/tutorial_config_reference.html"GUI 后端(highgui 模块)OpenCV 依赖于各种 GUI 库来绘制窗口。选项默认平台说明 WITH_GTK ON Linux GTK 是 Linux 和 Unix-like OS-es 中的常用工具包。默认情况下,如果找到将使用版本 3,可以使用 WITH_GTK_2_X 选项强制版本 2。 WITH_QT OFF 跨平台 Qt 是一个交叉-平台 GUI 框架。" 顺便说一句,“Python 启动器”是什么意思? Python 可执行文件?如果图像已成功读取和保存等,则 Python 解释器已启动并运行。我认为“无响应”是 GUI 问题的典型表现。 啊,现在你说 HighGui,我会开始研究它。谢谢!

以上是关于OpenCV imshow 没有响应的主要内容,如果未能解决你的问题,请参考以下文章

cv2.imshow() 函数打开一个总是说没有响应的窗口 - python opencv

opencv与mfc显示图片操作,MFC的鼠标响应在opencv图片上失效,opencv滚轮事件没有响应问题描述解决。

OpenCV进程运行时QMainWindow没有响应

图像未在 python OpenCV 中打开 [重复]

是否可以使用 opencv 的 imshow 显示没有工具栏的图像?

在 open cv 中进行 videoCapture 后应用程序没有响应