J'ai essayé d'utiliser le code suivant:
xCoordinate=point.x
(le point est le type de cv2.keyPoint) Cela me donne une erreur disant que cv2.keyPoint n'a pas d'attribut 'x'
6 réponses
Vous pouvez utiliser:
import numpy as np
pts = np.float([kp[idx].pt for idx in range(0, len(kp))]).reshape(-1, 1, 2)
pts
sera un array
de points clés.
Classe KeyPoint
Structure des données pour les détecteurs de points saillants.
Point2f pt - coordonnées du point clé
taille du flotteur - diamètre du voisinage significatif des points clés
angle de flottement ... ¶
Donc point.pt
est un Point2f.
Essayez x,y= point.pt
Voici ma prise (code exécutable):
import cv2, os
import numpy as np
import matplotlib.pyplot as plt
# INITIALISATION
filename = os.path.join('foo', 'bar.jpg')
img0 = cv2.imread(filename) # original image
gray = cv2.cvtColor(img0, cv2.COLOR_BGR2GRAY) # convert to grayscale
sift = cv2.xfeatures2d.SIFT_create() # initialize SIFT
f, (ax1, ax2) = plt.subplots(1, 2) # create subplots
# DETECT AND DRAW KEYPOINTS
# sift.detect() returns a list of keypoints
# keypoint is a standard class of opencv (not just SIFT-related)
kp = sift.detect(gray,None) # calculates SIFT points
img1=cv2.drawKeypoints(gray,kp, None) # mae new image with keypoints drawn
ax1.imshow(img1) # plot
# RETREIVE KEYPOINTS COORDINATES AND DRAW MANUALLY
# Reade these and make numpy array
pts = np.asarray([[p.pt[0], p.pt[1]] for p in kp])
cols = pts[:,0]
rows = pts[:,1]
ax2.imshow(cv2.cvtColor(img0, cv2.COLOR_BGR2RGB))
ax2.scatter(cols, rows)
plt.show()
point.pt is a tuple
(x, y) `.
Donc,
x = point.pt[0]
y = point.pt[1]
Ou,
(x,y) = point.pt
J'ai résolu votre problème comme ça.
kp,des = surf.detectAndCompute(img,None)
pts = [p.pt for p in kp]
Vous obtenez maintenant une liste de coordonnées x, y pour tous les points clés de votre image.
OpenCV fournit une fonction pour cela. Tu peux courir:
pts = cv2.KeyPoint_convert(kp)
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.