代码示例

import cv2
import numpy as np
import mediapipe as mp
from scipy.spatial import distance as dist
import config

# 初始化mediapipe
mp_face_mesh = mp.solutions.face_mesh
# 创建mediapipe实例
face_mesh = mp_face_mesh.FaceMesh(
    max_num_faces=1,
    refine_landmarks=True,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5
)

# 读取图片
img = cv2.imread("img.png")
# 转换为RGB
img1 = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 处理图片
results = face_mesh.process(img1)
# print(results.multi_face_landmarks[0].landmark)
# 获取图片大小
h, w = img1.shape[:2]
# 获取关键点坐标xy
points = []
for landmark in results.multi_face_landmarks[0].landmark:
    x = int(landmark.x * w)
    y = int(landmark.y * h)
    points.append((x, y))
# print( points)


# 定义面部关键点索引
# 左眼
LEFT_EYE_INDICES = [33, 7, 163, 144, 145, 153, 154, 155, 133, 173, 157, 158, 159, 160, 161, 246]
# 右眼
RIGHT_EYE_INDICES = [362, 382, 381, 380, 374, 373, 390, 249, 263, 466, 388, 387, 386, 385, 384, 398]
# 嘴巴
MOUTH_INDICES = [61, 185, 40, 39, 37, 0, 267, 269, 270, 409, 291, 375, 321, 405, 314, 17, 84, 181, 91, 146]
# 鼻子,点头用的到,根据鼻尖和嘴巴的距离
nose_indices = [1, 168, 197, 195, 5, 4]
# 绘制关键点
for i in LEFT_EYE_INDICES:
    cv2.circle(img, points[i], 2, (0, 255, 0), -1)
for i in RIGHT_EYE_INDICES:
    cv2.circle(img, points[i], 2, (0, 255, 0), -1)
for i in MOUTH_INDICES:
    cv2.circle(img, points[i], 2, (0, 255, 0), -1)
for i in nose_indices:
    cv2.circle(img, points[i], 2, (255, 0, 0), -1)

cv2.imshow("img", img)
cv2.waitKey(0)

简单的识别,然后绘画关键点,至于动作就是根据关键点之间的距离判断,记得做一个变量,如果一直是同一个距离就是不重复叠加,当距离不满足再复位,具体代码目前没时间写

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