#python #opencv #mediapipe #facial-identification
Вопрос:
В настоящее время я пытаюсь создать функцию, которая идентифицирует лица и стирает их, используя Mediapipe и OpenCV.
Всякий раз, когда я пытаюсь идентифицировать и размыть более одного лица, пространство между обоими лицами также становится размытым. Как я могу сделать так, чтобы только лица были размыты, но не размазывались?
main.py
import cv2
import numpy as np
from facial_landmarks import FaceLandmarks
fl = FaceLandmarks()
image = cv2.imread("sampletest.jpg")
landmarks = fl.get_facial_landmarks(image)
convexhull = cv2.convexHull(landmarks)
h, w = image.shape[:2]
mask = np.zeros((h, w), np.uint8)
cv2.fillConvexPoly(mask, convexhull, 255)
image_copy = cv2.blur(image, (27, 27))
face_extracted = cv2.bitwise_and(image_copy, image_copy, mask=mask)
background_mask = cv2.bitwise_not(mask)
background = cv2.bitwise_and(image, image, mask=background_mask)
result = cv2.add(background, face_extracted)
cv2.imwrite('test.jpg', result)
landmarks.py
import mediapipe as mp
import cv2
import numpy as np
class FaceLandmarks:
def __init__(self):
mp_face_mesh = mp.solutions.face_mesh
self.face_mesh = mp_face_mesh.FaceMesh(max_num_faces=6, min_detection_confidence=0.2)
def get_facial_landmarks(self, frame):
height, width, _ = frame.shape
frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
result = self.face_mesh.process(frame_rgb)
facelandmarks = []
for facial_landmarks in result.multi_face_landmarks:
for i in range(0, 468):
pt1 = facial_landmarks.landmark[i]
x = int(pt1.x * width)
y = int(pt1.y * height)
facelandmarks.append([x, y])
return np.array(facelandmarks, np.int32)
Комментарии:
1. ваша проблема в том, что вы просите его рассчитать один набор ориентиров для всей картины . не делай этого. сначала найдите грани, затем рассчитайте набор ориентиров для каждой грани в отдельности.