Maison  >  Article  >  développement back-end  >  Donnez-vous un chapeau de Père Noël en utilisant Python

Donnez-vous un chapeau de Père Noël en utilisant Python

WBOY
WBOYavant
2023-04-12 17:22:101689parcourir

Noël approche. Même si nous ne pouvons pas célébrer cette fête, nous devons quand même nous joindre à la fête. Je crois qu'il y a déjà beaucoup de périphériques liés aux chapeaux de Noël qui circulent. Aujourd'hui, nous allons le faire nous-mêmes et y ajouter un chapeau de Noël. notre avatar.

Préparation des connaissances de base

Dans les ordinateurs, les images sont enregistrées sous forme de matrice, les lignes en premier et les colonnes en second. Par conséquent, une image avec largeur × hauteur × canal de couleur = 480 × 256 × 3 sera stockée dans un tenseur tridimensionnel de 256 × 480 × 3. Le traitement de l'image est également calculé selon cette idée (y compris le traitement de l'image sous OpenCV), c'est-à-dire hauteur × largeur × canal de couleur.

Image numérique

Pour une image numérique, ce que nous voyons est une image réelle visible à l'œil nu, mais pour un ordinateur, cette image n'est qu'un tas de points avec des luminosités différentes. Une image de taille M × N peut être représentée par une matrice M × N. La valeur de l'élément matriciel représente la luminosité du pixel à cette position. De manière générale, plus la valeur du pixel est grande, plus le point est lumineux.

De manière générale, les images en niveaux de gris sont représentées par des matrices bidimensionnelles et les images couleur (multicanaux) sont représentées par des matrices tridimensionnelles (M× N × 3).

Canal d'image

décrit un pixel s'il est en niveaux de gris, alors une seule valeur est nécessaire pour le décrire, qui est un seul canal. Si un pixel possède trois couleurs, RVB, pour le décrire, il possède trois canaux. Une image à quatre canaux est R, V, B plus un canal A, indiquant la transparence. Généralement appelé canal alpha, indiquant la transparence.

ROI et masque

Définition de la région d'intérêt (ROI), traduit en langue vernaculaire par, définition de la région d'intérêt. Le masque est un processus de masquage d'image, qui équivaut à couvrir les parties qui ne nous intéressent pas, laissant la partie ROI. L'alpha mentionné ci-dessus peut être utilisé comme masque.

Connaissance matricielle (Numpy)

Indexation matricielle, découpage, etc. Je ne les maîtrise pas bien ici, donc je n'entrerai pas dans les détails. Les amis peuvent apprendre par eux-mêmes.

Préparation de l'environnement

Maintenant que nous avons les connaissances de base, jetons un bref coup d'œil au code.

Installez d'abord les bibliothèques OpenCV et dlib que vous devez utiliser, utilisez pip pour les installer respectivement

pip install python-opencv

pip install dlib

Puis téléchargez manuellement le fichier de modèle de données shape_predictor_5_face_landmarks.dat depuis Internet, l'adresse est la suivante : http://dlib .net/files/ , téléchargez-le et placez-le dans le répertoire du projet.

Les étudiants intéressés peuvent jouer avec shape_predictor_68_face_landmarks.dat, qui reconnaît jusqu'à 68 points clés sur les visages.

Donnez-vous un chapeau de Père Noël en utilisant Python

Traitement du code

Traitement du chapeau

La première chose que nous devons faire est de traiter le chapeau. L'image que nous utilisons est la suivante

Donnez-vous un chapeau de Père Noël en utilisant Python

Extraire d'abord les valeurs RVB et alpha​​de. l'image du chapeau

# 帽子Donnez-vous un chapeau de Père Noël en utilisant Python
hat_img3 = cv2.imread("hat.png", -1)
r, g, b, a = cv2.split(hat_img3)
rgb_hat = cv2.merge((r, g, b))
cv2.imwrite("rgb_hat.jpg", rgb_hat)
cv2.imwrite("alpha.jpg", a)
print(a)
print(hat_img3.shape)
print(rgb_hat.shape)

L'effet que nous obtenons comme suit :

image RVB

Donnez-vous un chapeau de Père Noël en utilisant Python

image alpha

Donnez-vous un chapeau de Père Noël en utilisant Python

La valeur imprimée est la suivante :

[[0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 ...
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]
 [0 0 0 ... 0 0 0]]

Détection de visage

Détection de visage est effectué ci-dessous, en utilisant le traitement dlib.

