Ceci est une ancienne révision du document !
Table des matières
Présentation du projet
Ce que ce programme fait
facesToX est un programme permettant de changer chaque instance de visage dans une image par une autre image. “L'image” en entrée peut être donnée, prise, ou du temps réel sur n'importe quelle caméra supportant la librairie OpenCV.
Ce programme est purement divertissant et ne sert à rien d'autre.
Voici un exemple classique d'une exécution de ce programme:
(Si vous vous demandez pourquoi certains visages ne sont pas pris, je vous propose de regarder la section Problèmes et améliorations).
Outils requis et Librairies Python
Le programme
Le programme se trouve en intégralité ici.
Outils requis
- Un classifier entraîné dans la détection du visage, comme celui-ci.
- Cette image de base.
Le tout à placer dans le même dossier que celui du programme.
Remarques:
- Le classifier donné est celui utilisé par le programme. Vous pouvez le remplacer par n'importe quel autre classifier remplissant la même fonction mais si vous le faites, n'oubliez pas de changer son nom ici:
# Load XML Classifier face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
ligne 133.
- N'importe quelle image peut-être l'image de base du moment qu'elle s'appelle 'oof.png'.
Librairies
Ce programme utilise les librairies suivantes:
# Libraries import cv2 import sys
lignes 1 à 3
cv2
référence la librairie OpenCV permettant de nombreuses opérations sur les images en Python et C++
sys
référence la librairie sys pour la gestion des paramètres en Python.
Explication du programme
Le contrôle d'erreur
Il s'agit d'un pan entier de code contrôlant l'arbre d'argument suivant:
Ce n'est pas nécessairement excitant mais ça permet au programme de détecter différentes erreurs, de s'arrêter dans de meilleures conditions et en indiquant l'erreur en question.
Si cela vous intéresse, le contrôle s'étend lignes 35 à 126.
Les fonctions
Ce programme ne contient qu'une seule fonction:facesToOof
facesToOof.
def facesToOof(img,oof,x,y,w,h): # ~0.008s # Datas add_h = 13 add_w = 0 # Preprocess new_h = h+2*add_w new_w = w+2*add_h resized_oof = cv2.resize(oof,(new_h,new_w),interpolation = cv2.INTER_AREA) y1, y2 = y-add_h, y+h+add_h x1, x2 = x-add_w, x+w+add_w alpha = resized_oof[:, :, 3] / 255 ctr_alpha = 1.0 - alpha # Treatment try: for c in range(0, 3): img[y1:y2, x1:x2, c] = (alpha * resized_oof[:, :, c] + ctr_alpha * img[y1:y2, x1:x2, c]) except Exception as e: pass return img
lignes 9 à 31.
La partie #Data
contient les données paramètres de “d'explosion” du ROI et de centrage, s'ajoutant aux calculs suivant pour center le flash sur les yeux et pour que le étendre le flash lumineux après son le resize
.
La partie #Preprocess
contient le calcul de la taille du nouvel ROI, le changement de taille du flash lumineux, le calcul des nouvelles valeurs de départ et de fin dans l'image de départ et le calcul de la valeur de transparence.
La partie #Treatment
pose dans un try … catch
(voir problèmes et améliorations) le flash lumineux sur l'image de départ pixel par pixel avant de la renvoyer.
Et voilà, tous les visages ont été substitués ! Il ne reste plus qu'à afficher le résultat.