我正在使用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)
我的一些数据如下所示:
然后,我上传一个数字,计算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
我上传测试的数字如下图所示:
对于上图,我的代码输出如下:
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
答案 0 :(得分:0)
20和30符号以及您的查询图像在红色圆圈周围共享相同的黑色边框,并使用比数据库中的50符号更大胆的字体,这就是他们共享更多类似SIFT功能的原因。
通过使用OCR(光学字符识别)包并检测图像中的文本,可以轻松解决此问题。