OpenCV的waitKey/waitKeyEx对q键与F2键返回相同值该如何区分?
问题原因
你遇到的冲突是Windows平台+QT后端环境下,cv2.waitKey/cv2.waitKeyEx的返回值特性导致的:
- 普通字符按键(比如q)的返回值就是对应ASCII码,高24位均为0,
q对应的ASCII码为113,所以返回值就是113 - F系列功能键没有对应的ASCII码,返回的是32位特殊编码,F2的编码低8位恰好是0x71(十进制113),如果直接判断
k == 113就会把两个按键判定为相同。
解决方法
1. 使用完整32位键值判断
不要只比对低8位,直接判断waitKeyEx返回的完整整数值即可区分两个按键,你当前环境下各按键的完整返回值参考:
- q键:
113(即ord('q')) - F2键:
16777329(十六进制为0x1000071)
修改后的代码示例:
while True: k = cv2.waitKeyEx(1) if k == -1: continue # 匹配普通按键q和ESC if k == 27 or k == ord('q'): cv2.destroyAllWindows() return # 匹配F2功能键 if k == 0x1000071: print('f2 hit')
2. 自定义获取功能键键值
没有类似ord()的内置方法直接获取F系列功能键的键值,因为功能键不属于ASCII字符集。如果需要适配不同环境或者获取其他F键的键值,可以运行下面的测试脚本,按下对应按键即可打印出完整返回值:
import cv2 cv2.namedWindow('key_test') while True: k = cv2.waitKeyEx(1) if k != -1: print(f"按键十进制值:{k},十六进制值:{hex(k)}") # 按下q退出测试 if k == ord('q'): break cv2.destroyAllWindows()
注意事项
不同GUI后端(比如Win32原生、GTK)的功能键返回值会有差异,如果你后续切换OpenCV的GUI后端,需要重新测试对应功能键的返回值。
内容的提问来源于stack exchange,提问作者ahbutfore
相关产品推荐
相关产品推荐

