2017-09-28 3 views
1

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:

20km 50km

30km 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:

50test

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

Antwort

0

Das 20- und 30-Zeichen und Ihr Abfragebild haben beide den gleichen schwarzen Rand um den roten Kreis und verwenden eine deutlich fettere Schrift als das 50-Zeichen in Ihrer Datenbank, weshalb sie ähnliche SIFT-Merkmale aufweisen.

Sie können dieses Problem leicht lösen, indem Sie ein Paket für OCR (optische Zeichenerkennung) verwenden und den Text in den Bildern erkennen.