基于 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:绘制面部网格连线,直观展示面部轮廓

相关推荐
星越华夏21 小时前
计算机视觉:YOLOv12安装环境
人工智能·yolo·计算机视觉
wj3055853781 天前
课程 9:模型测试记录与 Prompt 策略
linux·人工智能·python·comfyui
星寂樱易李1 天前
iperf3 + Python-- 网络带宽、网速、网络稳定性
开发语言·网络·python
qingfeng154151 天前
企业微信机器人开发:如何实现自动化与智能运营?
人工智能·python·机器人·自动化·企业微信
彦为君1 天前
Agent 安全:从权限提示到沙箱隔离
python·ai·ai编程
PILIPALAPENG1 天前
Python 语法速成指南:前端开发者视角(JS 类比版)
前端·人工智能·python
Terrence Shen1 天前
大模型部署工具对比
人工智能·深度学习·计算机视觉
用户8356290780511 天前
Python 操作 PowerPoint 页眉与页脚指南
后端·python
枫叶林FYL1 天前
项目九:异步高性能爬虫与数据采集中枢 —— 基于 Crawl<sub>4</sub>AI 与 Playwright 的现代化数据采集平台 项目总览
爬虫·python·深度学习·wpf