OpenCV和Mediapipe面模糊涂抹

2024-06-16 13:37:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在尝试使用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)


This is what it looks like with max 4


Tags: imageimportselfasnpmaskmpresult