From 95f8fdfbae41dcea3360b7b4a477164a83bb0201 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laure=CE=B7t?= Date: Fri, 25 Nov 2022 11:49:26 +0100 Subject: [PATCH] feat: switch to face mesh for now --- src/main.py | 58 +++++++++++++++++++++++++++++++---------------------- 1 file changed, 34 insertions(+), 24 deletions(-) diff --git a/src/main.py b/src/main.py index 388e623..24e6d0c 100644 --- a/src/main.py +++ b/src/main.py @@ -8,13 +8,17 @@ def main() -> None: """Main function.""" mp_drawing = mp.solutions.drawing_utils # type: ignore mp_drawing_styles = mp.solutions.drawing_styles # type: ignore - mp_holistic = mp.solutions.holistic # type: ignore + mp_face_mesh = mp.solutions.face_mesh # type: ignore # open webcam cap = cv2.VideoCapture(0) - with mp_holistic.Holistic(min_detection_confidence=0.5, min_tracking_confidence=0.5) as holistic: + with mp_face_mesh.FaceMesh( + max_num_faces=2, refine_landmarks=True, min_detection_confidence=0.5, min_tracking_confidence=0.5 + ) as face_mesh: + while cap.isOpened(): + # read webcam success, image = cap.read() if not success: @@ -22,34 +26,40 @@ def main() -> None: # If loading a video, use 'break' instead of 'continue' continue - # to improve performance, optionally mark the image as not writeable to pass by reference + # to improve performance, optionally mark the image as not writeable to pass by reference. image.flags.writeable = False image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) - results = holistic.process(image) + results = face_mesh.process(image) - # log landmarks - logging.debug(results.face_landmarks) - logging.debug(results.pose_landmarks) - - # draw landmark annotation on the image + # draw the face mesh annotations on the image. image.flags.writeable = True image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) - mp_drawing.draw_landmarks( - image, - results.face_landmarks, - mp_holistic.FACEMESH_CONTOURS, - landmark_drawing_spec=None, - connection_drawing_spec=mp_drawing_styles.get_default_face_mesh_contours_style(), - ) - mp_drawing.draw_landmarks( - image, - results.pose_landmarks, - mp_holistic.POSE_CONNECTIONS, - landmark_drawing_spec=mp_drawing_styles.get_default_pose_landmarks_style(), - ) + 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 Holistic", cv2.flip(image, 1)) + cv2.imshow("MediaPipe Face Mesh", cv2.flip(image, 1)) if cv2.waitKey(5) & 0xFF == 27: break @@ -60,7 +70,7 @@ def main() -> None: if __name__ == "__main__": # setup logging format logging.basicConfig( - level=logging.DEBUG, + level=logging.INFO, format="%(asctime)s %(name)s %(levelname)-8s %(message)s", datefmt="(%F %T)", )