Matrice de Projection 3d à 2d

j'ai 3 points dans un espace 3D dont je connais les emplacements exacts. Supposons qu'ils soient:(x0,y0,z0),(x1,y1,z1) et (x2,y2,z2).

J'ai aussi une caméra qui regarde ces 3 points et je connais les emplacements 2D de ces 3 points sur le plan de vue caméra. Ainsi, par exemple,(x0,y0,z0) sera (x0',y0') et (x1,y1,z1) sera (x1',y1') et (x2,y2,z2) sera (x2',y2') du point de vue de la caméra.

Quelle est la meilleure façon de trouver la matrice de projection qui projette ces points 3D en points 2D sur le plan de la caméra. On ne sait rien sur l'emplacement de la caméra.

16
demandé sur Laurent 2008-09-25 04:37:52

4 réponses

cela vous donne deux ensembles, chacun de trois équations en 3 variables:

a*x0+b*y0+c*z0 = x0'
a*x1+b*y1+c*z1 = x1'
a*x2+b*y2+c*z2 = x2'

d*x0+e*y0+f*z0 = y0'
d*x1+e*y1+f*z1 = y1'
d*x2+e*y2+f*z2 = y2'

utilisez simplement n'importe quelle méthode de résolution d'équations simultanées qui est la plus facile dans votre situation (il n'est même pas difficile de les résoudre "à la main"). Alors votre matrice de transformation est juste ((a,b,C)(D,e, f)).

...

en fait, c'est trop simplifié et suppose une caméra pointée à l'origine de votre système de coordonnées 3D et sans perspective.

pour la perspective, le transformation matrix fonctionne plus comme:

               ( a, b, c, d )   ( xt )
( x, y, z, 1 ) ( e, f, g, h ) = ( yt )
               ( i, j, k, l )   ( zt )

( xv, yv ) = ( xc+s*xt/zt, yc+s*yt/zt ) if md < zt;

mais la matrice 4x3 est plus restreinte que 12 degrés de liberté puisque nous devrions avoir

a*a+b*b+c*c = e*e+f*f+g*g = i*i+j*j+k*k = 1
a*a+e*e+i*i = b*b+f*f+j*j = c*c+g*g+k*k = 1

donc vous devriez probablement avoir 4 points pour obtenir 8 équations pour couvrir les 6 variables pour la position et l'angle de la caméra et 1 de plus pour la mise à l'échelle des points de vue 2-D puisque nous serons en mesure d'éliminer les coordonnées "centrales" (xc,yc).

donc si vous avez 4 points et transformez vos points de vue 2-D pour être relatif à le centre de votre écran, alors vous pouvez obtenir 14 équations simultanées dans 13 variables et résoudre.

12
répondu tye 2008-09-25 02:58:32

votre caméra a (au moins) 7 degrés de liberté - 3 pour la position, 3 pour l'orientation et 1 pour le FOV. Je suis sûr que quelqu'un me corrigera si je me trompe, mais il ne semble pas que 3 points soient suffisants pour une solution complète.

pour une solution généralisée à ce problème, cherchez 'View Correlation' dans Graphics Gems II.

3
répondu 2008-09-25 01:13:25

ce que vous recherchez s'appelle un algorithme D'Estimation de Pose. Regardez la mise en œuvre de POSIT dans OpenCV: http://opencv.willowgarage.com/documentation/c/calib3d_camera_calibration_and_3d_reconstruction.html#posit

vous aurez besoin de quatre points ou plus, et ils peuvent ne pas se trouver dans le même plan.

un tutoriel pour cette implémentation est ici: http://opencv.willowgarage.com/wiki/Posit

faites attention cependant: dans le tutoriel, un viewport carré est utilisé,de sorte que toutes les coordonnées de vue sont dans la gamme -1, -1 à 1,1. Ceci conduit à supposer que ceux-ci devraient se trouver dans le système de coordonnées de la caméra (avant la correction du rapport d'aspect). Ce n'est pas le cas,donc si vous utilisez un viewport avec par exemple un rapport d'aspect de 4:3,alors vos coordonnées d'entrée devraient être dans la gamme -1.3333, -1 à 1.3333, 1.

Par ailleurs, si vos points se situent dans le même plan, alors vous pouvez aussi regarder la CameraCalibration algorithme de OpenCV, mais cela est plus complexe et requiert plus de points en entrée. Cependant, il vous fournira également les informations de distorsion et les paramètres intrinsèques de votre caméra.

2
répondu Lex van der Sluijs 2011-02-14 09:35:35

je ne pense pas qu'il existe suffisamment d'informations pour trouver une solution définitive. Sans connaître l'emplacement de votre caméra et sans connaître votre plan de vision, il y a un nombre infini de matrices qui peuvent résoudre ce problème.

0
répondu Jim Buck 2008-09-25 01:08:34