# 人脸检测
dets = self.detector(img, 1)
x, y, w, h = dets[0].left(), dets[0].top(), dets[0].right() - dets[0].left(), dets[0].bottom() - dets[0].top()
# 关键点检测
shape = self.predictor(img, dets[0])
point1 = shape.parts()[0]
point2 = shape.parts(2)
# 求两点中心
eyes_center = ((point1.x + point2.x) // 2, (point1.y + point2.y) // 2)

L'étape suivante consiste à réduire l'image du chapeau

# 帽子和人脸转换比例
hat_w = int(round(dets[0].right()/1.5))
hat_h = int(round(dets[0].bottom() / 2))
if hat_h > y:
hat_h = y - 1
hat_newsize = cv2.resize(rgb_hat, (hat_w, hat_h))
mask = cv2.resize(a, (hat_w, hat_h))
mask_inv = cv2.bitwise_not(mask)
dh = 0
dw = 0

bg_roi = img[y+dh-hat_h:y+dh,(eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)]

Extraction ROI

Effectuer l'extraction ROI

# 用alpha通道作为mask
mask = cv2.resize(a, (resized_hat_w, resized_hat_h))
mask_inv = cv2.bitwise_not(mask)

mask variable et supprimer la zone du chapeau. La variable

Donnez-vous un chapeau de Père Noël en utilisant Python

mask_inv est utilisée pour extraire la zone où le chapeau est installé sur l'image du visage.

Donnez-vous un chapeau de Père Noël en utilisant Python

Ensuite, retirez la zone en forme de chapeau (ROI) dans l'image du visage

# 原图ROI
# bg_roi = img[y+dh-resized_hat_h:y+dh, x+dw:x+dw+resized_hat_w]
bg_roi = img[y + dh - resized_hat_h:y + dh,
 (eyes_center[0] - resized_hat_w // 3):(eyes_center[0] + resized_hat_w // 3 * 2)]

Ensuite, retirez la zone en forme de chapeau dans l'image du visage

# 原图ROI中提取放帽子的区域
bg_roi = bg_roi.astype(float)
mask_inv = cv2.merge((mask_inv, mask_inv, mask_inv))
alpha = mask_inv.astype(float) / 255
# 相乘之前保证两者大小一致(可能会由于四舍五入原因不一致)
alpha = cv2.resize(alpha, (bg_roi.shape[1], bg_roi.shape[0]))
# print("alpha size: ",alpha.shape)
# print("bg_roi size: ",bg_roi.shape)
bg = cv2.multiply(alpha, bg_roi)
bg = bg.astype('uint8')

Voici l'uint8 par défaut du image​ Le type est converti en type float pour le fonctionnement, puis finalement reconverti.

L'image composite

Donnez-vous un chapeau de Père Noël en utilisant Python

La partie sombre est l'endroit où nous voulons placer le chapeau.

Extrayez la partie chapeau de la photo du chapeau.

# 提取帽子区域
hat = cv2.bitwise_and(resized_hat, resized_hat, mask=mask)

Utilisez l'image du chapeau que vous venez de redimensionner pour l'extraire.

Donnez-vous un chapeau de Père Noël en utilisant Python

可以看到,除了帽子部分,其他区域已经掩模处理了。

以上就是提取ROI的过程,比较难懂,需要好好琢磨,尤其是矩阵的切片、mask处理部分。

合成Donnez-vous un chapeau de Père Noël en utilisant Python

最后一步就是把人脸Donnez-vous un chapeau de Père Noël en utilisant Python与帽子合成到一起了,也就是把人脸空余帽子部分的Donnez-vous un chapeau de Père Noël en utilisant Python区域和帽子只展示帽子区域的Donnez-vous un chapeau de Père Noël en utilisant Python区域(有点拗口)合并在一起。

# 相加之前保证两者大小一致(可能会由于四舍五入原因不一致)
hat = cv2.resize(hat, (bg_roi.shape[1], bg_roi.shape[0]))
# 两个ROI区域相加
add_hat = cv2.add(bg, hat)

效果如下:

Donnez-vous un chapeau de Père Noël en utilisant Python

刚刚好,完美叠加Donnez-vous un chapeau de Père Noël en utilisant Python。

最后把这个片段放回人脸原图中,展示Donnez-vous un chapeau de Père Noël en utilisant Python

img[y+dh-hat_h:y+dh, (eyes_center[0]-hat_w//3):(eyes_center[0]+hat_w//3*2)] = add_hat

Donnez-vous un chapeau de Père Noël en utilisant Python

美美的Donnez-vous un chapeau de Père Noël en utilisant Python就出来啦!

我们再尝试几张不同的Donnez-vous un chapeau de Père Noël en utilisant Python。

Donnez-vous un chapeau de Père Noël en utilisant Python

Donnez-vous un chapeau de Père Noël en utilisant Python

整体效果还不错哦,需要注意的是,在测试的时候,我们尽量选择人脸占比比较大的Donnez-vous un chapeau de Père Noël en utilisant Python来合成,效果要好很多哦~

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer