You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下点击OpenCV图像窗口右上角X导致终端冻结的解决方法

解决OpenCV点击窗口右上角X导致终端冻结的问题

我之前也碰到过一模一样的问题!在Ubuntu 18.04环境下用Python 3.6.8搭配OpenCV 4.1.1.26时,运行你那段代码按任意键能正常关闭窗口,但点右上角的X就会让终端卡住。这其实是cv2.waitKey(0)的逻辑导致的:它会一直阻塞进程等待按键输入,哪怕窗口已经被手动关闭了,进程还傻等着按键,所以终端就冻住了。

给你两个实用的解决办法,任选其一就行:

方法一:循环检查窗口状态(简单高效)

这个方法是最常用的,通过循环定期检查窗口是否还可见,同时监听按键输入,只要窗口被关闭或者有按键按下,就终止循环并清理窗口:

import cv2

img = cv2.imread("images/color.png")
cv2.imshow("dasd", img)

# 循环监听按键和窗口状态
while True:
    # 等待1毫秒,返回按键的ASCII码(无按键时返回-1)
    key = cv2.waitKey(1)
    # 触发条件:有按键按下,或者窗口已被关闭(检查可见性)
    if key != -1 or not cv2.getWindowProperty("dasd", cv2.WND_PROP_VISIBLE):
        break

cv2.destroyAllWindows()

这里cv2.getWindowProperty("dasd", cv2.WND_PROP_VISIBLE)会返回窗口的可见状态,当你点击X关闭窗口时,这个值会变成False,循环就会终止,进而执行destroyAllWindows(),不会让终端卡住。

方法二:通过回调监听窗口关闭事件

如果你需要更精细化的控制,可以给窗口设置回调函数,监听窗口的关闭事件:

import cv2

def window_close_callback(event, x, y, flags, param):
    # 监听窗口可见性变化事件
    if event == cv2.WND_PROP_VISIBLE:
        # 检查窗口是否还可见
        if not cv2.getWindowProperty("dasd", cv2.WND_PROP_VISIBLE):
            param['is_running'] = False

img = cv2.imread("images/color.png")
cv2.imshow("dasd", img)

# 用字典传递运行状态(因为回调函数不能直接修改外部变量)
running_status = {'is_running': True}
cv2.setMouseCallback("dasd", window_close_callback, running_status)

# 循环直到窗口关闭或有按键按下
while running_status['is_running']:
    key = cv2.waitKey(1)
    if key != -1:
        running_status['is_running'] = False

cv2.destroyAllWindows()

这个方法通过回调函数实时监测窗口的可见性,一旦窗口被关闭,就标记循环终止,同样能避免终端冻结。

内容的提问来源于stack exchange,提问作者Kevin Su

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:22:29