在计算机视觉领域,人体姿态检测和脸部关键点检测是应用广泛的技术方向,无论是直播美颜、运动分析还是人机交互,都能看到它们的身影。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_mode=True, # 静态图像模式(处理单张图片) model_complexity=1, # 模型复杂度:0(快/精度低)、1(平衡)、2(慢/精度高) smooth_landmarks=True, # 平滑关键点,减少抖动 min_detection_confidence=0.5, # 检测置信度阈值 min_tracking_confidence=0.5 # 跟踪置信度阈值 ) # 初始化绘图工具 drawing = mp.solutions.drawing_utils # 读取图像并转换颜色空间(OpenCV默认BGR,MediaPipe需要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_mode=False, # 视频流模式 max_num_faces=2, # 最多检测2张人脸 refine_landmarks=True, # 细化关键点(提升眼睛/嘴唇区域精度) min_detection_confidence=0.5, # 检测置信度阈值 min_tracking_confidence=0.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( image=frame, landmark_list=face_landmarks, connections=mp_face_mesh.FACEMESH_TESSELATION, landmark_drawing_spec=None, connection_drawing_spec=mp_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_complexity=0)提升实时性;
◦ 缩小输入图像尺寸(如cv2.resize)减少计算量;
4. 结果保存:使用cv2.imwrite保存检测后的图片,或cv2.VideoWriter保存视频流结果。
五、总结
MediaPipe结合OpenCV提供了简洁高效的姿态和人脸检测方案,无需手动训练模型,仅需几行代码即可实现高精度的关键点检测。无论是快速原型验证还是实际项目开发,这套组合都能大幅提升开发效率。希望本文能帮助大家快速上手MediaPipe,解锁更多计算机视觉应用场景。