python ,opencv ,descripteur des points d'interets
Bonjour,
Nous voulons détecter les images en utilisant le descripteur de l'image afin de pouvoir retrouver les k plus proches voisins. A cet effet, nous avons utilisé la fonction kmatch de la librairie opencv mais les résultats ne sont pas satisfaisants donc nous avons cherché un peu partout mais toujours les mêmes fonctions sont utilisées . Nous vous demandons de regarder notre algorithme pour améliorer afin de trouver des bons résultats.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| def keypointsMatcher(queryImage, testFolder = "./test", modelFolder= "./model", distancePercentage=0.75):
sift = cv2.xfeatures2d.SIFT_create()
img1 = cv2.imread(os.path.join(testFolder, queryImage), 0) # queryImage
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1, None)
# read through the model folder
listOfModel = os.listdir(modelFolder)
print("Number of models "+str(len(listOfModel)))
print(len(des1))
print(len(kp1))
numberKpToSelect = len(kp1)//3
lilstOfSelectedModel = []
for model in listOfModel:
keyAndDescriptor = readDescriptorFileAndDrawKp(model)
kp2 = keyAndDescriptor[0]
print('kp2', len(kp2))
print('borne', len(kp1) - numberKpToSelect, 'borne', len(kp1) + numberKpToSelect)
if (len(kp2) >= len(kp1) - numberKpToSelect) and (len(kp2) <= len(kp1) + numberKpToSelect):
des2 = keyAndDescriptor[1]
print('first')
# BFMatcher with default params
bf = cv2.BFMatcher()
matches = bf.knnMatch(des2, des1, k=2)
# Apply ratio testold
good = []
if len(np.array(matches).shape) == 2 and np.array(matches).shape[1] == 2:
for m, n in matches:
if (m.distance < distancePercentage*n.distance):
good.append([m])
#rapport = len(good)/ len(kp1)
#if rapport >= 0.6:
lilstOfSelectedModel.append(model)
print(model, " ", "selected rapprot")
#print(lilstOfSelectedModel)
seen = []
for ob in lilstOfSelectedModel:
filename = ob.split("__")[0]
seen.append(filename)
listSeen = Counter(seen)
for element in listSeen:
print(element,' ', listSeen[element], " ",countCategoryElement(element), listSeen[element]/countCategoryElement(element))
print(len(lilstOfSelectedModel)) |
Merci cordialement