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"!
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.
Die Gesichtserkennung ist die weltweit einfachste Gesichtserkennungsbibliothek, mit der Gesichter erkannt und bearbeitet werden können.
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)
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.
$ pip install opencv-python
$ pip install opencv-contrib-python
$ pip install cmake
$ pip install face_recognition
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
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]
#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)
#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]
]
)
#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()
Dies ist das verwendete Afro-Bild. Der Hintergrund ist transparent. Setzen Sie es auf head.png und legen Sie es in den Arbeitsordner.
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.
** [OpenCV] [Python] Zeichnen Sie ein Bild mit Transparenz darüber **
Recommended Posts