1. 引言
MediaPipe 是 Google 开源的跨平台机器学习解决方案框架,内置了人体姿态估计、面部网格、手势识别等多项能力。本文基于两段可运行的 Python 代码,分别演示如何利用 MediaPipe 完成人体姿态关键点检测 和面部 468 点网格实时绘制,并逐行讲解核心参数与实现细节,帮助读者快速上手并理解背后的原理。
2. 环境准备
在运行代码之前,需要安装以下依赖:
bash
pip install opencv-python mediapipe
建议使用 Python 3.8 及以上版本。MediaPipe 会自动下载对应的模型文件,首次运行时会稍慢,属正常现象。
3. 人体姿态估计:关键点检测与绘制
第一段代码使用 mp.solutions.pose 完成人体姿态估计,输出 33 个关键点的三维坐标,并在原图上绘制骨架连线。
3.1 核心参数解析
mp_pose.Pose() 构造函数支持以下关键参数:
| 参数 | 作用 | 说明 |
|---|---|---|
static_image_mode |
静态图像还是连续帧视频 | 处理单张图片设为 True,处理视频流设为 False |
model_complexity |
模型复杂度 | 0 速度最快精度最低,1 居中,2 速度最慢精度最高 |
smooth_landmarks |
是否平滑关键点 | 视频流中建议开启,减少抖动 |
enable_segmentation |
是否对人体进行抠图 | 开启后可获取人体分割掩码 |
min_detection_confidence |
检测置信度阈值 | 低于该值视为未检测到人体 |
min_tracking_confidence |
帧间跟踪置信度阈值 | 低于该值会重新执行检测 |
3.2 图像处理流程
代码的核心流程如下:
- 使用
cv2.imread读取图片,此时图像为 BGR 颜色空间。 - 通过
cv2.cvtColor将 BGR 转换为 RGB,因为 MediaPipe 期望 RGB 输入。 - 调用
pose.process(img)执行推理,得到关键点结果。 - 将图像转换回 BGR,以便 OpenCV 正常显示。
- 遍历
results.pose_landmarks.landmark,输出每个关键点的 x、y、z 坐标。 - 使用
drawing.draw_landmarks绘制关键点和骨架连线。
3.3 关键点坐标说明
每个关键点包含三个坐标分量:
- x、y:归一化坐标,取值范围为 0 到 1,表示相对图像宽高的比例。
- z:深度信息,以臀部中心为原点,值越小表示离相机越近。
实际绘制时,需要将归一化坐标乘以图像宽高才能得到像素坐标。
4. 面部网格:468 点实时检测
第二段代码使用 mp.solutions.face_mesh 从摄像头实时检测面部关键点,最多支持 2 张人脸,并绘制细密的三角网格。
4.1 FaceMesh 参数说明
| 参数 | 作用 | 说明 |
|---|---|---|
static_image_mode |
静态图像还是视频流 | 视频流设为 False,启用跟踪提升速度 |
max_num_faces |
最大检测人脸数 | 示例中设为 2 |
refine_landmarks |
是否细化关键点 | 开启后关键点从 468 增至 478,包含瞳孔中心 |
min_detection_confidence |
检测置信度阈值 | 低于该值视为未检测到人脸 |
min_tracking_confidence |
帧间跟踪置信度阈值 | 低于该值会重新执行检测 |
4.2 实时视频处理流程
代码通过 cv2.VideoCapture(0) 打开默认摄像头,进入循环逐帧处理:
- 读取一帧画面,获取宽高
h、w。 - 将 BGR 帧转换为 RGB,交给
face_mesh.process推理。 - 若检测到人脸,遍历
multi_face_landmarks,对每个关键点用cv2.putText标注序号。 - 使用
draw_landmarks绘制三角网格,连接方式为FACEMESH_TESSELATION。 - 按
Esc键退出循环,释放摄像头资源。
4.3 关键点序号可视化
代码中通过 cv2.putText 将每个关键点的索引号直接绘制在对应位置,方便开发者对照官方文档查阅特定区域(如眼睛、嘴唇)的关键点编号,是调试和理解 FaceMesh 输出的实用技巧。
5. 常见问题与优化建议
- 检测不到人体或人脸 :适当降低
min_detection_confidence,或保证光线充足、目标位于画面中央。 - 视频卡顿 :将
model_complexity降为 0,或缩小输入帧尺寸。 - 关键点抖动 :视频流中保持
smooth_landmarks=True,并开启跟踪模式。 - 内存占用过高:处理完每帧后及时释放不再使用的变量,避免在循环中重复创建对象。
6. 总结
本文通过两段完整代码,演示了 MediaPipe 在人体姿态估计和面部网格两个方向上的基本用法。姿态估计输出 33 个三维关键点,面部网格输出 468 个精细关键点,两者都遵循「BGR 转 RGB、推理、绘制、显示」的统一流程。掌握参数含义和坐标归一化规则后,读者可以进一步扩展实现动作识别、表情捕捉、虚拟形象驱动等更复杂的应用。