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