Аналог библиотеки изображений Python в манипулировании видео - PullRequest
0 голосов
/ 24 ноября 2018

В настоящее время я работаю над кодом о том, как рисовать ориентиры на лицах в режиме реального времени с использованием модулей opencv и face_recognition.Я видел исходный код в Интернете о рисовании поверх изображения с использованием PIL и face_recognition, мне было интересно, какой модуль является аналогом PIL в плане манипулирования видео?Я хочу найти ориентиры лица, которое отображается на веб-камере, и закрасить их (например, брови, губы и т. Д.)

Это мой текущий код:

from PIL import Image, ImageDraw
import face_recognition
import cv2

video_capture = cv2.VideoCapture(0)

face_locations = []
process_this_frame = True
face_landmarks_list = []
while True:
    ret, frame = video_capture.read()
    small_frame = cv2.resize(frame, (0, 0), fx = 0.25, fy = 0.25)
    rgb_small_frame = small_frame[:, :, ::-1]
    if process_this_frame:
        face_locations = face_recognition.face_locations(rgb_small_frame)
        face_landmarks_list = face_recognition.face_landmarks(rgb_small_frame)

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

# Make the eyebrows into a nightmare
            d.polygon(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 128))
            d.polygon(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 128))
            d.line(face_landmarks['left_eyebrow'], fill=(68, 54, 39, 150), width=5)
            d.line(face_landmarks['right_eyebrow'], fill=(68, 54, 39, 150), width=5)

# Gloss the lips
            d.polygon(face_landmarks['top_lip'], fill=(150, 0, 0, 128))
            d.polygon(face_landmarks['bottom_lip'], fill=(150, 0, 0, 128))
            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)

# Sparkle the eyes
            d.polygon(face_landmarks['left_eye'], fill=(255, 255, 255, 30))
            d.polygon(face_landmarks['right_eye'], fill=(255, 255, 255, 30))

# Apply some eyeliner
            d.line(face_landmarks['left_eye'] + [face_landmarks['left_eye'][0]], fill=(0, 0, 0, 110), width=6)
            d.line(face_landmarks['right_eye'] + [face_landmarks['right_eye'][0]], fill=(0, 0, 0, 110), width=6)

    cv2.imshow('Video', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

video_capture.release()
cv2.destroyAllWindows()
...