Table des matières
Présentation du projet
Le but de ce projet est de pouvoir intervertir les différents visages sur des photos.
Outils requis et Librairies Python
Ce programme se base sur la détection de visages et utilise donc la même fonction que celle-ci pour pouvoir détecter les faces à échanger
Il utilise aussi les mêmes librairies que la détection de visages à savoir:
import cv2 import numpy as np import sys import os
Explication du programme
Comme écrit ci-dessus le Faceswap utilise la fonction detectVisage pour détecter les visages à échanger.
Une fois que ceux-ci sont détectées on vérifie s'il y a au moins deux visages sinon on quitte le programme.
#Verification du nombre de visage if len(vis) < 2: print("Le nombre de visage n'est pas suffisant pour executer le FaceSwap")
Ensuite, on enregistre dans des fichiers temporaires au formats images tous les visages obtenus.
#Creation d'image temporaire pour l'execution du FaceSwap i = 0 for x,y,w,h in vis: cv2.imwrite("temp"+str(i)+".jpg",img[y:h,x:w]) i=i+1
Puis en décalant l'indice, on parcourt une nouvelle fois le tableau de visages, on récupère le visage temporaire correspondant à l'indice, on redimensionne celui-ci à la taille du visage que l'on veut remplacer et on remplace le visage actuel.
#Remplacement des visages présent sur l'image par les autres visages enregistrés dans des fichiers temp i = 1; for x,y,w,h in vis: rep=cv2.imread("temp"+str(i)+".jpg", cv2.IMREAD_COLOR) repR = cv2.resize(rep,img[y:h,x:w].shape[:2]) img[y:h,x:w] = repR i=i+1 if i == len(vis): i = 0
Et enfin, il ne reste plus qu'à écrire l'image résultat et à supprimer les fichiers temporaires.
cv2.imwrite("IMGRES/"+res,img) os.system("rm temp*.jpg")
Utilisation du Raspberry
Ce programme fonctionne évidemment avec des images et vidéos importées directement d'un raspberry. Pour ce faire, nous avons besoin des scripts Bash ci-dessous permettant la connexion au raspberry.
#!/bin/sh ip=$1 cat detectVisImg.sh | ssh pi@$ip sh rm imgDetectVisage.jpeg scp pi@$ip:~/tempPS/imgDetectVisage.jpeg ./DetectVisage
#!/bin/sh if [ -d "/home/pi/tempPS" ]; then cd tempPS sudo rm *.jpeg else mkdir ./tempPS cd tempPS fi raspistill -vf -hf -o imgDetectVisage.jpeg exit
Pour appeler un script Bash en python on utilise la commande suivante, qui permet de lire une commande systeme :
os.popen("./connexPiDetectVisageVid.sh " + ipRasp,"r").read