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
相关产品推荐
相关产品推荐

