如何通过食指长按cv2.rectangle绘制的按钮实现颜色永久切换
实现自定义按钮长按4秒切换颜色的方案
核心思路
新增3个状态变量记录按钮状态、手指进入区域的时间、上次切换的时间戳,每一帧判断手指停留时长,达到4秒阈值后翻转按钮颜色状态,绘制按钮时直接读取状态值确定填充色,不需要每次判断手指位置临时改颜色。
实现步骤
- 导入时间模块,初始化状态变量
button_is_green:布尔值,默认False代表当前按钮为紫色,True代表当前按钮为绿色enter_button_time:初始为None,记录食指指尖刚进入按钮区域的时间戳last_switch_time:初始为0,用于防抖,避免短时间内重复触发切换
- 每一帧先判断食指是否在按钮区域
- 若在区域内:如果
enter_button_time为空就赋值当前时间戳;计算当前时间与进入时间的差值,差值≥4秒且距离上次切换超过1秒时,翻转button_is_green的取值,更新上次切换时间 - 若不在区域内:直接把
enter_button_time重置为None,下次进入重新计时
- 若在区域内:如果
- 绘制按钮时直接根据
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
相关产品推荐
相关产品推荐

