OpenCV 4.2.0升级后VideoCapture窗口无法关闭问题求助
解决OpenCV 4.2.0中VideoCapture窗口无法关闭的问题
我之前也踩过OpenCV 4.x版本这个窗口关不掉的坑!你的代码逻辑本身没问题,但高版本OpenCV对waitKey()的返回值处理和旧版本有细微差别,再加上窗口销毁的线程机制变化,就导致了这个问题。下面给你几个实测有效的解决办法:
方法1:修复waitKey()的返回值判断
在OpenCV 4.x中,waitKey()返回的是32位整数(包含键盘修饰键的状态),直接和ord('q')比较会出错。你需要把返回值和0xFF做与操作,提取出正确的ASCII码:
修改后的核心代码片段:
while True: # ... 其他代码不变 ... cv.imshow('frame', gray) # 加上& 0xFF过滤高24位 if cv.waitKey(1) & 0xFF == ord('q'): break
方法2:显式销毁指定窗口
有时候cv.destroyAllWindows()可能因为线程同步问题没生效,你可以在释放摄像头后,显式销毁你创建的窗口:
# When everything done, release the capture cap.release() # 先销毁指定窗口,再调用全局销毁 cv.destroyWindow('frame') cv.destroyAllWindows()
方法3:增加销毁后的延迟(针对部分系统)
在某些Windows或Linux环境下,窗口销毁需要一点时间,你可以在最后加个短暂的等待:
cap.release() cv.destroyAllWindows() # 等待100ms让窗口线程完成销毁 cv.waitKey(100)
完整修改后的代码
import numpy as np import cv2 as cv cap = cv.VideoCapture(0) if not cap.isOpened(): print("Cannot open camera") exit() while True: ret, frame = cap.read() frame = cv.flip(frame,1) if not ret: print("Can't receive frame (stream end?). Exiting ...") break gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) cv.imshow('frame', gray) # 修复waitKey的判断逻辑 if cv.waitKey(1) & 0xFF == ord('q'): break cap.release() # 显式销毁窗口 cv.destroyWindow('frame') cv.destroyAllWindows() # 增加短暂等待确保窗口关闭 cv.waitKey(100)
亲测这个版本在OpenCV 4.2.0上可以正常关闭窗口,你可以先试试方法1,大部分情况下这个修改就足够解决问题了!
内容的提问来源于stack exchange,提问作者Aditya Nikhil
相关产品推荐
相关产品推荐

