Stéréoscopique Outils de réalité virtuellepiranda/CMS/ig8_stereo_rv.pdf · Système de...

Preview:

Citation preview

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();

};

Recommended