[Python] Création d'une application de transformation pour le champion du monde "Mr. Satan"

introduction

Tout le monde a envie, champion du monde "Mr. Satan". J'ai fait une application qui peut être transformée en ce "M. Satan". Si vous portez les sourcils, la barbe et les cheveux afro caractéristiques, vous êtes aussi "Mr. Satan"!

** Divers ** (w)!

Techniquement, nous utilisons une bibliothèque appelée face_recognition pour obtenir les coordonnées de différentes parties du visage, et sur cette base, nous calculons la position et la taille des sourcils, des moustaches et de l'afro et les dessinons.

Qu'est-ce que face_recognition?

La reconnaissance faciale est la bibliothèque de reconnaissance faciale la plus simple au monde capable de reconnaître et de manipuler les visages.

Face Recognition

Recognize and manipulate faces from Python or from the command line with the world's simplest face recognition library.

Pour l'utiliser, installez-le d'abord avec pip.

$ pip install opencv-python
$ pip install opencv-contrib-python
$ pip install cmake
$ pip install face_recognition

À titre de test, essayez d'obtenir les parties du visage en utilisant l'image ci-dessous.

import face_recognition
import cv2

F = "image.jpg "

image = face_recognition.load_image_file(F)
face_landmarks_list = face_recognition.face_landmarks(image)

print(face_landmarks_list)

Img15790044321.jpg

J'ai les coordonnées de chaque partie. Tracons les coordonnées obtenues sur l'image réelle.

bgr = cv2.imread(F)
for face_landmarks in face_landmarks_list:

    for facial_feature in face_landmarks.keys():
        for i in range(len(face_landmarks[facial_feature])):
            cv2.drawMarker(bgr, face_landmarks[facial_feature][i], 
                           color=(255, 0, 0), markerType=cv2.MARKER_CROSS, thickness=1)

cv2.imshow('', bgr)
cv2.waitKey(0)
cv2.destroyAllWindows()

Vous pouvez voir qu'il est correctement reconnu.

Code réel

1. Installer avec pip

$ pip install opencv-python
$ pip install opencv-contrib-python
$ pip install cmake
$ pip install face_recognition

2. Importation de bibliothèque / déclaration de constante

import face_recognition
import cv2
from PIL import Image
import numpy as np
#Hauteur et largeur maximales de l'image
MAX_IMAGE_WIDTH = 10000
MAX_IMAGE_HEIGHT = 10000

3. Définition de la fonction (le dessin de superposition / les coordonnées sont stockées dans un tableau)

class CvOverlayImage(object):
    """
    [summary]
Superposer l'image spécifiée sur l'image au format OpenCV
    """

    def __init__(self):
        pass

    @classmethod
    def overlay(
            cls,
            cv_background_image,
            cv_overlay_image,
            point,
    ):
        """
        [summary]
Superposer l'image spécifiée sur l'image au format OpenCV
        Parameters
        ----------
        cv_background_image : [OpenCV Image]
        cv_overlay_image : [OpenCV Image]
        point : [(x, y)]
        Returns : [OpenCV Image]
        """
        overlay_height, overlay_width = cv_overlay_image.shape[:2]

        #Convertir les images au format OpenCV au format PIL(Y compris la valeur α)
        #image de fond
        cv_rgb_bg_image = cv2.cvtColor(cv_background_image, cv2.COLOR_BGR2RGB)
        pil_rgb_bg_image = Image.fromarray(cv_rgb_bg_image)
        pil_rgba_bg_image = pil_rgb_bg_image.convert('RGBA')
        #Image de superposition
        cv_rgb_ol_image = cv2.cvtColor(cv_overlay_image, cv2.COLOR_BGRA2RGBA)
        pil_rgb_ol_image = Image.fromarray(cv_rgb_ol_image)
        pil_rgba_ol_image = pil_rgb_ol_image.convert('RGBA')

        # composite()Étant donné que des images de même taille sont nécessaires, préparez une image pour la composition
        pil_rgba_bg_temp = Image.new('RGBA', pil_rgba_bg_image.size,
                                     (255, 255, 255, 0))
        #Spécifiez les coordonnées et superposez
        pil_rgba_bg_temp.paste(pil_rgba_ol_image, point, pil_rgba_ol_image)
        result_image = \
            Image.alpha_composite(pil_rgba_bg_image, pil_rgba_bg_temp)

        #Convertir en image au format OpenCV
        cv_bgr_result_image = cv2.cvtColor(
            np.asarray(result_image), cv2.COLOR_RGBA2BGRA)

        return cv_bgr_result_image
