文档
MediaPipe 实时手势关键点追踪
目标
用 MediaPipe Hands 实时检测手掌 21 个关键点,在摄像头画面上绘制骨架连线。
完整代码
import cv2
import mediapipe as mp
# ─── 1. 初始化 ───
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
hands = mp_hands.Hands(
static_image_mode=False, # 视频流模式
max_num_hands=2, # 最多 2 只手
min_detection_confidence=0.7,
min_tracking_confidence=0.7,
)
cap = cv2.VideoCapture(0)
while cap.isOpened():
success, frame = cap.read()
if not success:
break
# BGR → RGB
rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
results = hands.process(rgb)
# ─── 2. 绘制关键点 ───
if results.multi_hand_landmarks:
for hand_landmarks in results.multi_hand_landmarks:
# 画骨架连线
mp_drawing.draw_landmarks(
frame,
hand_landmarks,
mp_hands.HAND_CONNECTIONS,
mp_drawing_styles.get_default_hand_landmarks_style(),
mp_drawing_styles.get_default_hand_connections_style(),
)
# ─── 3. 识别手势 ───
landmarks = hand_landmarks.landmark
# 拇指尖 (4) 高于食指尖 (8) = 竖拇指
if landmarks[4].y < landmarks[8].y and landmarks[4].y < landmarks[12].y:
cv2.putText(frame, "Thumbs Up!", (50, 50),
cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 3)
# FPS 显示
cv2.putText(frame, "Press 'q' to quit", (10, frame.shape[0] - 10),
cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1)
cv2.imshow("MediaPipe Hands - Real-time", frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
运行步骤
pip install mediapipe opencv-python
python hand_tracking.py
# 对着摄像头比手势,按 'q' 退出
预期效果
- 实时显示手掌 21 个关键点(指尖、关节、手腕)
- 各手指骨架连线以不同颜色显示
- 竖大拇指时画面显示 "Thumbs Up!"
- 稳定 30 FPS(取决于硬件)