现在的人脸识别普遍侧脸不太行,特征点都是脑补。
mediapipe检测的是468个特征点,而dlib只有68个,眉毛上方多了两圈。
import cv2
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_face_mesh = mp.solutions.face_mesh
# 静态图片
face_mesh = mp_face_mesh.FaceMesh(
static_image_mode=True,
max_num_faces=1,#图中最多几个人
refine_landmarks=True,
min_detection_confidence=0.5)
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1,color=(255, 255, 255))#画点画线用到,粗细、圆圈半径、颜色
drawing_spec1 = mp_drawing.DrawingSpec(thickness=1, circle_radius=1, color=(222, 222, 66))
def test():
image = cv2.imread('test_pic/00009.jpg')
results = face_mesh.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))#转换rgb,然后人脸识别
annotated_image = image.copy()
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.FACEMESH_FACE_OVAL,#人脸边缘连起来
landmark_drawing_spec=drawing_spec,#画特征点
connection_drawing_spec=drawing_spec1#特征点之间用线连接
)
cv2.imshow('annotated_image', annotated_image)
cv2.waitKey(0)
cv2.imwrite('fianl_pic/00009_4.png', annotated_image)
face_mesh.close()
test()
这部分是关于多个图片,以及电脑摄像头的:
import cv2
import os
import mediapipe as mp
mp_drawing = mp.solutions.drawing_utils
mp_drawing_styles = mp.solutions.drawing_styles
mp_face_mesh = mp.solutions.face_mesh
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
drawing_spec1 = mp_drawing.DrawingSpec(thickness=1, circle_radius=1, color=(222, 222, 66))
# For static images:
def image():
IMAGE_FILES = ['./test2/'+i for i in os.listdir('./test2/')]
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)
# Convert the BGR image to RGB before processing.
results = face_mesh.process(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
# Print and draw face mesh landmarks on the image.
if not results.multi_face_landmarks:
continue
annotated_image = image.copy()
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.FACEMESH_TESSELATION,
landmark_drawing_spec=drawing_spec1,
connection_drawing_spec=drawing_spec1)
# mp_drawing.draw_landmarks(
# image=annotated_image,
# landmark_list=face_landmarks,
# connections=mp_face_mesh.FACEMESH_CONTOURS,
# landmark_drawing_spec=drawing_spec1,
# connection_drawing_spec=drawing_spec1)
# mp_drawing.draw_landmarks(
# image=annotated_image,
# landmark_list=face_landmarks,
# connections=mp_face_mesh.FACEMESH_IRISES,
# landmark_drawing_spec=drawing_spec1,
# connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_iris_connections_style())
name = file.split('.')[-2].split('/')[-1]
cv2.imwrite('./temp/'+name+'.png', annotated_image)
cv2.imshow('1',annotated_image)
cv2.waitKey(-1)
# For webcam input:
def video():
drawing_spec = mp_drawing.DrawingSpec(thickness=1, circle_radius=1)
#cap = cv2.VideoCapture('./exfacecode2/videos/youtube-c23/233.mp4')
cap = cv2.VideoCapture(0)
with mp_face_mesh.FaceMesh(
max_num_faces=1,
refine_landmarks=True,
min_detection_confidence=0.5,
min_tracking_confidence=0.5) as face_mesh:
while cap.isOpened():
success, image = cap.read()
if not success:
print("final")
break
image.flags.writeable = False
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
results = face_mesh.process(image)
# Draw the face mesh annotations on the 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.FACEMESH_TESSELATION,
# landmark_drawing_spec=None,
# connection_drawing_spec=mp_drawing_styles
# .get_default_face_mesh_tesselation_style())
mp_drawing.draw_landmarks(
image=image,
landmark_list=face_landmarks,
connections=mp_face_mesh.FACEMESH_CONTOURS,
landmark_drawing_spec=None,
connection_drawing_spec=mp_drawing_styles
.get_default_face_mesh_contours_style())
# mp_drawing.draw_landmarks(
# image=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())
# Flip the image horizontally for a selfie-view display.
cv2.imshow('MediaPipe Face Mesh', cv2.flip(image, 1))
if cv2.waitKey(5) & 0xFF == ord('q'):
break
cap.release()
#image()
video()