def GetPosi(posi_name):
    """
    [summary]
Obtenir les coordonnées de la pièce faciale spécifiée
    Parameters
    ----------
    posi_name : [str]
    Returns : [left_X、right_X, Top_Y, Bottom_Y]
    """

    for face_landmarks in face_landmarks_list:

        minX = MAX_IMAGE_WIDTH 
        maxX = 0
        minY = MAX_IMAGE_HEIGHT
        maxY = 0

        for i in range(len(face_landmarks[posi_name])):

            if face_landmarks[posi_name][i][0] < minX:
                minX  = face_landmarks[posi_name][i][0]

            if face_landmarks[posi_name][i][0] > maxX:
                maxX  = face_landmarks[posi_name][i][0]

            if face_landmarks[posi_name][i][1] < minY:
                minY = face_landmarks[posi_name][i][1]

            if face_landmarks[posi_name][i][1] > maxY:
                maxY = face_landmarks[posi_name][i][1]

    return [minX, maxX, minY, maxY]

4. Obtenez des repères de visage

#Définition du nom de fichier
F = "sample.jpg "
#Obtenez des repères de visage à partir d'images
image_fl = face_recognition.load_image_file(F)
face_landmarks_list = face_recognition.face_landmarks(image_fl)

5. Calculez la position des sourcils, de la barbe et de l'afro

#Obtenez les coordonnées de chaque pièce
eye_r = GetPosi('right_eye')
eye_l = GetPosi('left_eye')
mouse = GetPosi('top_lip')
nose  = GetPosi('nose_tip')
chin  = GetPosi('chin')

#Calculer la largeur des sourcils et la largeur des moustaches à partir des coordonnées acquises
brow_h   = int((eye_r[3] - eye_r[2]) * 2) 
face_w   = chin[1] - chin[0]
beard_h  = int((mouse[2] - nose[2]) * 0.7)
beard_w  = int((face_w - (mouse[1] - mouse[0])) * 0.2)
beard_h2 = int((chin[3] - mouse[2]) * 0.6)
beard_h3 = int((chin[3] - mouse[2]) * 0.3)
scale    = int(face_w / 20)
scale2   = scale * 2

#Calculer l'emplacement de l'image afro(Il y a un réglage fin car il n'est pas symétrique)
hair_w   = int(face_w * 1.83)
hair_h   = int(hair_w * 0.64)
hair_x   = int(chin[0] - (hair_w / 2 - face_w / 2) + scale * 1.5)
hair_y   = eye_l[2] - hair_h
#Coordonner le calcul des sourcils et de la barbe
eyeb_r = np.array(
    [
        [eye_r[0] - scale2, eye_r[2] - brow_h], 
        [eye_r[1] + scale2, eye_r[2] - brow_h - scale2], 
        [eye_r[1] + scale2, eye_r[2] - scale * 2] , 
        [eye_r[0] - scale2, eye_r[2]]
    ]
)

eyeb_l = np.array(
    [
        [eye_l[0] - scale2, eye_l[2] - brow_h - scale2], 
        [eye_l[1] + scale2, eye_l[2] - brow_h], 
        [eye_l[1] + scale2, eye_l[2]] , 
        [eye_l[0] - scale2, eye_l[2] - scale * 2]
    ]
)

