2016-09-18 2 views
0

Je dois faire une erreur quelque part le long du chemin dans mes maths, mais je n'arrive pas à trouver la faille dans ma logique. Nous pouvons calculer l'orientation de rotation d'une caméra par rapport au système de coordonnées du monde en 3D en utilisant l'emplacement de 2 (sur 3) points de fuite du système mondial. Si la caméra est presque alignée avec le système mondial, nous pourrions trouver le point de fuite de l'axe X à la position (10000000, 0) sur le plan de l'image et le point de fuite de l'axe Y à la position (0, 10000000). Cela signifierait que les lignes sur ces axes sont presque parallèles dans l'image. Et avec K étant des paramètres internes, nous pouvons utiliser (ajouter un 1 à la matrice de point de fuite pour le rendre 3D) de l'appareil photo:Une minuscule variation de hauteur entraîne une rotation de 180 degrés lors du calcul de l'orientation à partir des points de fuite?

r1 = (K.inverse * vp_x)/norm(K.inverse * vp_x) 
r2 = (K.inverse * vp_y)/norm(K.inverse * vp_y) 
r3 = cross_product(r1, r2) 

Pour obtenir les 3 colonnes de la matrice de rotation, ce qui entraîne quelque chose près de:

1 0 0 
0 1 0 
0 0 1 

Ce qui est ce que nous attendons, puisque le système est presque aligné. Cependant, si nous inclinons légèrement la caméra, les lignes de l'axe Y convergent en valeurs négatives de y sur le plan de l'image. Par exemple, la position du point de fuite peut maintenant apparaître à (0, -10000000). Mais en utilisant le même calcul que précédemment, nous nous retrouvons avec une matrice de rotation:

1 0 0 
0 -1 0 
0 0 -1 

Ce qui suggère une rotation de 180 degrés autour de l'axe X. Bien sûr, nous sommes dans la même direction que précédemment, donc une rotation de 180 degrés n'a pas de sens. Je dois manquer quelque chose, mais je ne sais pas quoi. Aucune suggestion? Merci!

Répondre

2

Vous commencez à partir d'une mauvaise hypothèse. (convention: nous appelons le mouvement autour de l'axe Y comme pitch Mais l'axe Y est vertical dans la convention de la caméra.En convention aérospatiale l'axe vertical est Z. Parfois, en vision par ordinateur, il est préférable de l'appeler "panoramique". rouleau devient « basculement »)

1) Si vous avez un terrain mouvement, ce que vous varying est la convergence de axe X. Donc, déplacer vy de (0,1e6) vers (0, -1e6) n'est pas un mouvement de hauteur, mais une rotation autour de l'axe X (roulis).

2) Rappelez que la matrice de rotation peut avoir des singularités quand un sinus ou un cosinus passe à zéro. Ainsi, les dérivant dans cette condition pourrait être un problème

3) Du point 2, rappelez-vous que vous avez dit:

entraînant quelque chose près de

et il fait toute la différence! (Je vais le prouver avec du code Matlab) Je vais inverser l'équation en projetant les 3 versets du monde. Nous sommes intéressés par le mouvement de la hauteur donc je projette le verso de l'axe X (1,0,0). Notez le Z = 0 (ce versor était sur le plan de l'image) * Construisons une matrice de pas (see this reference)

R = [cos(a), 0, sin(a);0, 1, 0; -sin(a), 0 , cos(a)]; 
disp(R) 

M1 = [1; 0; 0]; 
u = K*R*M1; 
disp(u); 
M2 = [0; 1; 0]; 
v = K*R*M2; 
disp(v); 
M3 = [0; 0; 1]; 
w = K*R*M3; 
disp(w); 

Si j'ai un petit pas positif (a = 0,02) Je u égal à

495.9003 
    -3.9997 
    -0.0200 

puis avec un petit pas négatif (a = -0.02) u est égal à

503.8997 
    3.9997 
    0.0200 

Vous avez tous deux vecteurs (normaliser cette division par la norme qui est d'environ 500) et dans les deux cas, vous obtenir 1,0,0 mais vous perdez definetively l'information « direction » ce qui est différent. Oui, cet exemple concerne le segment projeté, mais l'idée est la même

4) Vous pouvez extimer les angles (en théorie) à partir de r3 sans négliger les composants proches de zéro.

angle de tangage (rotation autour de Y) = arctan (r3 (1)/r3 (3))

angle de roulis (rotation autour de X) = arcsin (r3 (2))

5) Si un angle de rotation est positif lorsqu'il est dans le sens antihoraire, le point de fuite devrait-il être positif ou négatif?


* parce que vous projetez un point avec déjà réside dans le plan d'image, un point à l'infini du centre de la caméra, il pourrait être projeté à la fois à droite et à gauche. Manipulez toujours "l'infini" avec soin