2009-07-13 21 views
6

Suite à my previous question pour déterminer les paramètres de la caméra, j'ai formulé un nouveau problème.Déterminer la matrice de transformation

J'ai deux images du même rectangle:

La première est une image sans transformations et montre le rectangle tel qu'il est.

La deuxième image montre le rectangle après une transformation 3D (rotation XYZ, mise à l'échelle, translation XY). Cela a provoqué le rectangle pour ressembler à un trapèze.

J'espère que l'image ci-dessous décrit mon problème:

alt text http://wilco.menge.nl/application.data/cms/upload/transformation%20matrix.png

Comment déterminer quelles transformations (plus précisément: ce que la matrice de transformation) ont causé cette tranformation?

Je connais les emplacements de pixels des coins dans les deux images, donc je connais aussi les distances entre les coins.

Répondre

2

Je suis confus. Est-ce un 2d ou un problème 3d? De la façon dont je le comprends, vous avez un rectangle plat intégré dans l'espace 3D, et vous regardez deux «images» 2d de celui-ci - l'un de la version originale et l'autre basé sur la version transformée. Est-ce correct?

Si cela est correct, alors il n'y a pas assez d'informations pour résoudre le problème. Par exemple, supposons que les deux images aient exactement la même apparence. Cela peut être dû au fait que la traduction est l'identité, ou peut-être parce que la traduction déplace le rectangle deux fois plus loin de la caméra et double sa taille (ce qui lui donne exactement la même apparence).

+0

C'est un problème 3d. La première image est une image de référence du rectangle sur une échelle de 1: 1. La seconde peut être considérée comme une image du rectangle pris par une caméra. Je comprends votre point de vue qu'il existe plus de solutions (plus de matrices de transformation) à un cas particulier. Si c'est le cas, je suis heureux de choisir l'un ou l'autre. (Dans la situation que vous décrivez, je serais satisfait de la matrice d'identité ou de toute matrice qui donne le même résultat) – dwergkees

1

Ceci est un problème mathématique, pas la programmation ..

vous devez définir un ensemble d'équations (votre matrice de transformation, je suppose 3 équations), puis le résoudre pour les 4 transformations des points d'angle- .

Je n'ai jamais décrit cela en utilisant des mots allemands ... alors ce qui précède sonnera étrange ..

0

D'après les informations que vous avez, ce n'est pas si simple. Je vais vous donner quelques idées pour jouer avec, cependant. Si vous aviez les coordonnées 3D des coins, vous auriez un temps plus facile. Voici l'idée de base.

  1. Déplace un coin à l'origine. Par la suite, des rotations auront lieu autour de l'origine.
  2. Déterminer les vecteurs des axes. Pour ce faire, soustraire les coins adjacents du point d'origine. Ce sera un axe x et y local pour votre monde.
  3. Déterminer les angles en utilisant les vecteurs. Vous pouvez utiliser les produits pointillés et croisés pour déterminer l'angle entre l'axe x local et l'axe x global (1, 0, 0).
  4. Rotation de l'angle à l'étape 3. Cela vous donnera un nouvel axe x qui devrait correspondre à l'axe x global et un nouvel axe y local. Vous pouvez ensuite déterminer une autre rotation autour de l'axe x qui alignera l'axe y sur l'axe y global.

Sans les coordonnées z, vous pouvez voir que ce sera difficile, mais c'est le processus général.J'espère que ça aide.

0

La solution ne sera pas unique, comme le souligne Alex319.

Si la deuxième image est vraiment un trapèze comme vous le dites, ce ne sera pas trop difficile. C'est un trapèze (pas un parallélogramme) à cause de la perspective, donc il doit s'agir d'un trapèze isocèle.

Dessinez les deux diagonales. Ils se croisent au centre du rectangle, de sorte que cela prend en charge la traduction.

Tournez le trapèze jusqu'à ce que ses côtés parallèles soient parallèles aux deux côtés du rectangle d'origine. (Les deux? Peu importe.)

Dessinez un troisième parallèle par le centre. Mettre à l'échelle sur les côtés du rectangle que vous avez choisi.

Maintenant pour la rotation hors de l'avion. Mesurez la distance entre le centre et l'un des côtés parallèles et utilisez la loi des sinus.

Si ce n'est pas un trapèze, juste un quadra-latéral, alors ce sera plus dur, vous devrez utiliser les angles entre les diagonales pour trouver l'axe de rotation.