# micro_gestures.py # routines for detecting single-frame micro-gestures from utils import distance_between_points, is_finger_extended def fist_closed(landmarks): # all fingers curled into palm return all(not is_finger_extended(landmarks, finger=f) for f in ["thumb","index","middle","ring","pinky"]) def palm_open(landmarks): # all fingers extended return all(is_finger_extended(landmarks, finger=f) for f in ["thumb","index","middle","ring","pinky"]) def index_pointing_up(landmarks): # only index extended up return is_finger_extended(landmarks, "index", "up") and all(not is_finger_extended(landmarks,f) for f in ["thumb","middle","ring","pinky"]) def v_sign(landmarks): # index and middle extended, others curled return is_finger_extended(landmarks, "index") and is_finger_extended(landmarks, "middle") and all(not is_finger_extended(landmarks,f) for f in ["thumb","ring","pinky"]) def thumb_up(landmarks): # thumb up, others curled return is_finger_extended(landmarks,"thumb","up") and all(not is_finger_extended(landmarks,f) for f in ["index","middle","ring","pinky"]) def thumb_side(landmarks): # thumb horizontal, others curled return is_finger_extended(landmarks,"thumb") and all(not is_finger_extended(landmarks,f) for f in ["index","middle","ring","pinky"]) def pinky_up(landmarks): # only pinky extended up return is_finger_extended(landmarks,"pinky","up") and all(not is_finger_extended(landmarks,f) for f in ["thumb","index","middle","ring"]) def four_fingers(landmarks): # four fingers extended, thumb curled return all(is_finger_extended(landmarks,f) for f in ["index","middle","ring","pinky"]) and not is_finger_extended(landmarks,"thumb") def ok_sign(landmarks): # thumb and index touching, others extended thumb_tip = landmarks[4] index_tip = landmarks[8] return distance_between_points(thumb_tip,index_tip) < 0.05 and all(is_finger_extended(landmarks,f) for f in ["middle","ring","pinky"]) def palm_inward(landmarks): # palm facing body (approximate using wrist-middle_finger vector) wrist = landmarks[0] mcp = landmarks[9] vector_y = mcp[1] - wrist[1] return vector_y > 0 # palm facing down or inward