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

如何基于OpenCV、PyAutoGUI及HandDetector实现双击功能?

基于OpenCV和手部追踪的双击功能实现

实现思路

通过手部关键点检测,以食指与中指的捏合动作作为单次点击触发条件,再通过时间间隔判断实现双击:

  • 利用HandDetector类识别手部关键点,计算食指(ID=8)和中指(ID=12)指尖的距离,当距离小于设定阈值时,判定为一次点击。
  • 记录每次点击的时间戳,若两次点击的时间间隔在0.5秒以内,则触发系统双击操作(通过pyautogui.doubleClick()实现)。
  • 添加状态标记,避免单次捏合被重复判定为多次点击。

完整代码

import cv2
import pyautogui
from HandTracker import HandDetector
import math
import time

# 初始化参数
CLICK_THRESHOLD = 30  # 指尖距离阈值,小于此值判定为点击
DOUBLE_CLICK_INTERVAL = 0.5  # 双击时间间隔阈值(秒)
last_click_time = 0
is_clicked = False

cap = cv2.VideoCapture(0)
detector = HandDetector(detectionConfidence=0.7, trackingConfidence=0.7)

while True:
    success, img = cap.read()
    img = detector.findHands(img)
    lmList, bbox = detector.findPosition(img, draw=False)
    
    if lmList:
        # 获取食指和中指指尖坐标
        x1, y1 = lmList[8][1], lmList[8][2]
        x2, y2 = lmList[12][1], lmList[12][2]
        
        # 计算指尖距离
        length = math.hypot(x2 - x1, y2 - y1)
        
        # 绘制指尖连线和关键点(可选)
        cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
        cv2.circle(img, (x1, y1), 8, (255, 0, 0), cv2.FILLED)
        cv2.circle(img, (x2, y2), 8, (255, 0, 0), cv2.FILLED)
        
        # 判定单次点击
        if length < CLICK_THRESHOLD and not is_clicked:
            is_clicked = True
            current_time = time.time()
            
            # 判断是否为双击
            if current_time - last_click_time < DOUBLE_CLICK_INTERVAL:
                pyautogui.doubleClick()
                cv2.putText(img, "双击触发", (50, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)
            else:
                cv2.putText(img, "单次点击", (50, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
            
            last_click_time = current_time
        elif length >= CLICK_THRESHOLD and is_clicked:
            # 松开后重置点击状态
            is_clicked = False
    
    # 显示帧率
    current_frame_time = time.time()
    fps = 1 / (current_frame_time - last_click_time if current_frame_time != last_click_time else 1)
    cv2.putText(img, f"FPS: {int(fps)}", (20, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 255), 2)
    
    cv2.imshow("双击控制窗口", img)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

注意事项

  • 确保HandDetector.py文件与主代码在同一目录下,且已正确安装依赖包(mediapipe、numpy需额外安装)。
  • 可根据实际使用场景调整CLICK_THRESHOLD和DOUBLE_CLICK_INTERVAL参数,优化检测灵敏度。
  • 使用时保持手部在摄像头视野内,避免光线过暗影响检测精度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 16:25:25