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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 10:52:37