1. 提取特征保存到本地,以减少重复计算
import numpy as np
import cv2
import time
import os
if __name__ == '__main__':
db_path = './db/'
save_path='./db_des/'
r=128 #resize 后的大小
ratio=0.76
sift = cv2.xfeatures2d.SURF_create()
# 从搜索库中进行计算
sort_list = []
for imgname in os.listdir(db_path):
#图像2
img = cv2.imread(db_path+imgname)
img = cv2.resize(img, (r, r), interpolation=cv2.INTER_CUBIC)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度处理图像
kp, des = sift.detectAndCompute(img, None) # des是描述子
np.save(save_path+imgname+'.npy',des)
2. 待检索图片检索分类
'''
商品ID:商品名称
dict_label={'01': '削皮刀',
'02': '婴儿湿巾',
'03': '毛巾浴巾套装',
'04': '垃圾袋',
'05': '便捷牙膏盒',
'06': '厨房方巾',
'07': '沥水架',
'08': '挂钩粘钩4个装',
'09': '三格储物盒',
'10': '清洁海绵',
'11': '创意不锈钢多用挂钩',
'12': '马卡龙家用多用盆大',
'13': '毛巾',
'14': '菠萝纹毛巾浴巾套装',
'15': '苹果数据线',
'16': '安卓数据线',
'17': 'TYPEC',
'18': '多功能牙具盒',
'19': '洗澡巾'
}
'''
import numpy as np
import cv2
import time
import os
if __name__ == '__main__':
#1.输入:在此输入待查询图像
query_path = './query/01 (10).JPG'
#2.配置:需要将特征文件夹放到此处
db_des_path='./db_des/'
r=128 #resize 后的大小
ratio=0.76
sift = cv2.xfeatures2d.SURF_create()
# 图像1 提取特征
imgname1 = query_path
img1 = cv2.imread(imgname1)
img1 = cv2.resize(img1, (r, r), interpolation=cv2.INTER_CUBIC)
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY) # 灰度处理图像
kp1, des1 = sift.detectAndCompute(img1, None) # des是描述子
# 从搜索库中进行计算
sort_list = []
for imgname2 in os.listdir(db_des_path):
#图像2
des2=np.load(db_des_path+imgname2)
#bruteforce 匹配
bf = cv2.BFMatcher()
matches = bf.knnMatch(des1, des2, k=2)
# 调整ratio
good = []
for m, n in matches:
if m.distance < ratio * n.distance:
good.append([m])
sort_list.append((imgname2, len(good)))
# 排序取得最相似
sort_list.sort(key=lambda x: -x[1])
# 对应查找标签值
dict_label={'01': '削皮刀',
'02': '婴儿湿巾',
'03': '毛巾浴巾套装',
'04': '垃圾袋',
'05': '便捷牙膏盒',
'06': '厨房方巾',
'07': '沥水架',
'08': '挂钩粘钩4个装',
'09': '三格储物盒',
'10': '清洁海绵',
'11': '创意不锈钢多用挂钩',
'12': '马卡龙家用多用盆大',
'13': '毛巾',
'14': '菠萝纹毛巾浴巾套装',
'15': '苹果数据线',
'16': '安卓数据线',
'17': 'TYPEC',
'18': '多功能牙具盒',
'19': '洗澡巾'
}
#3.输出:最后商品名
print(dict_label[sort_list[0][0][:2]])