Salut, J'ai posé le problème de la stéréoscopie en équation et je l'ai résolu (en utilisant Maple un logiciel de calcul formel). Je peux maintenant connaître les coordonnées spatiales d'un point à partir des 2 images des webcams G et D. Comme je suis resté volontairement très général, les caméras ne sont pas forcément parallèles. Elle n'ont par ailleurs pas forcément le même angle de vision (ce qui peut être pratique dans le cas où l'on récupère des webcams différentes), ni la même résolution. Si vous le voulez je peux vous dire comment j'ai fait. Mais, disons que cela est probablement rébarbatif. De ce fait, je m'en vais vous dire le strict nécessaire. J'entend par la : je vais vous donner les formules permettant de connaître la position spatiale d'un point à partir des 2 images en fonctions des différents paramètres. Je pose le problème comme suit : Je cherche à connaitre les coordonnées d'un point P dans l'espace. P a pour coordonnées (xG,zG) dans le repère de la caméra G et (xD,zD) dans le repère de la caméra D P apparaît à l'abscisse CamXD sur la caméra D et CamXG sur la caméra G. La caméra D a pour coordonnées (xcdg, zcdg) dans le repère de la caméra G désolé pour le nom, je l'ai choisi au départ et il me suit depuis.... Le repère de la caméra D est tourné d'un angle teta par rapport à celui de la caméra G La caméra D a une résolution LD et a un angle de vision de alphaD La caméra G a une résolution LG et a un angle de vision de alphaG A partir de la on peut obtenir le système de 4 équations suivant (je vous passe le cheminement) : 1° xG = xcdg + xD cos(teta) - zD sin(teta) 2° zG = zcdg + xD sin(teta) + zD cos(teta) 3° tan(1/2 alphaG) zG 1 ------------------ = ----------- xG CamXG 2 ----- - 1 LG 4° tan(1/2 alphaD) zD 1 ------------------ = ----------- xD CamXD 2 ----- - 1 LD J'envisage maintenant 4 cas : 1° cas général : les caméras peuvent pivoter toutes les deux, elles ont des angles de vision différents ainsi que des résolutions différentes. 2° les caméras peuvent pivoter toutes les deux, en revanche les caméras sont identiques (champ de vision, résolution) : LG = LD = L alphaG = alphaD = alpha 3° la caméra de gauche ne peut pas tourner. La caméra de droite peut tourner. En revanche, elle se situe obligatoirement sur l'axe des abscisses de la caméra de gauche. LG = LD = L alphaG = alphaD = alpha zcdg = 0 4° Les caméras sont parallèles, elles sont chacune sur l'axe des abscisses de l'autre (ie, axe de visée perpendiculaire au portique) LG = LD = L alphaG = alphaD = alpha Zcdg = 0 Teta = 0 Pour chacun de ces 4 cas, je vous donne maintenant les formules permettant de calculer la position du point P : (xG, zG) dans le repère de la caméra G ou (xD, zD) dans le repère de la caméra D (ATTENTION, pour les moins aguerris les formules suivantes représentent une quantité indigeste de symboles et de fonctions mathématiques, ames sensibles s'abstenir) Pour les autres, je vous suggère de faire pareil : allez voir en 4°, le cas des webcams //, les formules sont relativement simples. Et puis on passera aux exercices ! 1° Cas général xD = - tan(1/2 alphaD) (-4 tan(1/2 alphaG) CamXG zcdg CamXD + 2 tan(1/2 alphaG) CamXG zcdg LD + 2 LG xcdg CamXD - LG xcdg LD + 2 tan(1/2 alphaG) LG zcdg CamXD - tan(1/2 alphaG) LG zcdg LD)/(%1) zD = - LD ( -2 tan(1/2 alphaG) CamXG zcdg + LG xcdg + tan(1/2 alphaG) LG zcdg)/(%1) xG = tan(1/2 alphaG) ( -4 xcdg tan(1/2 alphaD) CamXG sin(teta) CamXD + 2 xcdg tan(1/2 alphaD) CamXG sin(teta) LD + 2 tan(1/2 alphaD) sin(teta) LG xcdg CamXD - tan(1/2 alphaD) sin(teta) LG xcdg LD + cos(teta) LD LG xcdg - 2 xcdg CamXG cos(teta) LD + 4 tan(1/2 alphaD) cos(teta) CamXG zcdg CamXD - 2 tan(1/2 alphaD) cos(teta) CamXG zcdg LD - 2 zcdg tan(1/2 alphaD) LG cos(teta) CamXD + zcdg tan(1/2 alphaD) LG cos(teta) LD - 2 sin(teta) LD CamXG zcdg + zcdg LG sin(teta) LD)/(%1) zG = - LG (-2 zcdg tan(1/2 alphaD) cos(teta) CamXD + zcdg tan(1/2 alphaD) cos(teta) LD + zcdg sin(teta) LD + 2 tan(1/2 alphaD) sin(teta) xcdg CamXD - tan(1/2 alphaD) sin(teta) xcdg LD + cos(teta) LD xcdg)/(%1) %1 := -4 tan(1/2 alphaD) tan(1/2 alphaG) CamXG sin(teta) CamXD + 2 tan(1/2 alphaD) tan(1/2 alphaG) CamXG sin(teta) LD + 2 tan(1/2 alphaD) tan(1/2 alphaG) LG sin(teta) CamXD - tan(1/2 alphaD) tan(1/2 alphaG) LG sin(teta) LD + 2 tan(1/2 alphaD) LG cos(teta) CamXD - tan(1/2 alphaD) LG cos(teta) LD + tan(1/2 alphaG) LG cos(teta) LD - 2 tan(1/2 alphaG) CamXG cos(teta) LD - LG sin(teta) LD 2° WC identiques xG = tan(1/2 alpha) ( 4 xcdg tan(1/2 alpha) CamXG sin(teta) CamXD - 2 xcdg tan(1/2 alpha) CamXG sin(teta) L - 2 tan(1/2 alpha) sin(teta) L xcdg CamXD 2 + tan(1/2 alpha) sin(teta) L xcdg + 2 xcdg CamXG cos(teta) L - 4 tan(1/2 alpha) cos(teta) CamXG zcdg CamXD 2 + 2 zcdg tan(1/2 alpha) CamXG cos(teta) L - L cos(teta) xcdg + 2 zcdg tan(1/2 alpha) L cos(teta) CamXD 2 - L cos(teta) tan(1/2 alpha) zcdg + 2 L sin(teta) CamXG zcdg 2 - zcdg L sin(teta))/(%1) zG = - L (2 zcdg tan(1/2 alpha) cos(teta) CamXD - zcdg L sin(teta) - 2 tan(1/2 alpha) sin(teta) xcdg CamXD + tan(1/2 alpha) sin(teta) L xcdg - L cos(teta) xcdg - L cos(teta) tan(1/2 alpha) zcdg)/(%1) xD = - tan(1/2 alpha) ( 4 tan(1/2 alpha) CamXG zcdg CamXD - 2 tan(1/2 alpha) CamXG zcdg L 2 - 2 L xcdg CamXD + L xcdg - 2 tan(1/2 alpha) CamXD L zcdg 2 + tan(1/2 alpha) L zcdg)/(%1) zD = L (-2 tan(1/2 alpha) CamXG zcdg + L xcdg + tan(1/2 alpha) L zcdg)/(%1) 2 %1 := 4 tan(1/2 alpha) CamXG sin(teta) CamXD 2 - 2 tan(1/2 alpha) CamXG sin(teta) L 2 - 2 tan(1/2 alpha) L sin(teta) CamXD 2 2 + tan(1/2 alpha) L sin(teta) - 2 tan(1/2 alpha) L cos(teta) CamXD 2 + 2 tan(1/2 alpha) CamXG cos(teta) L + L sin(teta) 3° Seule la WC droite peut tourner xG = xcdg tan(1/2 alpha) (4 tan(1/2 alpha) CamXG sin(teta) CamXD - 2 tan(1/2 alpha) CamXG sin(teta) L - 2 tan(1/2 alpha) L sin(teta) CamXD 2 + tan(1/2 alpha) L sin(teta) + 2 CamXG cos(teta) L 2 - L cos(teta))/(%1) zG = - L xcdg (-2 tan(1/2 alpha) sin(teta) CamXD + tan(1/2 alpha) L sin(teta) - L cos(teta))/(%1) tan(1/2 alpha) L xcdg (-2 CamXD + L) xD = - ------------------------------------ %1 2 L xcdg zD = ------- %1 2 %1 := 4 tan(1/2 alpha) CamXG sin(teta) CamXD 2 - 2 tan(1/2 alpha) CamXG sin(teta) L 2 - 2 tan(1/2 alpha) L sin(teta) CamXD 2 2 + tan(1/2 alpha) L sin(teta) - 2 tan(1/2 alpha) L cos(teta) CamXD 2 + 2 tan(1/2 alpha) CamXG cos(teta) L + L sin(teta) 4° ICI ****** cas des webcams // L xcdg z = 1/2 ------------------------------- tan(1/2 alpha) (-CamXD + CamXG) xcdg (-2 CamXG + L) xG = - 1/2 ------------------- -CamXD + CamXG xcdg (-2 CamXD + L) xD = - 1/2 ------------------- -CamXD + CamXG Aaaahhh ! déja ces formules elles sont presque lisibles ca fait plaisir. EXERCICE : retrouver la distance des tomates dans le premier document de Pascal sur la stéréoscopie. C'est à dire retrouver z. On remarque d'ailleurs dans la formule pour calculer z que l'on ne prend en compte que le décalage des pixels et non leurs valeurs en particulier. Je pars des données suivantes : - Les webcams sont // entre elles et perpendiculaires au portique comme dans le cas n°4 : teta = 0 zcdg = 0 - elles sont espacées de xcdg = 0,1 m - elles ont un champ de vision de alpha = 35° = 2*pi*35/360 radians = 0.6108 radians Pascal considère 2 cas, les tomates à 1,50m et à 0,75m. Donc z, calculé avec mes formules devra etre égal à ces valeurs.....suspens ! Dans chacun de ces cas, il considère les résolutions 320x240 puis 32x24 : L = 320 puis L = 32 Allez c'est parti : je mesure CamXG et CamXD les abscisses du pixel "centre-de-gravité-de-la-tomate" sur les images de gauche et de droite CamXG CamXD CamXG-CamXD 1,50m 320x240 173 141 32 32x24 17 15 2 (tu donnes 14 et 12 Pascal, erreur ?) 0,75m 320x240 199 127 72 (la tu as inversé les images, je pense qu'il était tard....) 32x24 20 13 7 Cool, maintenant j'applique mes formules et je calcul z : L xcdg z = 1/2 ------------------------------- tan(1/2 alpha) (-CamXD + CamXG) Je la simplifie un peu avant (en remplacant alpha et xcdg par leurs valeurs) z = 0.15859 * L / (camXG-CamXD) D'où le tableau suivant : z réel L z calculé avec +1 pixel avec -1 pixel (ie : "si j'avais considéré un décalage un peu plus grand (petit) d'1 pixel") ------------------------------ 1,50m 320 1,58m 1,53m 1,63m 32 2,53m 1,69m 5,07m (on voit que pour des petites résolutions ca peut etre sensible....) 0,75m 320 0,70m 0,69m 0,71 32 0,72m 0,63 0,84 Bon je me propose de prendre maintenant les nouvelles mesures de Pascal (bravo !!! je crois que t'es arrivé pas loin de la soluce y=a/x, normalement avec mes formules on peut calculer le a) DONNEES EXPERIMENTALES DE PASCAL DONNEES CALCULEES Distance 25 cm décalage des barycentres = 200 - 202 pixels 0,2537m - 0,2512m Distance 50 cm décalage des barycentres = 99 -100 pixels 0,51m - 0,507m Distance 75 cm décalage des barycentres = 66 pixels 0,768m Distance 100 cm décalage des barycentres = 50 - 53 pixels 1,014m - 0,957m Distance 150 cm décalage des barycentres = 34 - 35 pixels 1,492m - 1,449m Distance 200 cm décalage des barycentres = 26 pixels 1,95m En fait, je pense que tu t'es plus appliqué pour les mesures je trouve qu'elles sont meilleures. Voila, bon je crois que ca va etre tout pour aujourd'hui. A partir de la, il est possible de calculer des marges d'erreur, des choix de résolutions en fonction de la vitesse de SYR comme Pascal faisait avec Thomas par exemple, ou encore voir la différence entre un portique de 10cm et un de 20cm. Ceci dit pour rester pragmatique on fera pas un portique de 15m.... :) A plus tard, Yves.