Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente |
diy:projets:helleyes [2018/05/31 11:45] – [Ce que ce programme fait] tphilibert | diy:projets:helleyes [2018/05/31 14:26] (Version actuelle) – [Outils requis] tphilibert |
---|
\\ | \\ |
Exemple d'exécution de ce programme:\\ | Exemple d'exécution de ce programme:\\ |
{{:diy:projets:barack-obama.jpg?340|Avant}} {{:diy:projets:hell_eyes.jpg?340|Après}} | {{:diy:projets:barack-obama.jpg?345|Avant}} {{:diy:projets:hell_eyes.jpg?345|Après}} |
---- | ---- |
| |
* Un classifier entraîné dans la détection du visage, comme [[https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml|celui-ci]]. | * Un classifier entraîné dans la détection du visage, comme [[https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_frontalface_default.xml|celui-ci]]. |
* Un classifier entraîné dans la détection d’œil, comme [[https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_eye.xml|celui-là]].\\ | * Un classifier entraîné dans la détection d’œil, comme [[https://github.com/opencv/opencv/blob/master/data/haarcascades/haarcascade_eye.xml|celui-là]].\\ |
* Ce magnifique [[https://github.com/JsuisUnLama/BE-2018---PHILIBERT-Thomas/blob/master/images/begoneThotEyes.png|flash lumineux de la mort]] | * Ce magnifique [[https://github.com/JsuisUnLama/BE-2018---PHILIBERT-Thomas/blob/master/images/begoneThotEyes.png|flash lumineux de la mort qui tue]]. |
Le tout à placer dans le même dossier que celui du programme.\\ | Le tout à placer dans le même dossier que celui du programme.\\ |
\\ | \\ |
</code> | </code> |
//lignes 1 à 3// | //lignes 1 à 3// |
* ''cv2'' référence la librairie [[https://opencv.org/|OpenCV]] permettant de nombreuses opérations sur les images en Python et C++\\ | * ''cv2'' référence la librairie [[https://opencv.org/|OpenCV]] (version 3.4.1) permettant de nombreuses opérations sur les images en Python et C++\\ |
* ''sys'' référence la librairie [[https://docs.python.org/3/library/sys.html|sys]] pour la gestion des paramètres en Python. | * ''sys'' référence la librairie [[https://docs.python.org/3/library/sys.html|sys]] pour la gestion des paramètres en Python. |
| |
====Le contrôle d'erreur==== | ====Le contrôle d'erreur==== |
Il s'agit d'un pan entier de code contrôlant l'arbre d'argument suivant:\\ | Il s'agit d'un pan entier de code contrôlant l'arbre d'argument suivant:\\ |
{{:diy:projets:arbre_des_arguments_hell_eyes.png|}}\\ | {{ :diy:projets:arbre_des_arguments_hell_eyes_1_.png |}} |
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. | 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 55 à 112//\\ | Si cela vous intéresse, le contrôle s'étend //lignes 55 à 112//.\\ |
| |
====Les fonctions==== | ====Les fonctions==== |
Voilà qui est déjà un peu plus intéressant. Ce programme contient deux fonctions: | Voilà qui est déjà un peu plus intéressant. Ce programme contient deux fonctions: |
* **hellEyes**(//image à traiter, flash rouge lumineux des enfers//) | * **hellEyes**(//image à traiter, flash rouge lumineux des enfers//). |
* **addHellEyes**(//image à traiter, flash rouge lumineux des enfers, axe, ordonnée, largeur, hauteur//) | * **addHellEyes**(//image à traiter, flash rouge lumineux des enfers, axe, ordonnée, largeur, hauteur//). |
| |
===hellEyes=== | ===hellEyes=== |
return img | return img |
</code> | </code> |
//lignes 9 à 22//\\ | //lignes 9 à 22//.\\ |
\\ | \\ |
On prend l'image ''img'', on la transforme en niveaux de gris, on applique le //face classifier// dessus grâce à ''detectMultiScale''. Chaque visage ainsi détecté rejoins la liste ''faces'' sous la forme d'un tuple de 4 valeurs: | On prend l'image ''img'', on la transforme en niveaux de gris, on applique le //face classifier// dessus grâce à ''detectMultiScale''. Chaque visage ainsi détecté rejoins la liste ''faces'' sous la forme d'un tuple de 4 valeurs: |
* axe au point en haut à gauche du visage dans le référentiel du gris de **l'image de départ** | * axe au point en haut à gauche du visage dans le référentiel du gris de **l'image de départ**. |
* ordonnée au point en haut à gauche du visage dans le référentiel du gris de **l'image de départ** | * ordonnée au point en haut à gauche du visage dans le référentiel du gris de **l'image de départ**. |
* Largeur du visage | * Largeur du visage. |
* Hauteur du visage\\ | * Hauteur du visage.\\ |
Pour chaque visage, on définit une sous image (ou **ROI**) à partir de celle en niveau de gris, de laquelle on applique le //eye classifier// toujours avec ''detectMultiScale''. Chaque œil ainsi détecté rejoins la liste ''eyes'' sous la forme d'un autre tuple de 4 points similaire à celui des visages, excepté qu'ici **l'image de départ** est le ROI du visage en traitement.\\ | Pour chaque visage, on définit une sous image (ou **ROI**) à partir de celle en niveau de gris, de laquelle on applique le //eye classifier// toujours avec ''detectMultiScale''. Chaque œil ainsi détecté rejoins la liste ''eyes'' sous la forme d'un autre tuple de 4 points similaire à celui des visages, excepté qu'ici **l'image de départ** est le ROI du visage en traitement.\\ |
Enfin pour chaque œil on applique la fonction ''addHellEyes'' en passant **l'image de départ**, le flash rouge, la position (x,y) de l’œil dans le référentiel de **l'image de départ** ainsi que la largeur et la hauteur de l’œil qu'on traite .\\ | Enfin pour chaque œil on applique la fonction ''addHellEyes'' en passant **l'image de départ**, le flash rouge, la position (x,y) de l’œil dans le référentiel de **l'image de départ** ainsi que la largeur et la hauteur de l’œil qu'on traite .\\ |
return img | return img |
</code> | </code> |
//lignes 26 à 51//\\ | //lignes 26 à 51//.\\ |
\\ | \\ |
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 ''#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 ''#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.\\ | La partie ''#Treatment'' pose //dans un ''try ... catch'' (voir [[https://wiki.ensfea.fr/doku.php?id=diy:projets:helleyes#problemes_et_ameliorations|Problèmes et améliorations]])// le flash lumineux sur l'image de départ pixel par pixel avant de la renvoyer.\\ |
Et voilà, vous êtes un <del>contrôleur des impôts</del> démon ! Il ne reste plus qu'à l'afficher | Et voilà, vous êtes un <del>contrôleur des impôts</del> démon ! Il ne reste plus qu'à l'afficher. |
| |
====Le main==== | ====Le main==== |
Il s'agit là aussi d'un bout de code pas très passionnant. Il s'étend //lignes 115 jusqu'à la fin// et se résume à: | Il s'agit là aussi d'un bout de code pas très passionnant. Il s'étend //lignes 115 jusqu'à la fin// et se résume à: |
* Chargement des //classifiers// | * Chargement des //classifiers//. |
* Chargement du flash lumineux | * Chargement du flash lumineux. |
* Débuter le traitement selon la méthode choisie, i.e: | * Débuter le traitement selon la méthode choisie, i.e: |
* Soit en appliquant la fonction puis en écrivant le résultat si le traitement est sur image fixe | * Soit en appliquant la fonction puis en écrivant le résultat si le traitement est sur image fixe. |
* Soit en appliquant la fonction en continue et en l'affichant le résultat en temps réel jusqu'à pression de la touche ''Q'' | * Soit en appliquant la fonction en continue et en l'affichant le résultat en temps réel jusqu'à pression de la touche ''Q''. |
* Quitter | * Quitter. |
| |
---- | ---- |
=====Problèmes et améliorations===== | ======Problèmes et améliorations====== |
====Problèmes==== | ====Problèmes==== |
Même si la scène ou l'image comporte un visage, le programme peut: | Même si la scène ou l'image comporte un visage, le programme peut: |