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

相关推荐
AI探索者20 小时前
LangGraph StateGraph 实战:状态机聊天机器人构建指南
python
AI探索者20 小时前
LangGraph 入门:构建带记忆功能的天气查询 Agent
python
FishCoderh21 小时前
Python自动化办公实战:批量重命名文件,告别手动操作
python
躺平大鹅21 小时前
Python函数入门详解(定义+调用+参数)
python
曲幽1 天前
我用FastAPI接ollama大模型,差点被asyncio整崩溃(附对话窗口实战)
python·fastapi·web·async·httpx·asyncio·ollama
两万五千个小时1 天前
落地实现 Anthropic Multi-Agent Research System
人工智能·python·架构
CoovallyAIHub1 天前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
从春晚机器人到零样本革命:YOLO26-Pose姿态估计实战指南
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
Le-DETR:省80%预训练数据,这个实时检测Transformer刷新SOTA|Georgia Tech & 北交大
深度学习·算法·计算机视觉
CoovallyAIHub1 天前
强化学习凭什么比监督学习更聪明?RL的“聪明”并非来自算法,而是因为它学会了“挑食”
深度学习·算法·计算机视觉