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"!
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.
La reconnaissance faciale est la bibliothèque de reconnaissance faciale la plus simple au monde capable de reconnaître et de manipuler les visages.
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)
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.
$ 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
#Hauteur et largeur maximales de l'image
MAX_IMAGE_WIDTH = 10000
MAX_IMAGE_HEIGHT = 10000
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]
#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)
#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]
]
)
#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()
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.
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.
** [OpenCV] [Python] Dessinez une image avec de la transparence au-dessus **
Recommended Posts