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

相关推荐
ComputerInBook5 小时前
数字图像处理(4版)——第 7 章——小波及其它图像变换(下)(Rafael C.Gonzalez&Richard E. Woods)
图像处理·计算机视觉·小波变换
ComputerInBook5 小时前
数字图像处理(4版)——第 8 章——图像压缩与水印(上)(Rafael C.Gonzalez&Richard E. Woods)
人工智能·算法·计算机视觉·图像压缩·图像水印
Li emily5 小时前
港股api接入指南:实时行情与历史数据获取
python·api·fastapi
AI技术增长5 小时前
Pytorch图像去噪实战(十三):DDIM加速扩散模型采样,让去噪从1000步降到50步
人工智能·pytorch·python
刀法如飞5 小时前
Python列表去重:从新手三连到高阶特技,20种解法全收录
python·算法·编程语言
小糖学代码5 小时前
LLM系列:1.python入门:16.正则表达式与文本处理 (re)
人工智能·pytorch·python·深度学习·神经网络·正则表达式
清水白石0086 小时前
从“类型体操”到工程设计:用 Python 解释协变、逆变与不变
网络·windows·python
Ai173163915796 小时前
10大算力芯片某某XXU全解析:CPU/GPU/TPU/NPU/LPU/FPGA/RPU/BPU/DPU/GPGPU
大数据·图像处理·人工智能·深度学习·计算机视觉·自动驾驶·知识图谱
hrhcode6 小时前
【LangGraph】四.持久化:保存和恢复执行状态
python·ai·langchain·agent·langgraph
xxyy8886 小时前
关于labelimg安装后在标注过程中闪退和死机的问题处理
开发语言·python