beard_c = np.array(
    [
        [mouse[0] - scale, mouse[2] - beard_h], 
        [mouse[1] + scale, mouse[2] - beard_h], 
        [mouse[1] + scale, mouse[2] -  0] , 
        [mouse[0] - scale, mouse[2] -  0]
    ]
)

beard_l = np.array(
    [
        [mouse[0] - beard_w, mouse[2] - beard_h - scale], 
        [mouse[0] - 5, mouse[2] - beard_h], 
        [mouse[0] - 5, mouse[2] + beard_h2], 
        [mouse[0] - beard_w, mouse[2] + beard_h3]
    ]
)

beard_r = np.array(
    [
        [mouse[1] + 5, mouse[2] - beard_h], 
        [mouse[1] + beard_w, mouse[2] - beard_h - scale], 
        [mouse[1] + beard_w, mouse[2] + beard_h3], 
        [mouse[1] + 5, mouse[2] + beard_h2]
    ]
)

6. Dessiner les sourcils, les moustaches et l'afro

#Lire des fichiers avec OpenCV
image = cv2.imread(F)

#Processus de sourcil / barbe / dessin
cv2.fillConvexPoly(image, points =eyeb_r, color=(0, 0, 0))
cv2.fillConvexPoly(image, points =eyeb_l, color=(0, 0, 0))
cv2.fillConvexPoly(image, points =beard_c, color=(0, 0, 0))
cv2.fillConvexPoly(image, points =beard_l, color=(0, 0, 0))
cv2.fillConvexPoly(image, points =beard_r, color=(0, 0, 0))
#Affichage superposé de l'image afro
cv_background_image = image
cv_overlay_image = cv2.imread(
    "head.png ",
    cv2.IMREAD_UNCHANGED)  # IMREAD_Spécifiez UNCHANGED et lisez avec α

cv_overlay_image = cv2.resize(cv_overlay_image, (hair_w, hair_h))
point = (hair_x, hair_y)

image = CvOverlayImage.overlay(cv_background_image, cv_overlay_image, point)

#Dessin d'image
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

prime

C'est l'image afro utilisée. Le fond est transparent. Veuillez le définir comme head.png et le mettre dans le dossier de travail.

head.png

À la fin

Pour le moment, seule l'image de face est prise en charge. La reconnaissance faciale obtient les coordonnées avec une sensation agréable, donc je l'ai fait avec un peu de traitement. Une partie de la sortie était intéressante personnellement, mais j'ai abandonné à cause du portrait juste. J'espère que vous pourrez jouer avec diverses images.

Site de référence

** [OpenCV] [Python] Dessinez une image avec de la transparence au-dessus **

Recommended Posts

[Python] Création d'une application de transformation pour le champion du monde "Mr. Satan"
Qt pour l'application de bureau de l'application Python
Création d'un wrapper Python pour l'API Qiita
Mise à jour automatique de l'application Qt pour Python
Création d'une bibliothèque pour python capable de gérer facilement la division morphologique
De la création d'un environnement Python pour les personnes inexpérimentées à Hello world
[python] J'ai créé un diagramme de corrélation de suivi pour Twitter (édition Gremlin)
Création d'un outil de test AtCoder pour Python
Python #Hello World pour les super débutants
J'ai créé un modèle de projet Python générique
Créer une application GUI simple en Python
Créons un environnement virtuel pour Python
Démonisez une application Web Python avec Supervisor
[Mac] Création d'un environnement virtuel pour Python
Créé un voyage de fléchettes avec python (news)
Lancer une application Flask dans Python Anywhere
Obtenez un jeton pour conoha avec python
Un outil pour saisir facilement du code Python
Un monde typé qui commence par Python
Créez une application de bureau avec Python avec Electron
J'ai créé un outil de mot de passe en Python.
Créer un environnement de développement Python pour le développement de l'IA
Un manuel pour les débutants réalisé par des débutants Python