基于 MediaPipe 实现实时面部关键点检测

1. 环境准备

首先安装所需依赖库:

python 复制代码
pip install opencv-python mediapipe

2. 完整代码

python 复制代码
import cv2
import mediapipe as mp
# 初始化 Mediapipe 模块
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,
   refine_landmarks=True,
   min_detection_confidence=0.5,
   min_tracking_confidence=0.5
)
# 打开摄像头
cap = cv2.VideoCapture(0)
while cap.isOpened():
   success, frame = cap.read()
   h, w = frame.shape[:2]
   if not success:
       print("无法读取摄像头画面")
       break
   # 转换颜色空间
   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:
           print(len(face_landmarks.landmark))    # 478
           for i in range(len(face_landmarks.landmark)):
               x = face_landmarks.landmark[i].x
               y = face_landmarks.landmark[i].y
               # z = face_landmarks.landmark[i].z
               # print(x,y,z)
               cv2.putText(frame, str(i), (int(x * w), int(y * h)), cv2.FONT_HERSHEY_SIMPLEX, 0.3, (0, 255, 0), 2)
           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)
   if cv2.waitKey(1)==27:
       break
cap.release()
cv2.destroyAllWindows()

3. 关键代码解析

(1)Face Mesh 参数配置

  • static_image_mode:False 表示视频流模式(适合实时检测),True 适合单张图片检测

  • max_num_faces:设置最大检测人脸数,根据需求调整(建议 1-5)

  • refine_landmarks:开启后会提升眼睛、嘴唇等精细区域的关键点精度

  • 置信度阈值:过低会导致误检,过高会漏检,建议 0.5-0.7

(2)坐标转换逻辑

MediaPipe 输出的关键点包含三维坐标(x/y/z),均为归一化值(0-1):

  • x:水平方向坐标,0 为最左侧,1 为最右侧

  • y:垂直方向坐标,0 为最顶部,1 为最底部

  • z:深度坐标,以人脸中心点为原点,值越小表示越靠近摄像头(单位:米)

MediaPipe 输出的关键点坐标是归一化值(0-1),需要转换为像素坐标才能在画面上显示

python 复制代码
px = int(x * w)  # 归一化x坐标 × 画面宽度 = 像素x坐标
py = int(y * h)  # 归一化y坐标 × 画面高度 = 像素y坐标

(3)关键点标注与网格绘制

  • cv2.putText:在每个关键点位置绘制序号,方便识别关键点对应区域

  • mp_drawing.draw_landmarks:绘制面部网格连线,直观展示面部轮廓

相关推荐
IT_Octopus2 小时前
【零基础入门 LLM 开发 · Day 13】:LangChain 的对话记忆——Message 对象版
人工智能·python·langchain
2603_965148112 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
CCblandy4 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
硅谷秋水4 小时前
CommitFlow:面向长时程机器人操作 VLA 执行的语义承诺验证与局部修正
机器学习·计算机视觉·语言模型·机器人
Cc.Y4 小时前
Java零基础入门:深入Java核心:文件IO与序列化全解
java·开发语言·python
拿本唠嗑AI研究5 小时前
本体工程实战指南:从建模到可维护的完整落地路径
java·人工智能·python·jena·ontology
Smoothcloud润云5 小时前
PyTorch推理服务模型热切换与失败回滚实战:降低版本更新中断
服务器·人工智能·pytorch·python·深度学习·gpu
jsjzsl25 小时前
递归自改进系统(RSI)的本质是自发对称破缺:智能爆炸有界—— AI研发切记盲目投入
人工智能·python·算法
2601_954811825 小时前
机器视觉教学套件选型指南:五维技术参数对比与课程体系评估
python·数码相机
小马不起床6 小时前
零基础玩转 FastAPI_05:后端课程模块
python·fastapi