Ich verwende die SIFT-Funktion (mit dem folgenden) Code zur Verkehrszeichenerkennung. aber die Ergebnisse sind sehr seltsam:opencv SIFT Feature Matching ist nicht korrekt
#here I read 7 traffic sign images and compute the corresponding SIFTs (speed limit)
sift = cv2.xfeatures2d.SIFT_create()
import glob
imglist = [[], [], [], []]
for filename in glob.glob('data/*.jpg'): #assuming gif
base=os.path.basename(filename)
file=os.path.splitext(base)[0]
print (file)
imglist[0].append(file)
img=cv2.imread(filename)
imglist[1].append(img)
img = cv2.resize(img, (128, 128))
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray=cv2.equalizeHist(gray)
keypoints, des = sift.detectAndCompute(gray, None)
imglist[2].append(keypoints)
imglist[3].append(des)
Einige meiner Figuren sind unten dargestellt:
Dann habe ich eine Figur laden, berechnen die SIFT und vergleichen es mit meinem Datenbank (die obigen Abbildungen) unter Verwendung des folgenden Codes:
img=cv2.imread("50_test.jpg")
#img=crop_img
img = cv2.resize(img, (128, 128))
IMAGES=imglist
bf = cv2.BFMatcher()
sift = cv2.xfeatures2d.SIFT_create()
# Find the keypoint descriptors with SIFT
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
gray=cv2.equalizeHist(gray)
_, des = sift.detectAndCompute(gray, None)
if des is None:
print ("Unknown")
#return "Unknown", 0
if len(des) < 5:
print ("Unknown")
#return "Unknown", 0
biggest_amnt = 0
biggest_speed = 0
cur_img = 0
for _ in IMAGES[0]:
des2 = IMAGES[3][cur_img]
matches = bf.knnMatch(des,des2, k=2)
matchamnt = 0
# Apply ratio test
matchamnt = 0
for m,n in matches:
if m.distance < 0.6*n.distance:
matchamnt += 1
print (matchamnt)
print (IMAGES[0][cur_img])
print ("************************")
if matchamnt > biggest_amnt:
biggest_amnt = matchamnt
biggest_speed = IMAGES[0][cur_img]
cur_img += 1
Die Figur, die ich für den Test laden ist die folgende Abbildung:
Für die Abbildung oben die Ausgabe von meinem Code ist unten:
similarity: 1
10 km
************************
similarity:3
100 km
************************
similarity: 1
120 km
************************
similarity: 7
20 km
************************
similarity: 6
30 km
************************
similarity: 2
50 km
************************
similarity: 4
90 km
************************
Output 20 km
Wie Sie mein Testbild 50 ist zu sehen km, aber überraschenderweise ist es ähnlich wie 20km Verkehrszeichen in meiner Datenbank !!! Ich frage mich, warum ist das so? Irgendwelche Vorschläge, um den Code zu verbessern? Tnx