[Python] Erstellt eine Transformations-App für Weltmeister "Mr. Satan"

Einführung

Alle sehnen sich nach Weltmeister "Mr. Satan". Ich habe eine App erstellt, die sich in diesen "Mr. Satan" verwandeln lässt. Wenn Sie die charakteristischen Augenbrauen, den Bart und die Afro-Haare tragen, sind Sie auch "Mr. Satan"!

** Verschiedenes ** (w)!

Technisch gesehen verwenden wir eine Bibliothek namens face_recognition, um die Koordinaten verschiedener Teile des Gesichts zu ermitteln. Darauf aufbauend berechnen wir die Position und Größe der Augenbrauen, Schnurrhaare und Afro und zeichnen sie.

Was ist Gesichtserkennung?

Die Gesichtserkennung ist die weltweit einfachste Gesichtserkennungsbibliothek, mit der Gesichter erkannt und bearbeitet werden können.

Face Recognition

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

Um es zu verwenden, installieren Sie es zuerst mit pip.

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

Versuchen Sie als Test, die Gesichtsteile anhand des folgenden Bildes zu ermitteln.

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

Ich habe die Koordinaten jedes Teils. Zeichnen wir die erhaltenen Koordinaten auf das tatsächliche Bild.

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

Sie können sehen, dass es richtig erkannt wird.

Tatsächlicher Code

1. Mit pip installieren

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

2. Bibliotheksimport / Konstantendeklaration

import face_recognition
import cv2
from PIL import Image
import numpy as np
#Maximale Höhe und Breite des Bildes
MAX_IMAGE_WIDTH = 10000
MAX_IMAGE_HEIGHT = 10000

3. Funktionsdefinition (Überlagerungszeichnung / Koordinaten werden in einem Array gespeichert)

class CvOverlayImage(object):
    """
    [summary]
Überlagern Sie das angegebene Bild mit dem Bild im OpenCV-Format
    """

    def __init__(self):
        pass

    @classmethod
    def overlay(
            cls,
            cv_background_image,
            cv_overlay_image,
            point,
    ):
        """
        [summary]
Überlagern Sie das angegebene Bild mit dem Bild im OpenCV-Format
        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]

        #Konvertieren Sie Bilder im OpenCV-Format in das PIL-Format(Einschließlich α-Wert)
        #Hintergrundbild
        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')
        #Bild überlagern
        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()Da Bilder gleicher Größe erforderlich sind, bereiten Sie ein Bild für das Compositing vor
        pil_rgba_bg_temp = Image.new('RGBA', pil_rgba_bg_image.size,
                                     (255, 255, 255, 0))
        #Koordinaten angeben und überlagern
        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)

        #Bild in OpenCV-Format konvertieren
        cv_bgr_result_image = cv2.cvtColor(
            np.asarray(result_image), cv2.COLOR_RGBA2BGRA)

        return cv_bgr_result_image
def GetPosi(posi_name):
    """
    [summary]
Holen Sie sich die Koordinaten des angegebenen Gesichtsteils
    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. Holen Sie sich Gesicht Orientierungspunkte

#Dateinamen Definition
F = "sample.jpg "
#Holen Sie sich Gesichtsmarkierungen aus Bildern
image_fl = face_recognition.load_image_file(F)
face_landmarks_list = face_recognition.face_landmarks(image_fl)

5. Berechnen Sie die Position von Augenbrauen, Bart und Afro

#Holen Sie sich die Koordinaten jedes Teils
eye_r = GetPosi('right_eye')
eye_l = GetPosi('left_eye')
mouse = GetPosi('top_lip')
nose  = GetPosi('nose_tip')
chin  = GetPosi('chin')

#Berechnen Sie die Augenbrauenbreite und die Whiskerbreite aus den erfassten Koordinaten
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

#Berechnen Sie die Position des Afro-Bildes(Es erfolgt eine Feineinstellung, da diese nicht symmetrisch ist)
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
#Koordinatenberechnung von Augenbrauen und Bart
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. Augenbrauen, Schnurrhaare und Afro zeichnen

#Lesen Sie Dateien mit OpenCV
image = cv2.imread(F)

#Augenbrauen- / Bart- / Zeichenprozess
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))
#Überlagerungsanzeige des Afro-Bildes
cv_background_image = image
cv_overlay_image = cv2.imread(
    "head.png ",
    cv2.IMREAD_UNCHANGED)  # IMREAD_Geben Sie UNCHANGED an und lesen Sie mit α

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)

#Bildzeichnung
cv2.imshow("image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()

Bonus

Dies ist das verwendete Afro-Bild. Der Hintergrund ist transparent. Setzen Sie es auf head.png und legen Sie es in den Arbeitsordner.

head.png

Am Ende

Im Moment wird nur das Frontbild unterstützt. Die Gesichtserkennung erhält die Koordinaten mit einem schönen Gefühl, also habe ich es mit ein wenig Verarbeitung gemacht. Ein Teil der Ausgabe war persönlich interessant, aber ich habe wegen des richtigen Porträts aufgegeben. Ich hoffe du kannst mit verschiedenen Bildern spielen.

Referenzseite

** [OpenCV] [Python] Zeichnen Sie ein Bild mit Transparenz darüber **

Recommended Posts

[Python] Erstellt eine Transformations-App für Weltmeister "Mr. Satan"
Qt für Python App Desktop App
Erstellt einen Python-Wrapper für die Qiita-API
Qt für Python App Selbstaktualisierung
Erstellt eine Bibliothek für Python, die die morphologische Teilung problemlos handhaben kann
Vom Aufbau einer Python-Umgebung für unerfahrene Personen bis zur Hello-Welt
[Python] Ich habe ein Follow-Korrelationsdiagramm für Twitter erstellt (Gremlin-Ausgabe)
Erstelltes AtCoder-Testtool für Python
Python #Hello World für Super-Anfänger
Ich habe eine generische Python-Projektvorlage erstellt
Erstellen Sie eine einfache GUI-App in Python
Erstellen wir eine virtuelle Umgebung für Python
Dämonisieren Sie eine Python-Webanwendung mit Supervisor
[Mac] Erstellen einer virtuellen Umgebung für Python
Erstellt eine Reise von Darts mit Python (Nachrichten)
Starten Sie eine Flask-App in Python Anywhere
Holen Sie sich ein Zeichen für Conoha mit Python
Ein Tool zur einfachen Eingabe von Python-Code
Eine typisierte Welt, die mit Python beginnt
Erstellen Sie eine Desktop-App mit Python mit Electron
Ich habe ein Passwort-Tool in Python erstellt.
Erstellen einer Python-Entwicklungsumgebung für die KI-Entwicklung
Ein Lehrbuch für Anfänger von Python-Anfängern