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

如何通过食指长按cv2.rectangle绘制的按钮实现颜色永久切换

实现自定义按钮长按4秒切换颜色的方案

核心思路

新增3个状态变量记录按钮状态、手指进入区域的时间、上次切换的时间戳,每一帧判断手指停留时长,达到4秒阈值后翻转按钮颜色状态,绘制按钮时直接读取状态值确定填充色,不需要每次判断手指位置临时改颜色。

实现步骤

  1. 导入时间模块,初始化状态变量
    • button_is_green:布尔值,默认False代表当前按钮为紫色,True代表当前按钮为绿色
    • enter_button_time:初始为None,记录食指指尖刚进入按钮区域的时间戳
    • last_switch_time:初始为0,用于防抖,避免短时间内重复触发切换
  2. 每一帧先判断食指是否在按钮区域
    • 若在区域内:如果enter_button_time为空就赋值当前时间戳;计算当前时间与进入时间的差值,差值≥4秒且距离上次切换超过1秒时,翻转button_is_green的取值,更新上次切换时间
    • 若不在区域内:直接把enter_button_time重置为None,下次进入重新计时
  3. 绘制按钮时直接根据button_is_green的取值选择对应填充色即可

完整代码示例

import cv2
import time

# 初始化状态变量
button_is_green = False
enter_button_time = None
last_switch_time = 0

# 以下是你的每一帧循环逻辑,替换原有代码即可
while True:
    # 此处省略你原有获取image、识别手部关键点的代码
    # ...

    # 食指指尖检测(你原有逻辑)
    thumb = res.right_hand_landmarks[8]
    # 判断是否在按钮区域
    in_button_area = (thumb.x < 0.40 and thumb.x >= 0.30) and (thumb.y < 0.69 and thumb.y >= 0.64)

    current_time = time.time()
    if in_button_area:
        if enter_button_time is None:
            enter_button_time = current_time
        else:
            # 停留满4秒且距离上次切换超过1秒才触发
            if current_time - enter_button_time >=4 and current_time - last_switch_time > 1:
                button_is_green = not button_is_green
                last_switch_time = current_time
    else:
        # 离开区域重置计时
        enter_button_time = None

    # 绘制按钮
    color = (0, 255, 0) if button_is_green else (255, 0, 255)
    cv2.rectangle(image, (100, 300), (200, 200), color, cv2.FILLED)

    # 此处省略你原有展示画面、退出循环的代码
    # ...

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 02:27:02