stéréoscopique outils de réalité virtuellepiranda/cms/ig8_stereo_rv.pdf · système de...
TRANSCRIPT
Benoît PirandaBenoît PirandaÉquipe SISARÉquipe SISARUniversité de Marne La ValléeUniversité de Marne La Vallée
Synthèse d’imageSynthèse d’image
StéréoscopiqueStéréoscopiqueOutils de réalité virtuelleOutils de réalité virtuelle
Système de réalité virtuelleSystème de réalité virtuelleEnsemble de périphériques, communication avec Ensemble de périphériques, communication avec les sens de l’utilisateur les sens de l’utilisateur –– Vision 3DVision 3D–– Interaction espace réel / espace virtuel Interaction espace réel / espace virtuel –– Immersion sonoreImmersion sonore–– Autres : odeur, toucherAutres : odeur, toucher
Vision binoculaireVision binoculairePériphérique de séparation des images pour Périphérique de séparation des images pour chaque œilchaque œilPrincipePrincipe–– Système de séparation des sources lumineusesSystème de séparation des sources lumineuses–– Les deux images Les deux images
•• Doivent apparaître superposéesDoivent apparaître superposées•• Doivent être associées à un seul œil Doivent être associées à un seul œil
Méthodes utilisées par les périphériquesMéthodes utilisées par les périphériquesCasque immersifCasque immersif–– Deux petits écrans Deux petits écrans –– Placés devant chaque œilPlacés devant chaque œil
AvantagesAvantages–– Toujours placé face à l’utilisateurToujours placé face à l’utilisateur–– Séparation des sources simpleSéparation des sources simple
InconvénientsInconvénients–– Système lourd et encombrantSystème lourd et encombrant–– Réceptions des signaux vidéo par câble Réceptions des signaux vidéo par câble
Méthodes utilisées par les périphériquesMéthodes utilisées par les périphériquesLunettes activesLunettes actives–– Lunettes équipées d’un système d’occultation des Lunettes équipées d’un système d’occultation des
yeuxyeux–– Occultation synchronisée avec l’affichage à l’écranOccultation synchronisée avec l’affichage à l’écran–– Communication nécessaire entre l’émetteur et les Communication nécessaire entre l’émetteur et les
lunettes (infrarouge)lunettes (infrarouge)AvantagesAvantages–– Un ou deux vidéo projecteursUn ou deux vidéo projecteurs–– Séparation totale des sourcesSéparation totale des sources
InconvénientsInconvénients–– Système encore lourdSystème encore lourd–– Un seul utilisateur simultané regardant Un seul utilisateur simultané regardant
l’écranl’écran
Lunettes activesLunettes actives
Émetteur vidéo alternantimage gauche et image droite
écranlunettes
yeux
Espace de rétro projection Espace de visualisation
Vidéo G/D
Méthodes utilisées par les périphériquesMéthodes utilisées par les périphériquesLunettes passives colorées (anaglyphe)Lunettes passives colorées (anaglyphe)–– Décomposition de la lumière en deux couleurs Décomposition de la lumière en deux couleurs
complémentairescomplémentaires–– Filtres colorés complémentairesFiltres colorés complémentaires
•• Rouge / cyanRouge / cyan•• Vert / violetVert / violet•• Jaune / BleuJaune / Bleu
AvantagesAvantages–– Périphérique très légerPériphérique très léger–– Fonctionne avec un simple écranFonctionne avec un simple écran–– Coût très faibleCoût très faible
InconvénientsInconvénients–– Altération des couleurs de la scèneAltération des couleurs de la scène–– Un seul utilisateur simultané regardant l’écran Un seul utilisateur simultané regardant l’écran
Exemples d’image coloréeExemples d’image colorée
Méthodes utilisées par les périphériquesMéthodes utilisées par les périphériquesLunettes à filtres polarisants linéairesLunettes à filtres polarisants linéaires–– Filtrage de la lumière se propageant dans un planFiltrage de la lumière se propageant dans un plan–– Plans orientés suivant deux axes orthogonauxPlans orientés suivant deux axes orthogonaux
((--45° et +45°)45° et +45°)
AvantagesAvantages–– Périphérique très légerPériphérique très léger–– Fonctionne avec un simple écran (non dépolarisant)Fonctionne avec un simple écran (non dépolarisant)–– Coût très faibleCoût très faible
InconvénientsInconvénients–– Un seul utilisateur simultané regardant l’écran Un seul utilisateur simultané regardant l’écran –– Ne supporte pas la rotation de la tête face à l’écranNe supporte pas la rotation de la tête face à l’écran
Module de projection stéréoscopiqueModule de projection stéréoscopique
Vidéo G
Vidéo D
filtrespolarisants
écran
lunettespolarisantes
yeux
Espace de rétro projection Espace de visualisation
Méthodes utilisées par les périphériquesMéthodes utilisées par les périphériquesLunettes à filtres polarisants circulairesLunettes à filtres polarisants circulaires–– Deux sens différents pour chaque oeilDeux sens différents pour chaque oeil
AvantagesAvantages–– Périphérique très légerPériphérique très léger–– Fonctionne avec un simple écranFonctionne avec un simple écran
(non dépolarisant)(non dépolarisant)–– Supporte les mouvements de la tète face à l’écran Supporte les mouvements de la tète face à l’écran
InconvénientsInconvénients–– Un seul utilisateur simultané regardant l’écran Un seul utilisateur simultané regardant l’écran
Méthodes utilisées par les périphériquesMéthodes utilisées par les périphériquesAlioscopieAlioscopie–– Système de lentilles placées sur un écran LCD Système de lentilles placées sur un écran LCD
permettant de construire des zones spatiales devant permettant de construire des zones spatiales devant l’écran permettant la vision stéréoscopiquel’écran permettant la vision stéréoscopique
AvantageAvantage–– Aucun périphérique sur l’utilisateurAucun périphérique sur l’utilisateur
InconvénientInconvénient–– Supporte peu de mouvement de l’utilisateurSupporte peu de mouvement de l’utilisateur
Principe de la synthèse stéréoscopiquePrincipe de la synthèse stéréoscopiqueProduire deux images différentesProduire deux images différentes–– Une pour l’œil gauche, une pour l’œil droitUne pour l’œil gauche, une pour l’œil droit–– Correspond à deux caméras Correspond à deux caméras OpenGLOpenGL différentesdifférentes
Impose de synthétiser Impose de synthétiser –– Deux images par 24Deux images par 24èmeème de secondede seconde–– De la résolution des vidéoDe la résolution des vidéo--projecteursprojecteurs
•• Résolution actuelle Résolution actuelle 2x1024x7682x1024x7682x1200x9002x1200x900
Placement et direction des camérasPlacement et direction des camérasCaméraCaméra–– projection centraleprojection centrale–– décalées de l’espace interoculairedécalées de l’espace interoculaire–– dirigées parallèlementdirigées parallèlement
Vision binoculaireVision binoculairePlacement des caméra virtuellesPlacement des caméra virtuelles
Plan focal
Dis
tanc
e in
ter o
cula
ire
Vision binoculaireVision binoculaireCas d’un objet placé devant le plan focalCas d’un objet placé devant le plan focal
Vision binoculaireVision binoculaireCas d’un objet placé devant le plan focalCas d’un objet placé devant le plan focal
Création d'une paire d'images stéréo.Création d'une paire d'images stéréo.Paramètres de la pyramide de projection Paramètres de la pyramide de projection OpenGLOpenGLSystème de 2 caméras :Système de 2 caméras :–– observateur fixe devant l'écranobservateur fixe devant l'écran–– observateur se déplace devant l'écranobservateur se déplace devant l'écran
Images stéréoscopiques Images stéréoscopiques OpenGLOpenGLParamètres de projection Paramètres de projection OpenGLOpenGL–– Centre optiqueCentre optique–– Pyramide de projectionPyramide de projection
•• LeftLeft, right, right•• Top, Top, bottombottom•• NearNear, far, far
Images stéréoscopiquesImages stéréoscopiques OpenGLOpenGLDétermination Détermination des paramètres des paramètres de projection de projection pour un système pour un système de 2 caméras de 2 caméras virtuellesvirtuelles
droitedroite
gauchegauche
nearnear
focalefocale
diodio
leftleft
rightright
farfar
WW
planplanfocalfocal
Exemple d’images stéréoscopiquesExemple d’images stéréoscopiques
caméra gauchecaméra gauche caméra droitecaméra droite
ExempleExemple
plan focalplan focal
Paramètres verticauxParamètres verticauxDétermination des Détermination des paramètres top et paramètres top et bottombottomIl ne doit pas y avoir de Il ne doit pas y avoir de décalage verticaux entre décalage verticaux entre les imagesles images
Analogies : scène réelle et scène virtuelleAnalogies : scène réelle et scène virtuelleAnalogies entre la scène réelle et la scène Analogies entre la scène réelle et la scène virtuellevirtuelle–– observateur / camérasobservateur / caméras
•• Les caméras représentent les yeux de l’observateur dans la Les caméras représentent les yeux de l’observateur dans la scène virtuellescène virtuelle
•• Distance interoculaire = écartement des camérasDistance interoculaire = écartement des caméras
–– écran / plan focalécran / plan focal•• L’écran est le support de l’imageL’écran est le support de l’image•• Le plan focal représente l’écran dans la scène virtuelleLe plan focal représente l’écran dans la scène virtuelle•• Distance observateur écran = distance focaleDistance observateur écran = distance focale•• Largeur de l’écran = largeur du plan focalLargeur de l’écran = largeur du plan focal
Analogies : scène réelle et scène virtuelleAnalogies : scène réelle et scène virtuelleTout est défini à un facteur d'échelle près :Tout est défini à un facteur d'échelle près :
dioobs
diocaméras
focaleobs
focalecaméras
largeurécran
largeurplan focal= =facteur d'échelle =
Paramètres des camérasParamètres des caméras
Paramètres des camérasParamètres des caméras
focaledroite=obsPosz
facteur d'échelle
leftdroite= near2.focaledroite
(W + 2.obsPosx
facteur d'échelle)
rightdroite=near
2.focaledroite(W - 2.obsPosx
facteur d'échelle)
Paramètres des camérasParamètres des caméras
topdroite= W2.focaledroite
( 2.obsPosy
facteur d'échelle)-near
ratio
ratio = largeur / hauteur
bottomdroite=W
2.focaledroite( 2.obsPosy
facteur d'échelle)+near
ratio
Configuration des caméras GLConfiguration des caméras GL
Effets de déplacement de l’observateurEffets de déplacement de l’observateurMouvements Mouvements pseudoscopiquespseudoscopiques–– Phénomènes optiques Phénomènes optiques –– Liés aux mouvements de l’observateurLiés aux mouvements de l’observateur–– Perturbent la perception 3DPerturbent la perception 3D
•• Déplacement de l’imageDéplacement de l’image•• Changement de dimensions de l’imageChangement de dimensions de l’image
Mouvements Mouvements pseudoscopiquespseudoscopiquesRapprochement de l’imageRapprochement de l’image
écran
Mouvements Mouvements pseudoscopiquespseudoscopiquesRapprochement de l’imageRapprochement de l’image
écran
l'observateur se rapproche de l'écran l'objet virtuel se rapproche de l'écran
Mouvements Mouvements pseudoscopiquespseudoscopiquesDéplacement de l’imageDéplacement de l’image
écran
Mouvements Mouvements pseudoscopiquespseudoscopiquesDéplacement de l’imageDéplacement de l’image
écran
l'observateur se décale par rapport à l'écran
l'objet virtuel se décale par rapport à l'écran
Mouvements Mouvements pseudoscopiquespseudoscopiquesChangement d’échelleChangement d’échelle
écran
Mouvements Mouvements pseudoscopiquespseudoscopiquesChangement d’échelleChangement d’échelle
écran
l'observateur se rapproche de l'écran diminution la taille de l’objet
Mouvements Mouvements pseudoscopiquespseudoscopiquesChangement d’échelleChangement d’échelle
écran
Mouvements Mouvements pseudoscopiquespseudoscopiquesChangement d’échelleChangement d’échelle
écran
l'observateur se rapproche de l'écran agrandissement de l’objet
Mouvement Mouvement pseudoscopiquepseudoscopiqueDéplacement de l’observateur devant l’écranDéplacement de l’observateur devant l’écran–– Modifie la position et la dimension visible des objetsModifie la position et la dimension visible des objets
Besoin d’une correction de l’image en fonction Besoin d’une correction de l’image en fonction de la position de l’observateurde la position de l’observateur–– Déplacement des caméras virtuellesDéplacement des caméras virtuelles
Périphérique d’acquisition de la position de Périphérique d’acquisition de la position de l’observateur devant l’écranl’observateur devant l’écran
Ensemble de caméra permettant le placement de Ensemble de caméra permettant le placement de l’observateurl’observateur
AsservissementAsservissementDéplacement des projections des objets en Déplacement des projections des objets en fonction du déplacement de l’observateurfonction du déplacement de l’observateur–– Nécessite un périphérique d’acquisition de la position Nécessite un périphérique d’acquisition de la position
de l’observateur en temps réelde l’observateur en temps réel
écran écran
AsservissementAsservissement
AsservissementAsservissement
AsservissementAsservissementPoint de vue de l’observateurPoint de vue de l’observateur
Benoît PirandaBenoît PirandaÉquipe SISARÉquipe SISARUniversité de Marne La ValléeUniversité de Marne La Vallée
Outils de réalité virtuelleOutils de réalité virtuelle
Programmation de la stéréoscopie sous Programmation de la stéréoscopie sous OpenGLOpenGL
PrincipePrincipeUtilisation des complémentaires de couleursUtilisation des complémentaires de couleursRéalisation de deux images superposéesRéalisation de deux images superposées
1.1. Sélection d’un filtre de couleurSélection d’un filtre de couleur2.2. Définition de la caméra pour le premier œilDéfinition de la caméra pour le premier œil3.3. Dessin de la scèneDessin de la scène4.4. Sélection du filtre de couleur complémentaireSélection du filtre de couleur complémentaire5.5. Définition de la caméra pour le deuxième œilDéfinition de la caméra pour le deuxième œil6.6. Dessin de la scèneDessin de la scène
Outils Outils OpenGLOpenGL–– Fonction de filtrage des couleursFonction de filtrage des couleurs
–– glColorMask(r, v, b, a);
–– Coefficients de masquage des composantes de couleur Coefficients de masquage des composantes de couleur de l’imagede l’image
–– r, v, b & a : booléenr, v, b & a : booléen–– GL_FALSE = composante non affichéeGL_FALSE = composante non affichée–– GL_TRUE = affichage de la composanteGL_TRUE = affichage de la composante
–– Attention, le fond apparaît sous les couches à Attention, le fond apparaît sous les couches à GL_FALSEGL_FALSE
Exemple de projectionExemple de projection
glColorMask(1,0,0,0) glColorMask(0,1,1,0)
Exemple de programmationExemple de programmationFaux 3D par simple décalage des deux imagesFaux 3D par simple décalage des deux images
// effacement du buffer de couleurglClear(GL_COLOR_BUFFER_BIT);// masque rouge glColorMask(GL_TRUE,GL_FALSE,GL_FALSE,GL_FALSE); // image à l’origineglRasterPos2d(-1,-1);glDrawPixels(lx,ly,GL_RGB,GL_UNSIGNED_BYTE,image);// masque cyanglColorMask(GL_FALSE,GL_TRUE,GL_TRUE,GL_FALSE);// image décaléeglRasterPos2d(-1+8.0/lx,-1);glDrawPixels(lx,ly,GL_RGB,GL_UNSIGNED_BYTE,image);
Utilisation d’image réellesUtilisation d’image réellesPrise de vue décalée de la distance interoculairePrise de vue décalée de la distance interoculaire
Synthèse d’images stéréoscopiquesSynthèse d’images stéréoscopiquesSynthèse d’images en deux passesSynthèse d’images en deux passes–– Initialisation des Initialisation des buffers buffers de couleur et de profondeurde couleur et de profondeur–– Activation du filtre de l’œil gaucheActivation du filtre de l’œil gauche–– Réglage de la caméra gaucheRéglage de la caméra gauche–– Dessin de l’image de gaucheDessin de l’image de gauche–– Initialisation du Initialisation du buffer buffer de profondeurde profondeur–– Activation du filtre de l’œil droitActivation du filtre de l’œil droit–– Réglage de la caméra droiteRéglage de la caméra droite–– Dessin de l’image de droiteDessin de l’image de droite
// effacement des buffers de couleur et de profondeurglClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);// masque rouge glColorMask(GL_TRUE,GL_FALSE,GL_FALSE,GL_FALSE); // Caméra de gauche
ExemplesExemples
Benoît PirandaBenoît PirandaÉquipe SISARÉquipe SISARUniversité de Marne La ValléeUniversité de Marne La Vallée
Synthèse d’imageSynthèse d’image
Outils pour la réalité virtuelleOutils pour la réalité virtuelle
Atelier de réalité virtuelleAtelier de réalité virtuelle
projecteursvidéo
PC1
PC2
réseau
écran
caméra
utilisateur
enceintes
lunettesstylo
Module de projection stéréoscopiqueModule de projection stéréoscopiqueSystème de projection stéréoscopiqueSystème de projection stéréoscopique
Vidéo projection de deux flux vidéo superposésVidéo projection de deux flux vidéo superposésUtilisation de filtres polarisants passifsUtilisation de filtres polarisants passifsGrand écran de projection non dépolarisantsGrand écran de projection non dépolarisantsRétro projectionRétro projection
Module de projection stéréoscopiqueModule de projection stéréoscopique
Vidéo G
Vidéo D
filtrespolarisants
écran
lunettespolarisantes
yeux
Espace de rétro projection Espace de visualisation
Module de positionnement de l’utilisateurModule de positionnement de l’utilisateurSystème de positionnementSystème de positionnement
Acquisition vidéo de la scèneAcquisition vidéo de la scènePlacement tridimensionnel de l’utilisateur et d’outilsPlacement tridimensionnel de l’utilisateur et d’outils
AutoAuto--calibrationcalibration des camérasdes caméras
Module de positionnement de l’utilisateurModule de positionnement de l’utilisateur
CaméraDV
CaméraDV
Sources lumineuses
Module de positionnement de l’utilisateurModule de positionnement de l’utilisateurTraitementTraitement–– Extraction des «Extraction des « points chaudspoints chauds »»–– Corrélation des points chauds entre les deux sourcesCorrélation des points chauds entre les deux sources–– Calcul de la position 3DCalcul de la position 3D
Module de spatialisation du sonModule de spatialisation du sonSynthétisation Synthétisation du son du son –– pour chaque source pour chaque source –– en fonction de la position de l’utilisateuren fonction de la position de l’utilisateur
Traitements en temps réelTraitements en temps réelMachine d’acquisition d’imageMachine d’acquisition d’image–– Contrainte temporelleContrainte temporelle
•• 25 images secondes 25 images secondes –– Décompression des 2 flux DVDécompression des 2 flux DV–– Recherche des points chaudsRecherche des points chauds–– Calcul de la position 3D du pointCalcul de la position 3D du point–– Transmission des résultatsTransmission des résultats
Machine de synthèse d’image et de sonMachine de synthèse d’image et de son–– Contrainte temporelleContrainte temporelle
•• Au moins 25 images secondes Au moins 25 images secondes –– Réception des informations géométriquesRéception des informations géométriques–– Génération de la scène 3DGénération de la scène 3D–– Synthèse des deux images (binoculaire)Synthèse des deux images (binoculaire)–– Synthèse des 8 sonsSynthèse des 8 sons
Benoît PirandaBenoît PirandaÉquipe SISARÉquipe SISARUniversité de Marne La ValléeUniversité de Marne La Vallée
Outils de réalité virtuelleOutils de réalité virtuelle
Programmation temps réelProgrammation temps réel
Programmation temps réelProgrammation temps réelPrise en compte du temps d’exécution dans Prise en compte du temps d’exécution dans l’écriture du programmel’écriture du programme–– Utilisation de fonctions câbléesUtilisation de fonctions câblées–– Calculs optimisés pour la vitesse d’exécution au Calculs optimisés pour la vitesse d’exécution au
détriment de la précision ou de la mémoire utilisédétriment de la précision ou de la mémoire utilisé•• Utilisation de tablesUtilisation de tables
Programmation temps réelProgrammation temps réelUn exemple : copie d’une vidéo dans une image Un exemple : copie d’une vidéo dans une image de texture en temps réelde texture en temps réel–– Acquisition d’une ‘Acquisition d’une ‘frame’frame’ vidéovidéo–– Insertion dans une image 1024x1024Insertion dans une image 1024x1024–– Plaquage de la texturePlaquage de la texture–– Affichage de l’imageAffichage de l’image
VidéoVidéo TextureTexture
Mémorisation de l’image en mémoireMémorisation de l’image en mémoireUtilisation d’un tableau à une seule dimensionUtilisation d’un tableau à une seule dimension–– Simplification de l’accès à une celluleSimplification de l’accès à une cellule–– Optimisation des algorithmes de traitementOptimisation des algorithmes de traitement
Tableau à deux dimensionsTableau à deux dimensionsEn C : gestion des tableaux à deux dimensionsEn C : gestion des tableaux à deux dimensions–– Tableau de pointeur sur des tableaux (lignes)Tableau de pointeur sur des tableaux (lignes)–– Coordonnées d’une cellule tableau[ligne][colonne]Coordonnées d’une cellule tableau[ligne][colonne]float matrice[12][8];:Matrice[10][5]=1.0;
1.01.0
00 11 22 33 44 55 66 77 88 9900112233445566778899
10101111
∑ ∏= +=
⎟⎟⎠
⎞⎜⎜⎝
⎛×
m
j
m
jkkj ni
1 1
Gestions des tableaux à n dimensionsGestions des tableaux à n dimensionsUn tableaux à n dimensionsUn tableaux à n dimensions–– Peut être mémorisé comme un tableau à 1 dimensionPeut être mémorisé comme un tableau à 1 dimension
•• Succession linéaire des cellulesSuccession linéaire des cellules•• Il faut définir un ordre de parcours du tableau linéaireIl faut définir un ordre de parcours du tableau linéaire
–– PrincipePrincipeSoit un tableau Soit un tableau tabtab de tailles de tailles [n[n11][n][n22]…[n]…[nmm]]La cellule La cellule tab[itab[i11][i][i22]…[]…[iimm]] est à la position :est à la position : ∑ ∏
= +=⎟⎟⎠
⎞⎜⎜⎝
⎛×
m
j
m
jkkj ni
1 1
Par exemple pour un tableau Par exemple pour un tableau tabtab de tailles [nde tailles [n11][n][n22]]La cellule La cellule tab[itab[i11][i][i22]] est à la position : iest à la position : i11*n*n22+i+i22
Gestions des tableaux à n dimensionsGestions des tableaux à n dimensionsPar exemple pour un tableau Par exemple pour un tableau tabtab de tailles [6][8]de tailles [6][8]La cellule La cellule tab[itab[i11][i][i22]] est à la position : iest à la position : i11*8+i*8+i22
4747464645454444434342424141404055
3939383837373636353534343333323244
3131303029292828272726262525242433
2323222221212020191918181717161622
151514141313121211111010998811
776655443322110000
7766554433221100
00 00
00
11
11
22
22
33
33
44
44
55
55
66
66
77
77
……
……
1414
1414
1313
1313
1212
1212
1111
1111
1010
1010
99
99
88
88
Tableaux et pointeursTableaux et pointeursUn tableau Un tableau –– Un pointeur sur le premier élémentUn pointeur sur le premier élément–– Un ensemble d’éléments contigus Un ensemble d’éléments contigus
int *ptr,tab[20];
ptr = tab;
*ptr ⇔ tab[0]
*(ptr+i] ⇔ tab[i]
ptr pointe sur le premier élément du tableauDonc le contenu de l’élément pointé parptr est le contenu du premier élément du tableau.
Donc le contenu de l’élément pointé par l’adresse de ptr+i est le contenu de la (i+1)ème cellule du tableau.
Parcours d’un tableauParcours d’un tableau
#define NB_ELEMENTS 10int i,n,tab[NB_ELEMENTS];:n=0;for (i=0; i<NB_ELEMENTS; i++){ if (tab[i]==1) n++;}
Exemple : compter le nombre de valeurs 1 dans un tableau
Autre solution avec des pointeursAutre solution avec des pointeurs
#define NB_ELEMENTS 10int i,n,tab[NB_ELEMENTS],*ptr;:n=0;ptr = tab;for (i=0; i<NB_ELEMENTS; i++){ if (*ptr==1) n++;
ptr++;}
Exemple : compter le nombre de valeurs 1 dans un tableau
Avantage :Avantage :•• ne recalcule pas l’adresse de l’élément à chaque itérationne recalcule pas l’adresse de l’élément à chaque itération
Programmation temps réelProgrammation temps réelUn exemple : copie d’une vidéo dans une image Un exemple : copie d’une vidéo dans une image de texture en temps réelde texture en temps réel–– Source vidéo 720x576 tous les 25Source vidéo 720x576 tous les 25èmesèmes de secondede seconde–– Décompression de l’image vidéoDécompression de l’image vidéo–– Insertion dans une image 1024x1024Insertion dans une image 1024x1024–– Plaquage de la texturePlaquage de la texture–– Affichage de l’imageAffichage de l’image
vidéovidéo texturetexture
SRC_W = 720
SRC_H=576
TEX_W = 1024TEX_H = 1024
Programmation temps réelProgrammation temps réelTemps de traitement disponibleTemps de traitement disponible–– 1/251/25èmeème de seconde soit 40 msde seconde soit 40 ms
Décompression logiciel d’un Décompression logiciel d’un frameframe DVDV–– Entre 18 et 20 msEntre 18 et 20 ms
Plaquage de la texture et création de l’image 3DPlaquage de la texture et création de l’image 3D–– Environ 15 msEnviron 15 ms
Reste pour l’insertion de la vidéo dans l’imageReste pour l’insertion de la vidéo dans l’image–– Environ 5 msEnviron 5 ms
Algorithme simplisteAlgorithme simplisteUtilisation de deux boucles imbriquéesUtilisation de deux boucles imbriquéesAccès absolu aux cellules des tableauxAccès absolu aux cellules des tableaux
int i,j;for (i=0; i<SRC_H; i++){ for (j=0; j<SRC_W*3; j++)
{ texture[TEX_W*3*i+j]=image[SRC_W*3*i+j];}
}
11 à 12 ms par image
Utilisation des pointeursUtilisation des pointeursPointeur sur chaque imagePointeur sur chaque image–– Déplacement simultané et accès relatifDéplacement simultané et accès relatif
int i=SRC_H,j;unsigned char *ptrTex=texture,
*ptrImg=image;// pour chaque ligne de l’imagewhile (i--){ j=TEX_W*3; // nombre de colonnes
// pour chaque colonnewhile (j--) *ptrTex++ = *ptrImg++;// décalage à la ligne suivanteptrTex+=(TEX_W-SRC_W)*3;
}9 à 10 ms par image
Détail sur les optimisationsDétail sur les optimisationsAccès absolu / relatif à la mémoireAccès absolu / relatif à la mémoire–– Accès absolu :Accès absolu :
•• Accès à une adresse mémoire avec un décalageAccès à une adresse mémoire avec un décalagetexture[TEX_W*3*i+j]texture+TEX_W*3*i+j
•• Lecture de plusieurs adresses mémoires (origine + décalage)Lecture de plusieurs adresses mémoires (origine + décalage)
–– Accès relatif :Accès relatif :•• Incrémentation par rapport à une position courante en Incrémentation par rapport à une position courante en
mémoiremémoireptrTex+=(TEX_W-SRC_W)*3*ptrTex++
•• Lecture d’une seule adresse mémoireLecture d’une seule adresse mémoire
Détail sur les optimisations (suite)Détail sur les optimisations (suite)Boucles forBoucles for–– Comparaison à chaque itérationComparaison à chaque itération
•• i < SRC_W i < SRC_W ii-- SRC_WSRC_W < 0 ?< 0 ?–– IncrIncréémentation en finmentation en fin
de traitementde traitement–– Permet l’utilisation de l’indice i dans la bouclePermet l’utilisation de l’indice i dans la boucle
Boucle optimisée Boucle optimisée whilewhile–– Comparaison à chaque itérationComparaison à chaque itération
•• i = 0 ?i = 0 ?–– DDéécrcréémentation en mmentation en mêême tempsme temps–– Ne permet l’utilisation de l’indice i dans la boucle (ou Ne permet l’utilisation de l’indice i dans la boucle (ou
dans l’ordre inverse)dans l’ordre inverse)
for (i=0; i<SRC_H; i++){…}
i=SRC_H;while (i--){…}
Outils de manipulation de la mémoireOutils de manipulation de la mémoireOptimisé pour la machine :Optimisé pour la machine :–– memsetmemset((((voidvoid*)*)destdest,char val,,char val,int nbreOctetsint nbreOctets))–– memcpymemcpy((((voidvoid*)*)destdest,(,(voidvoid*)*)srcsrc,,int nbreOctetsint nbreOctets))
int i=SRC_H;unsigned char *ptrTex = texture,*ptrImg=image;while (i--) { memcpy(ptrTex,ptrImg,SRC_W*3);ptrTex+=TEX_W*3;ptrImg+=SRC_W*3;
}
2 à 3 ms par image
Résultats en temps de calculRésultats en temps de calcul2 Machines différentes2 Machines différentes
2 à 32 à 3
9 à 109 à 10
11 à 1211 à 12
Temps en msTemps en msPCPC AthlonAthlon 1.8 1.8 GHzGHz
6 à 76 à 7SimplisteSimpliste
1 à 21 à 2MémoireMémoire
5 à 65 à 6PointeurPointeur
Temps en msTemps en msPC PC PentiumPentium IV 2.1 IV 2.1 GHzGHz
AlgorithmeAlgorithme
Benoît PirandaBenoît PirandaÉquipe SISARÉquipe SISARUniversité de Marne La ValléeUniversité de Marne La Vallée
Outils de réalité virtuelleOutils de réalité virtuelle
Programmation de l’acquisition vidéo Programmation de l’acquisition vidéo DV sous linuxDV sous linux
Programmation de l’acquisition vidéo DVProgrammation de l’acquisition vidéo DVLe format DVLe format DV–– Compression de type JPEGCompression de type JPEG–– Images (Images (framesframes) indépendantes) indépendantes–– Synchronisation image et sonSynchronisation image et son
ImageImage–– Résolution : Résolution :
•• PAL 720x576, 25 images / secondePAL 720x576, 25 images / seconde•• NTSC 720x480, 30 images /secondeNTSC 720x480, 30 images /seconde
Son qualité CDSon qualité CD–– Fréquence : 44100 échantillons / secondeFréquence : 44100 échantillons / seconde–– Précision : 2 octets / échantillonPrécision : 2 octets / échantillon–– 1 ou 2 voies stéréos1 ou 2 voies stéréos
Programmation de la vidéo DVProgrammation de la vidéo DVAccès au port DV Accès au port DV FireWireFireWire IEEE1394IEEE1394–– Bibliothèque libraw1394/raw1394.hBibliothèque libraw1394/raw1394.h
Décompression image et son du flux DVDécompression image et son du flux DV–– Bibliothèques <Bibliothèques <libdvlibdv//dvdv_types.h> et <_types.h> et <libdvlibdv//dvdv.h> .h>
Lecture entête Lecture entête aviavi
Programmation de la vidéo DVProgrammation de la vidéo DVPrincipe de l’émission DVPrincipe de l’émission DV–– Envoi de 300 paquets de 480 octets chacunEnvoi de 300 paquets de 480 octets chacun
•• EntêteEntête•• Données son et image qui doivent être placées en mémoire à Données son et image qui doivent être placées en mémoire à
la voléela volée
–– 144000 octets pour une trame144000 octets pour une trame•• 720x576x3 = 1244160 octets pour l’image720x576x3 = 1244160 octets pour l’image•• 2x2x44100/25 = 7056 octets pour le son2x2x44100/25 = 7056 octets pour le son•• Soit 1 251 216 octets compressés Soit 1 251 216 octets compressés
Gain : 88,5 % Gain : 88,5 %
Lecture du port Lecture du port FireWireFireWireFonctions de lecture du port IEEE1394Fonctions de lecture du port IEEE1394
#define CHANEL_ALL 63raw1394handle_t handle;int g_card=1;
/* demande d’un identifiant*/if (!(handle = raw1394_new_handle())) {exit(-1);}
/* ouverture d’un port sur la carte g_card */ if (raw1394_set_port(handle, g_card) < 0) { exit( -1); }
/* association d’une fonction de réception des paquets */ raw1394_set_iso_handler(handle, channel, raw_iso_handler);
/* association d’une fonction de réinitialisation du périphérique */ raw1394_set_bus_reset_handler(handle, my_reset_handler)
/* lancement de la lecture sur le portif (raw1394_start_iso_rcv(handle, channel) < 0) { exit( -1); }
Lecture du portLecture du port FireWireFireWireFonction appelée à chaque réception d’un Fonction appelée à chaque réception d’un paquet, encodage des informations d’une paquet, encodage des informations d’une frameframe..
int raw_iso_handler(raw1394handle_t handle, int channel, size_t length, quadlet_t *data){ if (length>16)
{ unsigned char *p = (unsigned char*) & data[3],*buffer;int section_type = p[0] >> 5, dif_sequence = p[1] >> 4, dif_block = p[2];
if (section_type == 0 && dif_sequence == 0) { // fin de frame…}
switch (section_type){ case 0: memcpy(buffer+dif_sequence*150*80, p, 480); break;
case 1: memcpy(buffer+dif_sequence*150*80+(1+dif_block)*80,p,480); break; case 2: memcpy(buffer+dif_sequence*150*80+(3+dif_block)*80,p,480); break; case 3: memcpy(buffer+dif_sequence*150*80+(6+dif_block*16)*80,p,480); break;case 4: memcpy(buffer+dif_sequence*150*80+(7+(dif_block/15)+dif_block)*80,p,480); break;
}}return 0;
}
Lecture du portLecture du port FireWireFireWire
/* fermeture du port, /* fermeture du port, indispensable pour une réouverture ultérieure */indispensable pour une réouverture ultérieure */
close_1394_driver(CHANEL_ALL,close_1394_driver(CHANEL_ALL, handlehandle); );
Programmation Programmation multimulti--processusprocessusDeux processusDeux processus–– Processus de lecture du port DVProcessus de lecture du port DV–– Processus d’affichageProcessus d’affichage
SynchronisationSynchronisation–– BufferDV BufferDV plein : plein : frame frame prêt à être décompresséprêt à être décompressé
Problème : Problème : –– Ne pas perdre de trame pendant la décompressionNe pas perdre de trame pendant la décompression–– Nécessité de deux Nécessité de deux BuffersBuffers
•• Buffer Buffer de chargementde chargement•• Buffer Buffer de décompressionde décompression
int pitches[3]= { 720 * 3, 0, 0 };dv_decoder_t *td;
td=dv_decoder_new(TRUE,TRUE,FALSE);td->quality=DV_QUALITY_BEST;
dv_parse_header(td,buffer);dv_decode_full_frame(td,buffer,e_dv_color_rgb,&image,pitches);
if (dv_decode_full_audio(td, buffer,(int16_t**) audioBuffers)) { n = td->audio->samples_this_frame;…
}dv_decoder_free(td);
Utilisation de la bibliothèque Utilisation de la bibliothèque libdvlibdv//dvdv.h.hInitialisation du décodeur Initialisation du décodeur Décompression du flux vidéoDécompression du flux vidéoDécompression du flux sonDécompression du flux son
Exemples d’applicationsExemples d’applicationsAffichage des flux sur un maillage de facettesAffichage des flux sur un maillage de facettes–– Image : textureImage : texture–– Son : déformation de la surfaceSon : déformation de la surface
Lecture d’une vidéo au format AVILecture d’une vidéo au format AVI--DVDVSyntaxe du format AVISyntaxe du format AVI–– Spécification au format RIFFSpécification au format RIFF
•• Codage binaire Codage binaire littlelittle--EndianEndian•• Code utilisant des quadruplets d’octetsCode utilisant des quadruplets d’octets
IdentifiantsIdentifiants : 4 caractères: 4 caractèresTailles, valeurs numériques : entier longTailles, valeurs numériques : entier long
Entête : 3 quadruplets puis les donnéesEntête : 3 quadruplets puis les données–– ‘‘RIFFRIFF’’tailletaille typetype donndonnééeses
•• tailletaille (entier long) : taille des donn(entier long) : taille des donnéées dans le fichier,es dans le fichier,•• typetype (cha(chaîîne de 4 caractne de 4 caractèères) : le format des donnres) : le format des donnéées, dans es, dans
notre cas cette chanotre cas cette chaîîne contiendra ne contiendra ‘‘AVI_AVI_’’,,•• donndonnééeses contient des structures de type :contient des structures de type :
LIST et des paramLIST et des paramèètres qui suivent tres qui suivent JUNK JUNK tailletaille
Lecture d’une vidéo au format AVILecture d’une vidéo au format AVI--DVDV–– Structures de donnéesStructures de données
•• LIST LIST tailletaille typetype donndonnééesesType Type hdrlhdrl : paramètres de l’entête : paramètres de l’entête aviaviType Type movimovi : liste de blocs de données: liste de blocs de données
•• JUNK JUNK tailletaillePermet de décaler des données dans les fichiers AVIPermet de décaler des données dans les fichiers AVILes données ne doivent pas être interprétéesLes données ne doivent pas être interprétées
Lecture d’une vidéo au format AVILecture d’une vidéo au format AVI--DVDVDonnées de type Données de type hdrlhdrl
typedef struct{signed long dwMicroSecPerFrame; // frame display rate(or 0L)signed long dwMaxBytesPerSec; // max. transfer ratesigned long dwPaddingGranularity; // pad to multiples of this// size; normally 2K.signed long dwFlags; // the ever-present flagssigned long dwTotalFrames; // # frames in filesigned long dwInitialFrames;signed long dwStreams;signed long dwSuggestedBufferSize;signed long dwWidth;signed long dwHeight;signed long dwReserved[4];
} MainAVIHeader;
Frame DVFlux audioFrame DVFrame DV
Lecture d’une vidéo au format AVILecture d’une vidéo au format AVI--DVDVDonnées de type Données de type movimovi–– Type :Type :
•• 2 parties2 partiesNuméro de flux (2 octets)Numéro de flux (2 octets)Type de donnée (2octets)Type de donnée (2octets)
•• Type 00dc Type 00dc tailletaille :: frameframe DV compressé pour le flux 00DV compressé pour le flux 00•• Type 00db Type 00db tailletaille :: frameframe nonnon--compressé pour le flux 00compressé pour le flux 00•• Type 01wb Type 01wb tailletaille : données audio pour le flux 01: données audio pour le flux 01•• Type 00pc Type 00pc tailletaille : changement de palette de couleur: changement de palette de couleur
moviXXXX00dc14400000dc14400001wbXXXX00dc144000
Lecture d’une vidéo au format AVILecture d’une vidéo au format AVI--DVDVFormat général des données AVIFormat général des données AVI--DVDV
RIFF ('AVI 'LIST ('hdrl'
'avih'(<Main AVI Header>)LIST ('strl'
'strh'(<Stream header>)'strf'(<Stream format>)[ 'strd'(<Additional header data>) ][ 'strn'(<Stream name>) ]...
)...
)LIST ('movi'
{SubChunk | LIST ('rec 'SubChunk1SubChunk2...
)...
}...
)['idx1' (<AVI Index>) ])
Exemple de programmationExemple de programmationclass AVI_LIST{ protected : AVI_LIST *suivant;
public :AVI_LIST(AVI_LIST *s) { suivant=s; };virtual ~AVI_LIST() { delete suivant; };virtual int getNbreFrames();virtual int getDataIndex();
};class AVI_LIST_STRL : public AVI_LIST{ AVIStreamHeader stream;
public :AVI_LIST_STRL(ifstream &,AVI_LIST *s);
};class AVI_LIST_HDRL : public AVI_LIST{ MainAVIHeader main;
AVI_LIST *als;public :AVI_LIST_HDRL(ifstream &,AVI_LIST *s);~AVI_LIST_HDRL() { delete als; delete suivant; };int getNbreFrames();
};
class AVI_LIST_MOVI : public AVI_LIST{ int index;
public :AVI_LIST_MOVI(ifstream &,AVI_LIST *s);int getDataIndex();
};class AVI_RIFF{ AVI_LIST *premier;
public :AVI_RIFF(ifstream &);~AVI_RIFF() { delete premier; };int getNbreFrames();int getDataIndex();
};