Algorithmes pour la Synthèse d'Images

 

 
Pour information : la validation de l'enseignement est faite sur projet. Les projets sont à rendre au plus tard le lundi 16 décembre 2019 à 9h00 (1 point de pénalité par heure de retard). Le projet sera soutenu (présentation de 5mn sur vidéo projecteur) et la soutenance se déroulera en A193 le mardi 17 décembre à 9h00. Afin d'être notés, tous les étudiants ont l'obligation de se présenter aux soutenances même si leur projet n'est pas terminé.
 
Supports & liens
  • OpenCV, bibliothèque de Computer Vision : Dans un premier temps, nous utiliserons OpenCV pour montrer rapidement certains algorithmes de traitement d'images mais aussi pour sa facilité d'usage comme bibliothèque de gestion de fenêtres, de chargement de différents types d'images et de gestion des devices de capture vidéo. Ce dernier point restera utile le long du cours.

  • Site de la SDL - Simple DirectMedia Layer : Nous utiliserons la SDL-2 comme bibliothèque donnant accès à un contexte OpenGL 3.2 ou plus et aussi comme bibliothèque de gestion des évènements et des interactions utilisateur. Elle pourra, si besoin, être utilisée pour la gestion des threads, des fonts, au chargement de divers formats d'images ou de sons.

  • Site d'OpenGL - Open Graphics Library : OpenGL sera utilisé en version CORE 3.2 et + (voire 3.3 et +). Nous utiliserons la documentation des Reference Pages d'OpenGL 3.3, au moins pour les premiers exemples donnés, nous fournissons les Projets/Makefiles pour un fonctionnement sous Linux (Makefile), Windows (Code::Blocks, Visual C++ 2010 express, DevC++ 5 ou Makefile sous cygwin/MingW32) et Mac OS X (Makefile).

  • GL4Dummies : nous développons une bibliothèque permettant une gestion uniforme et facile des ressources OpenGL via la SDL2. Cette bibliothèque est accompagné d'un manuel d'apprentissage de la synthèse d'images.

