You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取MediaPipe FACEMESH_IRISES各虹膜关键点的实际坐标

问题描述

使用MediaPipe检测静态图像人眼虹膜坐标时,执行print('', face_landmarks)可输出所有人脸关键点的x、y、z坐标,但执行print('', mp_face_mesh.FACEMESH_IRISES)仅返回如下虹膜关键点的连接索引集合:

frozenset({(475, 476), (477, 474), (469, 470), (472, 469), (471, 472), (474, 475), (476, 477), (470, 471)})

需要通过上述索引获取每个虹膜关键点对应的实际坐标,现有实现代码如下:

from multiprocessing import connection
import cv2
import mediapipe as mp
import sys
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_face_mesh = mp.solutions.face_mesh
IMAGE_FILES = [("pic1.jpg")]
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
with mp_face_mesh.FaceMesh(
    static_image_mode=True,
    max_num_faces=1,
    refine_landmarks=True,
    min_detection_confidence=0.5) as face_mesh:
  for idx, file in enumerate(IMAGE_FILES):
    image = cv2.imread(file)
    results = face_mesh.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
    if not results.multi_face_landmarks:
      continue
    annotated_image = image.copy()
    for face_landmarks in results.multi_face_landmarks:
      mp_drawing.draw_landmarks(
          image=annotated_image,
          landmark_list=face_landmarks,   
          connections=mp_face_mesh.FACEMESH_IRISES,
          landmark_drawing_spec=None,
          connection_drawing_spec=mp_drawing_styles
          .get_default_face_mesh_iris_connections_style())
      mp_face_mesh
实现方法

mp_face_mesh.FACEMESH_IRISES存储的是虹膜轮廓点之间的连接配对关系,不是独立的关键点索引,按以下步骤即可提取对应坐标:

  • 先从连接对中拆分出所有唯一的虹膜关键点索引,补充两个虹膜中心点的固定索引(468为右眼虹膜中心,473为左眼虹膜中心,默认连接集合未单独列出这两个中心索引)
  • 所有人脸关键点都按索引顺序存在face_landmarks.landmark列表中,直接按索引取值即可拿到归一化的x、y、z坐标(取值范围为0~1,是相对图像宽高的比例值)
  • 如果需要图像上的实际像素坐标,将归一化的x值乘以图像宽度、y值乘以图像高度,取整即可

在你原有代码的for face_landmarks in results.multi_face_landmarks循环内添加如下代码即可完成提取:

# 提取所有虹膜相关的唯一关键点索引
iris_idx_set = set()
for connect_pair in mp_face_mesh.FACEMESH_IRISES:
    iris_idx_set.add(connect_pair[0])
    iris_idx_set.add(connect_pair[1])
# 补充左右眼虹膜中心索引
iris_idx_set.add(468)
iris_idx_set.add(473)

img_h, img_w = image.shape[:2]
iris_point_coords = {}
for point_idx in iris_idx_set:
    point = face_landmarks.landmark[point_idx]
    # 存储归一化坐标和像素坐标
    iris_point_coords[point_idx] = {
        "normalized_coord": (point.x, point.y, point.z),
        "pixel_coord": (int(point.x * img_w), int(point.y * img_h))
    }

# 打印输出所有虹膜点坐标
print("虹膜关键点坐标:", iris_point_coords)

注意:必须保持FaceMesh初始化时refine_landmarks=True的配置,否则模型不会输出虹膜区域的关键点,468~477区间的点位返回值无效,你现有代码已正确配置该参数,无需修改。

内容的提问来源于stack exchange,提问作者kamero

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:33:15