2015-10-06 2 views
0

@ Iwillnotexist Idonotexist a présenté son code pour l'image transformation en perspective (rotations autour de 3 axes): linktransformation en perspective inverse d'une image gauchie

Je suis à la recherche d'une fonction (ou mathématiques) pour faire une transformation en perspective inverse. Supposons que mon "image d'entrée" est le résultat de sa fonction warpImage(), et que tous les angles (thêta, phi et gamma), échelle et fovy sont également connus.

Je cherche une fonction (ou math) pour calculer la transformation inverse (la bordure noire n'a pas d'importance) pour obtenir une image primaire.

Comment est-ce que je peux faire ceci?

Répondre

0

L'idée de base est que vous devez trouver la transformation inverse. Dans la question liée, ils ont F = P T R1 R2P est la transformation projective, T est une traduction, et R1, R2 sont deux rotations.

Dénote F* comme transformation inverse. Nous pouvons l'inverse comme F* = R2* R1* T* P*. Notez les changements de commande. Trois d'entre eux sont faciles R1* est juste une autre rotation, mais avec l'angle nié. Donc, la première rotation inverse serait

 cos th sin th 0 0 
R1* = -sin th cos th 0 0 
      0  0  1 0 
      0    0 1 

Notez que les signes sur les deux termes de péché sont inversés.

L'inverse d'une translation est juste une translation dans la direction opposée.

 1  0  0  0 
T*= 0  1  0  0 
     0  0  1  h 
     0  0  0  1 

Vous pouvez vérifier ces calculs T * T qui devrait être la matrice d'identité.

Le plus délicat bit est la composante projective nous avons

 cot(fv/2) 0    0    0 
    P = 0  cot(fv/2)  0    0 
     0   0  -(f+n)/(f-n) -2 f n/(f-n) 
     0   0   -1    0 

L'inverse de c'est

 tan(fv/2) 0    0    0 
    P*= 0  tan(fv/2)  0    0 
     0   0   0    -2 
     0   0  (n-f)/(f n) (f+n)/(f n) 

Wolfram alpha inverse with v=fv

Vous devez ensuite multiplier ces ensemble dans l'ordre inverse pour obtenir la matrice finale.

+0

Merci beaucoup, mais ... Ça ne marche pas ... J'ai tout fait comme vous avez écrit, mais malheureusement cela ne fonctionne que pour les rotations autour du premier axe ("perpendiculaire à l'écran"). Lorsque j'essaie de faire pivoter l'image d'entrée autour de l'un des deux autres axes (même pour 1 degré), l'image résultante est vide ... Je calcule les matrices inverses R1, R2, R3 (j'ai changé sinus à -sinus), T (j'ai changé -h à h) et P comme tu l'as écrit ... Peut-être que je ne comprends pas ce que sont "fv" et "v" dans tes exemples (et dans Wolfram Alpha) ...? – paws

+0

Ah, il y avait une faute de frappe. Cela aurait dû être 'f n' pas' f v'. J'ai modifié ma réponse et non daté au lien de Wolfram. –

+0

Merci, mais ... toujours rien ... je pense, ça devrait aussi être "2 * f * n" au lieu de "f * n" au dénominateur dans P (3,2) et P (3,3) , n'est-ce pas? Mais peu importe, l'image transformée est un peu bizarre ... L'image entière est grise - quand je transforme une image d'échiquier, chaque pixel dans l'image transformée a la valeur 128, donc il semble que c'est une valeur moyenne ... Je n'ai aucune idée, ce que je fais mal ... Ce serait génial si vous ou quelqu'un regardiez mon code, mais je ne sais pas où je peux le mettre ... (il y en a trop moins espace dans ce bloc de commentaire) ... – paws