Documentations - Lecture
Exemples utilisés en cours
OCVExample-01.tgz, OpenCV : récupération d'un flux depuis un device vidéo (ou image - pour cela décommenter le bout de code correspondant) et utilisation d'une fonction de conversion pour tranformer la frame en niveaux de gris.
OCVExample-02.tgz, OpenCV : récupération d'un flux depuis un device vidéo, conversion des pixels en HSV et filtre laissant passer les teintes vertes.
OCVExample-03.tgz, OpenCV : récupération d'un flux depuis un device vidéo, conversion en HSV et cycle sur les teintes.
OCVExample-04.tgz, OpenCV : récupération d'un flux depuis un device vidéo, segmentation de l'image soit sur R, G et B soit sur V (de HSV).
Démarrage avec OpenGL/GL4D/GLSL : GLSLExample-00.0.tgz et GLSLExample-00.1.tgz.
Textering avec OpenGL/GL4D/GLSL : avec image PNG GLSLExample-01.0.tgz et avec flux vidéo OpenCV GLSLExample-01.1.tgz.
Codes à voir en cours pour respectivement faire un simple flou, appliquer une convolution passée en argument ou un filtre Sobel : simple flou, convolution générique, Sobel
GLSLExample-02.0.tgz, OpenGL : chargement d'une image, flou Gaussien, Sobel et flou Gaussien itératif utilisant les FBOs (OpenGL/GL4Dummies/GLSL).
GLSLExample-03.0.tgz, OpenGL : chargement d'une image et flou (très rapide !) Gaussien Horizontal/Vertical (OpenGL/GL4Dummies/GLSL).
GLSLExample-04.0.tgz, OpenGL : chargement d'une image et flou en fonction du focus lié au pointeur de souris.
GLSLExample-06.0.tgz, OpenCV : Haar Cascade utilisé pour la détection de visages puis des yeux (documentation OpenCV).
sample_3d_00-1.0.tgz, OpenGL : géométrie, lumière et transformations GL4Dummies.
sample_3d_01-1.0.tgz, OpenGL : Lumière positionnelle, Gouraud et Phong (appuyer sur 'p' pour switcher de l'un à l'autre).
sample_3d_01-1.1.tgz, même exemple que précédent avec lumières : ambient, diffuse and specular.
sample_3d_02-1.0.tgz, OpenGL : suivi du click souris.
Exemples d'introduction au développement natif sous Android, Respectivement : jniBlurCours.zip flou gaussien en Java et le même en natif (C/jni) avec FPS, SimpleGL4D.zip Quad coloré en natif/OpenGL/GL4D (partie native compilée à l'aide de CMake), AndroidGL4D.zip Quad éclairé en natif/OpenGL/GL4D (partie native compilée directement par gradle).
SimpleGL4D_androidStudio3.zip et AndroidGL4D_androidStudio3.zip sont les versions modifiées et testées avec Android Studio 3.0
Enfin, GL4DES3.zip est un projet GL ES 3 donnant accès à plus de fonctionnalités GL4D ... bon courage :)
SolarVR.tgz, Android, OpenGL et réalité virtuelle : utilisation des sensors pour orientation spaciale, possibilité d'utilisation d'une télécommande bluetooth et double vue (frustum et viewport) pour optiques de casque de réalité virtuelle.
Exemple de Loader de fichiers 3D (.obj, .3ds, certains .fbx, ...) utilisant la bibliothèque Assimp (www.assimp.org), GL3 (VAO/VBO ...) et les shaders/matrices GL4Dummies : sample_3d_06-1.0.tgz, voir la fonction keydown pour les commandes clavier.
GLSLExample-09.0.tgz, Couplage d'un streaming provenant d'OpenCV avec de la géométrie OpenGL utilisant une projection orthogonale (identité) et une projection perspective avec rotation de la géométrie.
GLSLExample-09.1.tgz, Code réalisé en cours le 15/10/2019 reprenant les exemples GLSLExample-09.0.tgz et GLSLExample-06.0.tgz pour exploiter la détection du dernier en OpenGL.
Puis GLSLExample-09.2.tgz, Code réalisé en cours le 05/11/2019 rajoutant le calcul de position/dimension et rendu (éclairage Phong avec spéculaire) d'une sphère sur chaque position de visage.
Exercices
Exercice 1 (A faire entre le 10 et le 17 septembre 2019)
En partant d'un code openCV récupérant un flux vidéo ou simplement une image, ajouter aléatoirement des points (dispersion de poivre et sel) à chaque frame en reprenant l'image source (ou le flux d'origine). Sur la moitié de l'image, appliquer un filtre médian développé from scratch.
 
Exercice 2 (A faire pour le 24 septembre 2019)
En partant du code de segmentation openCV, reproduire les effets réalisés avec GIMP dans l'archive segmentation.zip.
 
Exercice 3 (TP du XX/XX/2019)
  • En partant du code GLSLExample-00.0 :
    • Modifier la donnée du VAO afin d'ajouter une couleur à chaque sommet, puis modifier les shaders afin d'afficher cette couleur.
    • Dans le GLSL, essayer le mode flat pour la transmission de la couleur entre le Vertex Shader et le Fragment Shader.
    • Modifier la donnée du VAO afin de dessiner un quadrilatère (pas de modification au niveau des shaders).
    • Passer la donnée du VAO en mode Interleaved Array (données entrelacées).
  • En partant du code GLSLExample-01.1 :
    • Créer une matrice de projection et une matrice de modélisation (gl4duGenMatrix), toutes deux initialisées à identité (gl4duLoadIdentityf). Les envoyer (gl4duSendMatrices) et les utiliser dans le Vertex Shader.
    • Ajouter une rotation (gl4duRotatef) autour de y dans la matrice de modélisation. L'angle de rotation doit croitre en fonction du temps.
    • Ajouter une projection en perspective (gl4duFrustumf) dans la matrice de projection. Vous serez obligés d'ajouter une translation (gl4duTranslatef) dans la matrice de modélisation afin de visualiser votre plan.
    • Créer une autre géométrie à l'aide d'une des fonctions gl4dgGen... et la faire tourner en orbite autour du plan (le laisser statique). Vous pouvez plaquer la même texture (caméra ou autres) sur la nouvelle géométrie créée.
 
Exercice 4 (TP du XX/XX/2019)
  • En partant du code GLSLExample-01.1, réaliser un enchainement de filtres comparable au résultat de l'image ci-contre, soit :
    • En utilisant les fonctions de filtre de GL4D : gl4dfScattering, gl4dfMedian et gl4dfSobel.
    • En codant vous-même les permutations, le médian et le sobel en GLSL : l'utilisation des FBOs (Frame Buffer Objects) est recommandée.
 
Exercice 5 (TP du XX/XX/2019, des points à gagner si rendu avant la fin de semaine)
  • En partant du code GLSLExample-01.1, GLSLExample-06.0 et sample_3d_02 faire la détection temps-réel des visages et ajouter une géométrie 3D au dessus des visages détectés.
 

 

 

Farès Belhadj

 

<-