Quel est le lien entre l'homographie calculée sur 2 images et l'homographie calculée sur les mêmes images à l'envers?


9

Avec OpenCV , je calcule l'homographie entre, disons, ces deux images:

première image

et

deuxième image

Ne vous inquiétez pas de l'étrange forme blanche sur le côté droit, cela est dû au support de smartphone que j'utilise. La homographie, donnée par findHomography () fonction ( en utilisant des points détectés par le détecteur de caractéristique rapide et le descripteur de HammingLUT matcher ), est la suivante :

A = [ 1.412817430564191,  0.0684947165270289,  -517.7751355800591;
     -0.002927297251810,  1.210310757993256,     39.56631316477566;
      0.000290600259844, -9.348301989015293e-05,  1]

Maintenant, j'utilise le même processus pour calculer l'homographie entre les mêmes images qui ont été tournées de 180 degrés (à l'envers), en utilisant imagemagick (en fait, je serais également intéressé de connaître la relation pour une rotation de 90 ou 270 degrés ...). Les voici:

première image à l'envers

et

deuxième image à l'envers

Avec ces images, l'homographie devient:

B = [ 0.7148688519736168,  0.01978048500375845,  325.8330631554814;
     -0.1706219498833541,  0.8666521745094313,    64.72944905752504;
     -0.0002078857275647, -5.080048486810413e-05,  1]

Maintenant, la question est de savoir comment reliez-vous A et B? Les deux premières valeurs diagonales de A sont proches de l'inverse de la même chose en B, mais ce n'est pas très précis (0,707805537 au lieu de 0,71486885). Mon but ultime serait d'utiliser la relation souhaitée pour transformer la matrice finale, en évitant de calculer une rotation d'image coûteuse.

Réponses:


4

Hbune=R-tnT
Rbunetunebn

La relation entre les deux matrices réside dans le vecteur normal du plan. Vous devez donc obtenir le vecteur normal du plan (hors de la matrice d'homographie), lui appliquer la rotation, puis calculer la matrice d'homographie en utilisant la formule ci-dessus. Pour la décomposition correcte de la matrice d'homographie, vous pouvez consulter ces exemples de code et cet article .


Je ne comprends pas vraiment ce que tu veux dire. De l'équation, j'ai obtenu la normale avec Mat invT = 1./t; Mat n = invT.t() * (H - R);(en fait, c'est n/d). Maintenant, "lui appliquer la rotation" me donne un vecteur 3x1, mais comment puis-je l'utiliser pour calculer à nouveau la matrice d'homographie? Merci
Stéphane Péchard

Ajout d'informations supplémentaires, j'espère que cela est clair.
Geerten

pourquoi c'est - t / d et non + t / d?
Maystro
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.