MediaPipe Face Mesh

运用机械进修进行人脸468点的3D坐标检测并生成3D模型_地标_办法 智能助手

import cv2import mediapipe as mpmp_drawing = mp.solutions.drawing_utilsmp_face_mesh = mp.solutions.face_mesh

# 静态图片face_mesh = mp_face_mesh.FaceMesh(static_image_mode=True,max_num_faces=1,min_detection_confidence=0.5)drawing_spec = mp_drawing.DrawingSpec(thickness=2, circle_radius=1)drawing_spec1 = mp_drawing.DrawingSpec(thickness=2, circle_radius=1,color=(255,255,255))

代码截图

首先导入须要的第三方库,mediapipe的安装,直接在cmd命令框中输入

python –m pip install mediapipe 安装即可

然后我们定义了一个绘图方法,此方法定义了我们须要画图的线的粗细,颜色等信息,还记得我们前期分享holistic检测时,哪里由于没有配置线的粗细,导致我们的人脸识别的468个点密密麻麻的铺满了全体人脸,这里便可以修正一下

我们利用mp.solutions.drawing_utils下的DrawingSpec方法来定义线的粗细,颜色信息等,此方法接管三个参数,分别是color,thickness,circle_radius,我们可以利用此方法定义我们连接线的粗细已经颜色,定义468点的圆心大小,颜色等

代码截图

然后利用mp_face_mesh.FaceMesh方法定义一个人脸检测器与人脸mesh器,此方法接管4个参数

代码截图

STATIC_IMAGE_MODE

如果设置为false,则办理方案会将输入图像视为***流。
它将考试测验检测第一个输入图像中的人脸,并在成功检测后进一步定位人脸地标。
在随后的图像中,一旦检测到所有面孔并定位了相应的面孔地标,它便会大略地跟踪这些地标,而无需调用另一次检测,直到失落去对任何面孔的跟踪为止。
这减少了等待韶光,是处理***帧的空想选择。
如果设置为true,则脸部检测在每个输入图像上运行,非常适宜处理一批静态的,可能不干系的图像。
默认为false。

MAX_NUM_FACES

要检测的最大脸数。
默认为1。
这里也阐明了为什么我们分享holistic时 ,检测多人时,只检测了一个人脸,这里须要设置一下

MIN_DETECTION_CONFIDENCE

[0.0, 1.0]来自人脸检测模型的最小置信度值()被认为是成功检测。
默认为0.5。

MIN_TRACKING_CONFIDENCE

[0.0, 1.0]来自地标跟踪模型的最小置信度值()将被视为已成功跟踪的人脸地标,否则将不才一个输入图像上自动调用人脸检测。
将其设置为较高的值可以提高办理方案的健壮性,但代价是要增加延迟。
如果为true,则忽略该,个中人脸检测仅在每个图像上运行。
默认为0.5。

末了函数返回一个MULTI_FACE_LANDMARKS参数

检测/跟踪的面,个中,每个面被表示为468米的地标列表以及每个界标由网络x,y和z。
x和y分别[0.0, 1.0]通过图像的宽度和高度进行归一化。
z代表地标深度,以头部中心的深度为***,值越小,地标越靠近相机。
的z利用量级与大致相同x。

image = cv2.imread('2.jpg')image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)results = face_mesh.process(image)annotated_image = image.copy()

代码截图

随后,我们打开一张须要检测的图片,并把图片转换到RGB空间,然后利用process方法对图片进行检测,此方法返回所有的人脸468个点的坐标,有了这468个点的坐标,我们便可以遍历所有点,然后进行人脸mesh的绘制

for face_landmarks in results.multi_face_landmarks: print('face_landmarks:', face_landmarks) mp_drawing.draw_landmarks( image=annotated_image, landmark_list=face_landmarks, connections=mp_face_mesh.FACE_CONNECTIONS, landmark_drawing_spec=drawing_spec, connection_drawing_spec=drawing_spec1)cv2.imshow('annotated_image',annotated_image)cv2.waitKey(0)cv2.imwrite('111.png', annotated_image)face_mesh.close()

代码截图

我们利用for循环遍历所有的468个点,然后利用draw_landmarks方法画图,此方法接管5个参数

1、 image,须要画图的原始图片2、 landmark_list 检测到的人脸坐标3、 connections,连接线,须要把那些坐标连接起来4、 landmark_drawing_spec,坐标的颜色,粗细5、 connection_drawing_spec连接线的粗细,颜色等

代码截图

遍历完成后,便可以天生人脸的mesh网络了

Mesh人脸468点网络的***实现

import cv2import mediapipe as mpmp_drawing = mp.solutions.drawing_utilsmp_face_mesh = mp.solutions.face_meshface_mesh = mp_face_mesh.FaceMesh(min_detection_confidence=0.5, min_tracking_confidence=0.5)drawing_spec = mp_drawing.DrawingSpec(thickness=2, circle_radius=1)drawing_spec1 = mp_drawing.DrawingSpec(thickness=2, circle_radius=1,color=(255,255,255))cap = cv2.VideoCapture(0)

代码截图

对付实时***,代码跟图片检测险些同等,这里我们须要设置STATIC_IMAGE_MODE检测模型为***,而不是图片,然后打开我们电脑的默认摄像头,进行***帧的抓取

while cap.isOpened(): success, image = cap.read() if not success: print("Ignoring empty camera frame.") continue image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB) image.flags.writeable = False results = face_mesh.process(image) image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) if results.multi_face_landmarks: for face_landmarks in results.multi_face_landmarks: mp_drawing.draw_landmarks( image=image, landmark_list=face_landmarks, connections=mp_face_mesh.FACE_CONNECTIONS, landmark_drawing_spec=drawing_spec, connection_drawing_spec=drawing_spec1) cv2.imshow('MediaPipe FaceMesh', image) if cv2.waitKey(5) & 0xFF == ord('q'): breakface_mesh.close()cap.release()

代码截图

待***帧的图片抓取后,就可以利用图片识别的方法进行图片的检测,并实时把检测结果显示在***里面了