LiveFaceID / tools /annotation.py
Martlgap's picture
initial trial
32d37f5
raw
history blame
3.6 kB
import cv2
import mediapipe as mp
import streamlit as st
FIVE_LANDMARKS = [470, 475, 1, 57, 287]
FACE_CONNECTIONS = mp.solutions.face_mesh_connections.FACEMESH_TESSELATION
def draw_bounding_box(img, detections, ident_names, margin=10):
# Draw the bounding box on the original frame
for detection, name in zip(detections, ident_names):
color = (255, 0, 0) if name == "Unknown" else (0, 255, 0)
x_coords = [
landmark.x * img.shape[1] for landmark in detection.multi_face_landmarks.landmark
]
y_coords = [
landmark.y * img.shape[0] for landmark in detection.multi_face_landmarks.landmark
]
x_min, x_max = int(min(x_coords) - margin), int(max(x_coords) + margin)
y_min, y_max = int(min(y_coords) - margin), int(max(y_coords) + margin)
cv2.rectangle(img, (x_min, y_min), (x_max, y_max), color, 2)
cv2.rectangle(img, (x_min, y_min - img.shape[0] // 25), (x_max, y_min), color, -1)
return img
def draw_text(
img,
detections,
ident_names,
margin=10,
font_scale=1,
font_color=(0, 0, 0),
font=cv2.FONT_HERSHEY_SIMPLEX,
):
font_scale = img.shape[0] / 1000
for detection, name in zip(detections, ident_names):
x_coords = [
landmark.x * img.shape[1] for landmark in detection.multi_face_landmarks.landmark
]
y_coords = [
landmark.y * img.shape[0] for landmark in detection.multi_face_landmarks.landmark
]
x_min = int(min(x_coords) - margin)
y_min = int(min(y_coords) - margin)
cv2.putText(
img,
name,
(x_min + img.shape[0] // 400, y_min - img.shape[0] // 100),
font,
font_scale,
font_color,
2,
)
return img
def draw_mesh(img, detections):
for detection in detections:
# Draw the connections
for connection in FACE_CONNECTIONS:
cv2.line(
img,
(
int(detection.multi_face_landmarks.landmark[connection[0]].x * img.shape[1]),
int(detection.multi_face_landmarks.landmark[connection[0]].y * img.shape[0]),
),
(
int(detection.multi_face_landmarks.landmark[connection[1]].x * img.shape[1]),
int(detection.multi_face_landmarks.landmark[connection[1]].y * img.shape[0]),
),
(255, 255, 255),
1,
)
# Draw the landmarks
for points in detection.multi_face_landmarks.landmark:
cv2.circle(
img,
(
int(points.x * img.shape[1]),
int(points.y * img.shape[0]),
),
1,
(0, 255, 0),
-1,
)
return img
def draw_landmarks(img, detections):
# Draw the face landmarks on the original frame
for points in FIVE_LANDMARKS:
for detection in detections:
cv2.circle(
img,
(
int(
detection.multi_face_landmarks.landmark[points].x
* img.shape[1]
),
int(
detection.multi_face_landmarks.landmark[points].y
* img.shape[0]
),
),
5,
(0, 0, 255),
-1,
)
return img