2017-06-07 9 views
0

J'utilise les liaisons python pour opencv. J'utilise la détection et la description de point-clé (par exemple SURF, SIFT, ...) pour trouver une image de modèle contenue dans une image cible, mais il y a un accroc: le modèle peut être "pressé" dans l'image cible, le ratio est différent de l'image cible.Comment utiliser cv2.findHomography() avec des images pressées

Cela ne fonctionne pas avec findHomography(), car il suppose une transformation de perspective simple, qui ne peut pas avoir ce type d'étirement.

Y a-t-il des moyens de le faire? J'ai pensé à étirer progressivement l'image cible pour en changer le format et utiliser findHomography à chaque itération, mais pour autant que je sache, il n'y a aucun moyen de comparer la qualité d'un ajustement (puisque j'utilise RANSAC pour trouver le meilleur ajustement), donc je ne peux pas dire à quel niveau de compression il convient le mieux.

Peut-être compter le nombre de points qui correspondaient correctement à partir du RANSAC en regardant la longueur du masque retourné? Cela semble un peu grossier.

Répondre

1

Cela ne fonctionne pas avec findHomography(), car il suppose une transformation de perspective simple, qui ne peut pas avoir ce type d'étirement.

Ceci n'est pas vrai; même une chaîne affine comprend stretching the aspect ratios et même une distorsion de cisaillement, et les homographies l'élargissent même par des distorsions non uniformes. Par exemple, la transformation affine donnée par la matrice

2 0 0 
0 1 0 

va étirer une image horizontalement par un facteur de deux, comme on le voit avec ce programme court:

import cv2 
import numpy as np 

img = cv2.imread('lena.png') 
affine_warp = np.array([[2, 0, 0], [0, 1, 0]], dtype=np.float32) 
dsize = (img.shape[1]*2, img.shape[0]) 
warped_img = cv2.warpAffine(img, affine_warp, dsize) 

cv2.imshow("2x Horizontal Stretching", warped_img) 
cv2.waitKey(0) 

Produire la sortie: Lena stretched 2x wide

Donc, ce n'est pas votre problème. Les homographies permettent un gauchissement encore plus fort. Courez-vous RANSAC ou laissez la fonction findHomography() décider vos points via RANSAC? Veuillez poster votre sortie attendue et votre code actuel, éventuellement dans une nouvelle question qui reflète les problèmes que vous rencontrez.

+0

Merci, vous avez totalement raison. Mon code fonctionnait correctement, je me suis trompé quand je pensais que mes images étaient étirées, elles étaient juste rembourrées avec des trucs supplémentaires sur les côtés. J'ai mal compris l'article de Wikipédia sur l'homographie qui dit qu'une homographie raconte "deux images quelconques de la même surface plane", ce qui, je pensais, signifiait la même image sur une surface. Je n'avais pas réalisé que cela pouvait aussi encoder une transformation affine. Merci! –