Python OpenCV - waitKey(0)不响应?

43

我正在Ubuntu 12.04上使用opencv 2.4.7,用Python编程时运行此脚本遇到了问题:

import cv2

img = cv2.imread('347620923614738322_233985812.jpg')
cv2.namedWindow("window")
cv2.imshow("window", img)
cv2.waitKey(0)
问题在于当我关闭图像时,脚本并没有停止。我搜索了关于 waitKey 的信息,并发现使用 cv2.waitKey(0) 是正确的。

我不明白,问题出在哪里?

1
脚本不停止 - 你是什么意思?它应该在按下键时停止(但可能不会在单击“关闭”按钮时停止)。 - berak
我按下一个键,脚本不会停止。 - Dhorka
你是先关闭窗口再按键吗?还是在窗口打开的时候就按了键? - Hannes Ovrén
我关闭窗口,然后按下一个键。 - Dhorka
@berak我使用的是MacOS,只需按下一个键,脚本就不会继续执行。为什么?根据文档,waitKey(0)会等待任意键按下,无需手动关闭窗口。 - Siva Praveen
我一直遇到完全相同的问题。使用 Windows 10 和 VS Code。图片窗口停止响应,然后 Python 崩溃。此后我就无法在 VS Code 中运行代码了。必须关闭 VS Code 并重新打开。 - Emo
13个回答

58
我发现只有当窗口处于焦点状态时按键才有效。如果命令行处于焦点状态,则无效。

2
这肯定有效...当您从命令行提示符运行程序时。 - Apricot
1
有人知道如何从CLI中停止吗?在那里按Ctrl + C没有任何作用。 - rinogo
我已经关闭了图像窗口,但Python shell没有响应。 - Horror Vacui

18

在销毁窗口后添加cv2.waitKey(1)应该可以解决这个问题。

cv2.imshow('imgae',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
cv2.waitKey(1)

你救了我的一天!非常感谢你! - wwood
谢谢!这在Python 3.11和MacOS Sonoma上运行成功了! - undefined

14

这段代码在我的IDLE中能够正常运行:

# -*- coding: utf-8 -*-

# Objectif : découvrir le fonctionnement d'opencv-python
# http://opencv-python-tutroals.readthedocs.org/en/latest/index.html


import numpy as np
import cv2

# Load an color image in grayscale
img = cv2.imread('Lena.tiff',0)
WINDOW_NAME = 'Image de Lena'
cv2.namedWindow(WINDOW_NAME, cv2.CV_WINDOW_AUTOSIZE)
cv2.startWindowThread()

# Display an image
cv2.imshow(WINDOW_NAME,img)
cv2.waitKey(0) 


cv2.destroyAllWindows()

希望这对未来的读者有所帮助。


3
如果您是Mac用户,请按照腾龙的回答,并在cv2.destroyAllWindows()之后添加cv2.waitKey(1) - wwood
cv2.destroyAllWindows() 工作正常。感谢您的回答。 - Amir Md Amiruzzaman
如果注释掉imshow,我们想在使用ctrl+c或其他键退出时保存视频怎么办? - Eyshika

14

点击图像窗口(活动状态),然后按任意键,不要在终端窗口中输入。


6

以下是一个简洁的代码,可在所有平台上实现最佳性能:

import cv2

img = cv2.imread("image.jpg")
cv2.imshow("Window", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

以下是一些观察结果:

当用户想通过按下键盘上的 0 键来关闭窗口时,需要确保在窗口处于焦点状态时按下 0 键。因为如上所述,如果终端处于焦点状态,将会发生任何事情并且代码执行会停留在 cv2.waitKey(0),直到用户在窗口处于焦点状态时正确按下 0 键。

在窗口处于焦点状态时按下 0是关闭窗口的正确方法,并确保一旦窗口在 cv2.destroyAllWindows() 中被摧毁并且程序结束,用户可以重新控制终端

如果窗口被鼠标点击退出,窗口将会被销毁,但是用户很有可能无法重新控制终端。在这种情况下,用户可以关闭不响应的终端并打开一个新的终端。


1
尝试直接从终端执行脚本对我来说是100%有效的,但例如从IDE中执行则不行。我解释一下:我正在使用Fedora 20,遇到了与官方OpenCV Python教程第一个示例相同的问题,我正在使用以下内容:
  • Fedora 20 64位
  • 用于Python的Spyder IDE
  • Python版本2.7.5
  • Fedora 64位
  • OpenCV 2.4.7
这里是测试代码。
import cv2
img = cv2.imread('/path/image1.jpeg',0)
cv2.imshow('Display',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

当使用Spyder中的F5运行此脚本时,它将使用嵌入式Python终端运行,并显示以下行:
runfile('/home/user/Workspace/test.py', wdir=r'/home/user/Workspace')

在此情况下,cv2.waitKey(0)或cv2.waitKey(-1)无效,按下具有示例代码的键后窗口仍然保持打开状态。尝试关闭窗口会导致“未响应,强制退出”警报。 但是,从终端执行脚本时,它可以完美运行 无法找到问题的根源,如果找到了将进行更新。

1
在Ubuntu下,通过按照[运行]->[文件配置]->[在外部系统终端中执行]的步骤,在Spyder中解决了问题。

你救了我!谢谢。 - solopiu

1

使用cv2.waitKeyEx(0)。

它以相同的方式运行,并等待您的响应,直到您撤销它。

希望这有所帮助。 Nithesh varmma


0

在基于Unix的系统上,从Python笔记本运行OpenCV程序存在问题。

请尝试以下备选方法:建议您在终端中运行Python代码。这样您就不会遇到任何问题。

将相同的代码复制并保存为filename.py文件。

import cv2
input = cv2.imread('path_to_image.png')
cv2.imshow('Hello World', input)
cv2.waitKey(0)
cv2.destroyAllWindows()

然后打开特定目录,再打开终端

步骤:

Open Terminal
cd path/to/filename.py
source activate YOURPROFILE 
python filename.py

这将解决问题

https://youtu.be/8O-FW4Wm10s


0

即使您使用窗口上的交叉按钮关闭窗口,此方法仍将起作用。

import numpy as np
import cv2

img = cv2.imread('arvid.jpg', 0)
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.imshow('image', img)

while True:
    k = cv2.waitKey(30) & 0xFF
    if k == 27:         # wait for ESC key to exit
        cv2.destroyAllWindows()
    elif k == ord('s'):  # wait for 's' key to save and exit
        cv2.imwrite('arvid2.jpg', img)
        cv2.destroyAllWindows()
    if cv2.getWindowProperty("image", 0) == -1:
        break

虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供参考链接。如果链接页面更改,仅链接的答案可能会失效。- 来自审查 - Rumit Patel
@RumitPatel 已修复 - user5885343

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接