Comment visualiser le descripteur correspondant à l'aide d'opencv module en python
Je suis en train d'utiliser opencv avec python. J'ai écrit un descripteur SIFT, SURF, ou de l'ORBE) correspondant à un code en C++ version d'opencv 2.4. Je veux convertir ce code pour opencv avec python. J'ai trouvé quelques documents sur la façon d'utiliser opencv des fonctions en c++, mais de nombreux opencv fonction en python, je ne pouvais pas trouver comment les utiliser. Voici mon code python, et mon problème actuel est que je ne sais pas comment l'utiliser "drawMatches" de opencv c++, python. J'ai trouvé cv2.DRAW_MATCHES_FLAGS_DEFAULT mais je n'ai aucune idée de comment l'utiliser. Voici mon code python de la correspondance à l'aide de l'ORBE descripteurs:
im1 = cv2.imread(r'C:\boldt.jpg')
im2 = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
im3 = cv2.imread(r'C:\boldt_resize50.jpg')
im4 = cv2.cvtColor(im3, cv2.COLOR_BGR2GRAY)
orbDetector2 = cv2.FeatureDetector_create("ORB")
orbDescriptorExtractor2 = cv2.DescriptorExtractor_create("ORB")
orbDetector4 = cv2.FeatureDetector_create("ORB")
orbDescriptorExtractor4 = cv2.DescriptorExtractor_create("ORB")
keypoints2 = orbDetector2.detect(im2)
(keypoints2, descriptors2) = orbDescriptorExtractor2.compute(im2,keypoints2)
keypoints4 = orbDetector4.detect(im4)
(keypoints4, descriptors4) = orbDescriptorExtractor4.compute(im4,keypoints4)
matcher = cv2.DescriptorMatcher_create('BruteForce-Hamming')
raw_matches = matcher.match(descriptors2, descriptors4)
img_matches = cv2.DRAW_MATCHES_FLAGS_DEFAULT(im2, keypoints2, im4, keypoints4, raw_matches)
cv2.namedWindow("Match")
cv2.imshow( "Match", img_matches);
Message d'erreur de la ligne "img_matches = cv2.DRAW_MATCHES_FLAGS_DEFAULT(im2, keypoints2, im4, keypoints4, raw_matches)"
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'long' object is not callable
J'ai passé beaucoup de temps à rechercher de la documentation et des exemples d'utilisation de fonctions opencv avec python. Cependant, je suis très frustré car il y a très peu d'informations à l'aide d'opencv fonctions en python. Il vous sera extrêmement utile si quelqu'un peut me montrer où je peux trouver de la documentation d'utilisation de chaque fonction de la opencv module en python. Je vous remercie de votre temps et de l'aide.
OriginalL'auteur user1433201 | 2012-06-20
Vous devez vous connecter pour publier un commentaire.
vous pouvez visualiser la fonction de correspondance en Python ci-dessous. Notez l'utilisation de scipy bibliothèque.
TypeError: integer argument expected, got float
un utilisateur anonyme juste édité ton post, pourriez vouloir vérifier qu'ils n'ont pas brisé
vue[:h1 :w1, :] = img1 ValueError: pourrait ne pas diffuser tableau d'entrée de la forme (322,518) en forme (322,518,3)
Ok, le problème est que l'img n'est pas toujours à 3 canaux @cervelle a souligné. Cela dépend de la version d'OpenCV. Donc dans mon cas (je suis en utilisant 2.7.13), j'ai dû revenir à la version d'origine que wall-e posté
OriginalL'auteur wall-e
J'ai aussi écrit quelque chose de moi-même qui utilise juste le OpenCV Python interface et je n'ai pas utilisé
scipy
.drawMatches
fait partie de OpenCV 3.0.0 et ne fait pas partie de OpenCV 2, qui est ce que je suis en train d'utiliser. Même si je suis en retard à la fête, voici ma propre mise en œuvre qui imitedrawMatches
au meilleur de mes capacités.J'ai fourni mes propres images où l'on est d'un appareil photo homme, et l'autre est la même image mais avec une rotation de 55 degrés dans le sens antihoraire.
Le principe de base de ce que j'ai écrit, c'est que j'alloue une sortie RVB de l'image où le nombre de lignes est le maximum des deux images pour accueillir pour placer les deux images dans l'image de sortie et les colonnes sont simplement la somme des deux colonnes. Je place chaque image dans leurs taches correspondant, puis exécutez à travers une boucle de toutes les paires de keypoints. J'ai extrait ce qui keypoints mis en correspondance entre les deux images, puis de les extraire de leur
(x,y)
coordonnées. Ensuite, je dessine des cercles à chacun de l'emplacement détecté, puis tracez une ligne reliant ces cercles ensemble.Garder à l'esprit que l'détecté point crucial dans la seconde image est à l'égard de son propre système de coordonnées. Si vous voulez placer dans la sortie finale de l'image, il faut compenser la colonne de coordonner par le nombre de colonnes de la première image de sorte que la colonne de coordonner l'est à l'égard du système de coordonnées de l'image de sortie.
Sans plus tarder:
Pour bien montrer que cela fonctionne, voici les deux images que j'ai utilisé:
J'ai utilisé OpenCV l'ORBE de détecteur pour détecter les keypoints, et a utilisé le normalisé de Hamming distance sur la distance de mesure de similarité que c'est un binaire descripteur. En tant que tel:
C'est l'image que j'obtiens:
Lire la docstring de la fonction soigneusement. Il exige des images en niveaux de gris. Vous êtes à l'aide de RGB images. Vous avez besoin de convertir les images en niveaux de gris avant d'utiliser la fonction. Un simple appel
cv2.cvtColor
devrait suffire:img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
fonctionne. Veuillez lire la documentation de la fonction avant de l'utiliser la prochaine fois. C'est une norme de compétence tous les développeurs doivent apprendre lors de l'utilisation de quelqu'un d'autre code.OriginalL'auteur rayryeng
Que le message d'erreur dit, DRAW_MATCHES_FLAGS_DEFAULT est de type 'long'. C'est une constante définie par le cv2 module, pas une fonction. Malheureusement, la fonction que vous souhaitez, 'drawMatches' n'existe que dans OpenCV l'interface C++.
OriginalL'auteur Anonymous