Размытие лица в OpenCV и Mediapipe размытие

#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)


 

Вот как это выглядит с максимумом 4

Комментарии:

1. ваша проблема в том, что вы просите его рассчитать один набор ориентиров для всей картины . не делай этого. сначала найдите грани, затем рассчитайте набор ориентиров для каждой грани в отдельности.