基于MediaPipe实现人体姿态与脸部关键点检测
在计算机视觉领域人体姿态检测和脸部关键点检测是应用广泛的技术方向无论是直播美颜、运动分析还是人机交互都能看到它们的身影。MediaPipe作为Google开源的多媒体处理框架提供了开箱即用的姿态和人脸检测解决方案极大降低了开发门槛。本文将详细介绍如何使用MediaPipe结合OpenCV实现人体姿态检测和脸部关键点检测。一、环境准备在开始编码前需要先安装相关依赖库pip install opencv-python mediapipe• opencv-python用于图像/视频的读取、处理和显示• mediapipe提供预训练的姿态检测和人脸关键点检测模型。二、人体姿态检测实现1. 核心原理MediaPipe的Pose模型可以检测人体33个关键节点如鼻子、肩膀、手肘、膝盖等返回每个节点的三维坐标x/y/z并支持关键点平滑、人体抠图等功能。2. 完整代码实现import cv2 import mediapipe as mp if __name__ __main__: # 初始化MediaPipe Pose模块 mp_pose mp.solutions.pose # 配置Pose模型参数 pose mp_pose.Pose( static_image_modeTrue, # 静态图像模式处理单张图片 model_complexity1, # 模型复杂度0快/精度低、1平衡、2慢/精度高 smooth_landmarksTrue, # 平滑关键点减少抖动 min_detection_confidence0.5, # 检测置信度阈值 min_tracking_confidence0.5 # 跟踪置信度阈值 ) # 初始化绘图工具 drawing mp.solutions.drawing_utils # 读取图像并转换颜色空间OpenCV默认BGRMediaPipe需要RGB img cv2.imread(1111.png) cv2.imshow(input, img) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 处理图像获取姿态关键点 results pose.process(img_rgb) # 将图像转回BGR格式用于OpenCV显示 img_bgr cv2.cvtColor(img_rgb, cv2.COLOR_RGB2BGR) # 输出关键点数量并打印每个关键点的三维坐标 if results.pose_landmarks: print(f人体姿态关键点数量{len(results.pose_landmarks.landmark)}) for i in range(len(results.pose_landmarks.landmark)): x results.pose_landmarks.landmark[i].x # 归一化x坐标0-1 y results.pose_landmarks.landmark[i].y # 归一化y坐标0-1 z results.pose_landmarks.landmark[i].z # 归一化z坐标深度 print(f关键点{i}x{x:.4f}, y{y:.4f}, z{z:.4f}) # 绘制关键点和连接线条 drawing.draw_landmarks(img_bgr, results.pose_landmarks, mp_pose.POSE_CONNECTIONS) # 显示结果图像 cv2.imshow(keypoint, img_bgr) # 绘制3D姿态关键点单独窗口 drawing.plot_landmarks(results.pose_world_landmarks, mp_pose.POSE_CONNECTIONS) # 等待按键后释放资源 cv2.waitKey(0) cv2.destroyAllWindows()3. 关键参数说明• static_image_mode是否为静态图像模式处理单张图片时设为True处理视频流时设为False• model_complexity模型复杂度取值0/1/2数值越大精度越高但速度越慢• smooth_landmarks是否平滑关键点减少检测结果的抖动• min_detection_confidence检测置信度阈值低于该值的检测结果会被忽略• min_tracking_confidence视频流跟踪置信度阈值低于该值会重新触发检测。三、脸部关键点检测实时摄像头版1. 核心原理MediaPipe的Face Mesh模型可以检测人脸478个关键点覆盖眼睛、鼻子、嘴巴、脸颊等区域支持多脸检测适合实时处理摄像头画面。2. 完整代码实现import cv2 import mediapipe as mp # 初始化MediaPipe Face Mesh模块 mp_face_mesh mp.solutions.face_mesh mp_drawing mp.solutions.drawing_utils mp_drawing_styles mp.solutions.drawing_styles # 配置Face Mesh参数 face_mesh mp_face_mesh.FaceMesh( static_image_modeFalse, # 视频流模式 max_num_faces2, # 最多检测2张人脸 refine_landmarksTrue, # 细化关键点提升眼睛/嘴唇区域精度 min_detection_confidence0.5, # 检测置信度阈值 min_tracking_confidence0.5 # 跟踪置信度阈值 ) # 打开摄像头0表示默认摄像头 cap cv2.VideoCapture(0) while cap.isOpened(): success, frame cap.read() if not success: print(无法读取摄像头画面) break h, w frame.shape[:2] # 获取画面宽高 # 转换颜色空间BGR→RGB frame_rgb cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) # 处理画面获取人脸关键点 results face_mesh.process(frame_rgb) # 绘制人脸关键点 if results.multi_face_landmarks: for face_landmarks in results.multi_face_landmarks: # 打印关键点数量固定478个 # print(f人脸关键点数量{len(face_landmarks.landmark)}) # 绘制每个关键点的编号 for i in range(len(face_landmarks.landmark)): x face_landmarks.landmark[i].x y face_landmarks.landmark[i].y # 将归一化坐标转换为像素坐标 px int(x * w) py int(y * h) # 在画面上绘制关键点编号 cv2.putText(frame, str(i), (px, py), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 255, 0), 1) # 绘制人脸网格三角剖分 mp_drawing.draw_landmarks( imageframe, landmark_listface_landmarks, connectionsmp_face_mesh.FACEMESH_TESSELATION, landmark_drawing_specNone, connection_drawing_specmp_drawing_styles.get_default_face_mesh_tesselation_style() ) # 显示结果画面 cv2.imshow(Face Mesh, frame) # 按ESC键退出27是ESC的ASCII码 if cv2.waitKey(1) 27: break # 释放摄像头资源并关闭窗口 cap.release() cv2.destroyAllWindows()3. 关键功能说明• max_num_faces设置最多检测的人脸数量适合多人场景• refine_landmarks开启后会细化眼睛和嘴唇区域的关键点提升精度• FACEMESH_TESSELATION绘制人脸三角网格直观展示关键点连接关系• 关键点编号绘制通过cv2.putText在每个关键点位置标注编号便于后续针对性处理如定位眼睛、嘴巴。四、扩展与优化1. 视频文件处理将摄像头读取cv2.VideoCapture(0)改为视频文件路径cv2.VideoCapture(video.mp4)即可处理本地视频2. 关键点应用◦ 姿态检测可提取特定关键点如肩膀、膝盖分析人体动作如深蹲、俯卧撑计数◦ 人脸检测可基于眼睛关键点实现眨眼检测基于嘴巴关键点实现表情识别3. 性能优化◦ 降低模型复杂度如姿态检测设model_complexity0提升实时性◦ 缩小输入图像尺寸如cv2.resize减少计算量4. 结果保存使用cv2.imwrite保存检测后的图片或cv2.VideoWriter保存视频流结果。五、总结MediaPipe结合OpenCV提供了简洁高效的姿态和人脸检测方案无需手动训练模型仅需几行代码即可实现高精度的关键点检测。无论是快速原型验证还是实际项目开发这套组合都能大幅提升开发效率。希望本文能帮助大家快速上手MediaPipe解锁更多计算机视觉应用场景。