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.py
或 python3 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滚轮事件没有响应问题描述解决。