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

相关推荐
Csvn2 天前
🌟 LangChain 30 天保姆级教程 · Day 13|OutputParser 进阶!让 AI 输出自动转为结构化对象,并支持自动重试!
python·langchain
cch89182 天前
Python主流框架全解析
开发语言·python
sg_knight2 天前
设计模式实战:状态模式(State)
python·ui·设计模式·状态模式·state
好运的阿财2 天前
process 工具与子agent管理机制详解
网络·人工智能·python·程序人生·ai编程
张張4082 天前
(域格)环境搭建和编译
c语言·开发语言·python·ai
weixin_423533992 天前
【Windows11离线安装anaconda、python、vscode】
开发语言·vscode·python
Ricky111zzz2 天前
leetcode学python记录1
python·算法·leetcode·职场和发展
小白学大数据2 天前
Selenium+Python 爬虫:动态加载头条问答爬取
爬虫·python·selenium
Hui Baby2 天前
springboot读取配置文件
后端·python·flask
阿Y加油吧2 天前
回溯法经典难题:N 皇后问题 深度解析 + 二分查找入门(搜索插入位置)
开发语言·python