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)) |
Partager