opencv SIFT特征匹配不准确

时间:2017-09-28 15:17:23

标签: python opencv sift

我正在使用SIFT功能(使用以下代码)进行交通标志识别。但结果很奇怪:

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

我的一些数据如下所示:

20km 50km

30km 然后,我上传一个数字,计算SIFT并使用以下代码将其与我的数据库(上图)进行比较:

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

我上传测试的数字如下图所示:

50test

对于上图,我的代码输出如下:

    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

你可以看到我的测试图像是50公里,但令人惊讶的是它更像我的数据库中的20公里交通标志!我想知道为什么会这样?有什么改进代码的建议吗? TNX

1 个答案:

答案 0 :(得分:0)

20和30符号以及您的查询图像在红色圆圈周围共享相同的黑色边框,并使用比数据库中的50符号更大胆的字体,这就是他们共享更多类似SIFT功能的原因。

通过使用OCR(光学字符识别)包并检测图像中的文本,可以轻松解决此问题。