Обрезать и сохранять лицевые ориентиры, используя PIL - PullRequest
0 голосов
/ 19 ноября 2018

Я хочу обрезать верхнюю губу и низ и сохранить его в одном изображении.Я использую эту библиотеку GitHub face_recognition

Это код:

from PIL import Image, ImageDraw
import face_recognition

# Load the jpg file into a numpy array
image = face_recognition.load_image_file("me.jpg")

# Find all facial features in all the faces in the image
face_landmarks_list = face_recognition.face_landmarks(image)


for face_landmarks in face_landmarks_list:
    pil_image = Image.fromarray(image)
    d = ImageDraw.Draw(pil_image, 'RGBA')


    # Gloss the lips
    d.polygon(face_landmarks['top_lip'], fill=(150, 0, 0, 128), outline=None)
    d.polygon(face_landmarks['bottom_lip'], fill=(150, 0, 0, 128), outline=None)
    d.line(face_landmarks['top_lip'], fill=(150, 0, 0, 64), width=8)
    d.line(face_landmarks['bottom_lip'], fill=(150, 0, 0, 64), width=8)


    # cropped_top_lip = image.crop(face_landmarks['top_lip'])
    # cropped_top_lip.save('top_lip.jpg')
    # cropped_bottom_lip = image.crop(face_landmarks['bottom_lip'])
    # cropped_bottom_lip.save('bottom_lip.jpg')

    pil_image.save('me2.jpg')

Это возвращает полное изображение, я хочу только часть губ.

Это отпечаток face_landmarks['top_lip']:

[(498, 937), (546, 926), (597, 924), (637, 930), (676, 922), (726, 922), (772, 929), (756, 935), (677, 940), (637, 946), (597, 942), (516, 942)]

1 Ответ

0 голосов
/ 19 ноября 2018

Метод .crop берет список, содержащий 4 координаты области кадрирования -

[
    X_top_left_corner, Y_top_left_corner, 
    X_bottom_right_corner, Y_bottom_right_corner
] 

Что я могу сказать по координатам face_landmarks['top_lip'], я думаю, этоуказывает на контур губ.Итак, вам нужно найти самый левый верхний угол и самый правый нижний угол и передать его в метод crop.

[(498, 937), (546,926), (597, 924), (637, 930), (676, 922), (726, 922), (772, 929), (756, 935), (677, 940), (637, 946), (597, 942), (516, 942)]

Чтобы найти левый верхний угол, вам нужно найти наименьшую координату X и наименьшую координату Y изэти данные.И эти две координаты могут присутствовать в отдельных кортежах.

Для правого нижнего угла вам понадобится самая высокая координата X и самая высокая координата y.Опять же, эти два могут присутствовать в отдельных кортежах.


Вы можете определить углы следующим образом:

x1 = min(my_list)[0] # top left corner X
y1 = min(my_list, key=lambda pair: pair[1])[1] # top left corner Y

x2 = max(my_list)[0] # bottom right corner X
y2 = max(my_list, key=lambda pair: pair[1])[1] # bottom right corner Y

В этом случае наименьшая координата X равна 498и наименьшая координата Y 922.Это создаст ваш левый верхний угол.

Наивысшая координата X - 772, а наивысшая координата Y - 946.Это будет ваш правый нижний угол.

Это должно работать для обрезки верхней губы:

# im.crop([x1, y1, x2, y2])
im.crop([498, 922, 772, 946])
...