OpenCV中cv.getWindowProperty检测窗口关闭报错求助
问题描述
我要重新启用一段旧代码,里面用了while(cv.getWindowProperty(msg, 1)) >= 0):语句来检测窗口何时关闭。已经把Python降级到3.8版本,也装了对应时期的所有依赖包,但还是出现错误:
cv2.error: OpenCV(4.7.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window_w32.cpp:837: error: (-27:Null pointer) NULL window: 'Window name' in function 'cvGetPropWindowAutoSize_W32'
没法调试getWindowProperty()函数,找不到报错原因,想问有没有人遇到过这个问题?
解决方案
先判断窗口是否存在再调用
getWindowProperty
这个报错本质是窗口已关闭后,你仍在调用getWindowProperty访问不存在的窗口,导致空指针错误。可以先用cv2.getWindowImageRect()判断窗口状态,返回(0,0,0,0)说明窗口已关闭:while True: # 检查窗口是否存在 win_rect = cv2.getWindowImageRect(msg) if win_rect == (0, 0, 0, 0): break # 你的原有循环逻辑 cv2.waitKey(1)替换窗口关闭检测逻辑
放弃用getWindowProperty做循环判断,改用cv2.waitKey()结合窗口状态检查:cv2.namedWindow(msg) while True: # 处理帧显示等逻辑 cv2.imshow(msg, frame) # 监听按键,同时检查窗口状态 key = cv2.waitKey(1) & 0xFF win_rect = cv2.getWindowImageRect(msg) # 按ESC或窗口关闭时退出 if key == 27 or win_rect == (0,0,0,0): break cv2.destroyAllWindows()更换OpenCV版本
OpenCV 4.7.0在Windows平台的highgui模块存在窗口管理的已知bug,试试降级到4.5.x系列(比如4.5.5),该版本窗口处理更稳定,和Python3.8兼容性更好:pip uninstall opencv-python pip install opencv-python==4.5.5.62检查窗口创建前置逻辑
确保进入循环前cv2.namedWindow(msg)或cv2.imshow(msg, ...)已成功执行,窗口名称msg无拼写错误,避免一开始就访问不存在的窗口。
内容的提问来源于stack exchange,提问作者asc

