使用Python的OpenCV和keyboard库时摄像头无法正常工作怎么办
问题核心原因
- OpenCV的
HighGUI模块依赖内置的事件循环才能完成窗口渲染、帧更新操作。你之前使用的cv2.waitKey()本质上不仅是等待按键,还会主动处理HighGUI的所有待处理事件(包括窗口重绘、帧刷新),所以能正常显示画面。去掉waitKey()之后,事件队列没有被消费,cv2.imshow()的内容根本不会被渲染到窗口上,看起来就是摄像头无法工作。 - 其次
keyboard.read_key()是阻塞方法,执行到这行的时候会一直卡住等待用户按键,导致循环没法持续读取摄像头帧、更新画面,也会导致画面卡住。
可行修改方案
你可以保留事件循环处理逻辑,同时用非阻塞的键盘检测逻辑,不需要用waitKey()做按键判断即可:
import cv2 import keyboard webcam = cv2.VideoCapture(0) while True: ret, frame = webcam.read() if not ret: # 增加帧读取异常判断,避免摄像头读取失败时报错 break cv2.imshow("webcam", frame) # 仅调用waitKey处理事件,等待1毫秒即可,不用于按键判断 cv2.waitKey(1) # 用keyboard的非阻塞检测方法判断esc是否按下 if keyboard.is_pressed('esc'): break cv2.destroyAllWindows() webcam.release()
注意:如果在Linux/macOS环境下运行,keyboard库需要root权限才能正常检测按键,否则会出现按键无响应的问题。
内容的提问来源于stack exchange,提问作者adnan
相关产品推荐
相关产品推荐

