OpenCV案例——手部检测

发布时间:2026/7/18 22:18:14
OpenCV案例——手部检测 一、项目概述MediaPipe Hands 是谷歌开源的轻量级手部关键点检测方案单帧即可输出 21 个手部三维归一化坐标无需复杂环境配置仅依靠 OpenCV 就能实现摄像头实时手部识别、关键点标注打印。 本文提供完整可运行代码附带全部参数详解、代码逐行注释新手开箱即用。二、关键点说明MediaPipe 标准 21 点0手腕1-4大拇指掌根→指尖5-8食指9-12中指13-16无名指17-20小拇指 可根据对应关键点坐标差值判断手指伸直、握拳、OK、剪刀手等各类手势。二、代码实现import cv2 import mediapipe as mp # pip install mediapipe0.10.21 mp_drawing mp.solutions.drawing_utils mp_hands mp.solutions.hands hands mp_hands.Hands( static_image_modeFalse, max_num_hands2, min_detection_confidence0.75, min_tracking_confidence0.75) cap cv2.VideoCapture(0) while True: ret, frame cap.read() h,wframe.shape[:2] frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 因为摄像头是镜像的所以将摄像头水平翻转 # 不是镜像的可以不翻转 frame cv2.flip(frame, 1) results hands.process(frame) frame cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: # print(hand_landmarks:, hand_landmarks) # 计算关键点的距离用于判断手指是否伸直 for i in range(len(hand_landmarks.landmark)): x hand_landmarks.landmark[i].x y hand_landmarks.landmark[i].y z hand_landmarks.landmark[i].z print(f关键点{i},x,y,z) cv2.putText(frame, str(i), (int(x*w),int(y*h)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0),2) # 关键点可视化 mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS) cv2.imshow(MediaPipe Hands, frame) if cv2.waitKey(1) 0xFF 27: break cap.release() cv2.destroyAllWindows()1.导入函数依赖库注意本案例使用的mediapipe库是0.10.21版本import cv2 import mediapipe as mp # pip install mediapipe0.10.212.初始化MediaPipe工具对象mp_drawing mp.solutions.drawing_utils mp_hands mp.solutions.handsmp_drawing绘图工具专门用来在图像上绘制手部21个关键点、手指连接线mp_hands手部检测核心模块后续通过它创建手部检测器实例3.创建手部检测器实例hands mp_hands.Hands( static_image_modeFalse, max_num_hands2, min_detection_confidence0.75, min_tracking_confidence0.75)static_image_modeFalse视频流模式开启手部跟踪速度更快max_num_hands2画面最多同时识别两只手min_detection_confidence0.75手部存在判定阈值低于0.75直接忽略min_tracking_confidence0.75跟踪置信度保证手部不会轻易丢失4.主循环持续读取摄像头画面ret, frame cap.read() h,wframe.shape[:2] frame cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) frame cv2.flip(frame, 1) results hands.process(frame) frame cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)对每一帧进行灰度化、翻转等预处理if results.multi_hand_landmarks: for hand_landmarks in results.multi_hand_landmarks: # print(hand_landmarks:, hand_landmarks) for i in range(len(hand_landmarks.landmark)): x hand_landmarks.landmark[i].x y hand_landmarks.landmark[i].y z hand_landmarks.landmark[i].z print(f关键点{i},x,y,z) cv2.putText(frame, str(i), (int(x*w),int(y*h)), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0),2) mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)遍历画面中每一只手的全部关键点计算关键点的距离用于判断手指是否伸直提取归一化三维坐标绘制手部骨架连线