如何基于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
相关产品推荐
相关产品推荐

