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

使用cv2.waitKey实现依赖前置按键输入的后续操作需求及问题

问题分析与解决方案

你的需求是按下s键执行完do stuff后,通过任意键或特定键触发do more some stuff,但当前两种实现都存在问题:

现有代码的问题

  • 第一种用input("Press any key to continue"):
    input()是终端输入阻塞逻辑,和OpenCV的waitKey()属于不同输入处理渠道。如果你的程序是基于OpenCV窗口的GUI应用,用户在窗口内按键不会被input()捕获,必须切换到终端操作,体验极差,还可能导致OpenCV窗口假死。

  • 第二种直接判断kk == ord('c'):
    此时kk的值是s的键码(ord('s')),不可能等于ord('c'),这个判断永远不会触发,根本等不到用户按c键。

正确实现方式

方式1:按任意键继续

执行完do stuff后,循环调用cv2.waitKey(),直到捕获到任意有效按键(waitKey()返回-1表示无按键输入):

import cv2

while True:
    kk = cv2.waitKey(1)
    # 处理窗口关闭事件,避免死循环
    if cv2.getWindowProperty('my_window', cv2.WND_PROP_VISIBLE) < 1:
        break
    if kk == ord('s'):
        # Do stuff
        print("执行完do stuff,按任意键继续")
        # 等待任意按键
        while True:
            key = cv2.waitKey(1)
            if cv2.getWindowProperty('my_window', cv2.WND_PROP_VISIBLE) < 1:
                break
            if key != -1:
                # Do more stuff
                print("执行do more some stuff")
                break

方式2:按特定键(比如c)继续

逻辑和上面类似,但只捕获指定按键:

import cv2

while True:
    kk = cv2.waitKey(1)
    if cv2.getWindowProperty('my_window', cv2.WND_PROP_VISIBLE) < 1:
        break
    if kk == ord('s'):
        # Do stuff
        print("执行完do stuff,按c键继续")
        # 等待c键
        while True:
            key = cv2.waitKey(1)
            if cv2.getWindowProperty('my_window', cv2.WND_PROP_VISIBLE) < 1:
                break
            if key == ord('c'):
                # Do more stuff
                print("执行do more some stuff")
                break

注意事项

  • 替换代码里的my_window为你实际创建的OpenCV窗口名称(比如cv2.namedWindow("demo")里的demo)。
  • 必须加入窗口关闭判断,否则关闭窗口后程序会持续运行死循环。
  • cv2.waitKey(1)的参数是等待时间(毫秒),1表示非阻塞式轮询,既不会卡住程序,又能响应按键和窗口事件。

内容的提问来源于stack exchange,提问作者aekiratli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 12:21:49