Outils pour utilisateurs

Outils du site


diy:projets:facestooof

Ceci est une ancienne révision du document !


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:
Avant Après
(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

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 s'ajoutant aux calculs suivant pour étendre l'image substituante après le resize.
La partie #Preprocess contient le calcul de la taille du nouvel ROI, le changement de taille de l'image substituante, 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) l'image substituante 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.

Le main

Il s'étend lignes 130 jusqu'à la fin et se résume à:

  • Chargement du classifier.
  • Si aucune image substituante n'a été donnée, charge celle de base.
  • Lancer le traitement selon la méthode choisie, i.e:
    • Si traitement sur image fixe, détecte chaque visage et leur applique facesToOof un à un avant d'écrire le résultat.
    • Si traitement en temps réel, capture une image, détecte chaque visage et leur applique facesToOof un à un avant d'afficher le résultat et ce, jusqu'à pression de la touche Q.
  • Quitter.

diy/projets/facestooof.1527772147.txt.gz · Dernière modification : 2018/05/31 13:09 de tphilibert