如何使用 FLANN 优化多张图片的 SIFT 特征匹配?
我有一个取自 Python OpenCV 文档的工作示例。但是,这是将一张图像与另一张图像进行比较,而且速度很慢。我需要它来搜索一系列图像(几千张)中匹配的特征,并且我需要它更快。
我目前的想法:
- 运行所有图像并保存特征。如何?
- 将来自相机的图像与上述基础进行比较,并找到正确的图像。如何?
- 给我结果,匹配图像什么的。
import sys # 仅用于调试 将 numpy 导入为 np 导入简历2 从 matplotlib 导入 pyplot 作为 plt MIN_MATCH_COUNT = 10 img1 = cv2.imread('image.jpg',0) # queryImage img2 = cv2.imread('target.jpg',0) # trainImage # 启动 SIFT 检测器 筛选 = cv2.SIFT() # 使用 SIFT 找到关键点和描述符 kp1, des1 = sift.detectAndCompute(img1,None) kp2, des2 = sift.detectAndCompute(img2,None) FLANN_INDEX_KDTREE = 0 index_params = dict(算法 = FLANN_INDEX_KDTREE,树 = 5) search_params = 字典(检查 = 50) flann = cv2.FlannBasedMatcher(index_params, search_params) 匹配 = flann.knnMatch(des1,des2,k=2) # 根据劳氏比率测试存储所有好的匹配。 好=[] 对于 m,n 在比赛中: 如果 m.distance MIN_MATCH_COUNT: src_pts = np.float32([ kp1[m.queryIdx].pt for m in good ]).reshape(-1,1,2) dst_pts = np.float32([ kp2[m.trainIdx].pt for m in good ]).reshape(-1,1,2) M, 掩码 = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC,5.0) matchMask = mask.ravel().tolist() h,w = img1.shape pts = np.float32([ [0,0],[0,h-1],[w-1,h-1],[w-1,0] ]).reshape(-1,1,2) dst = cv2.perspectiveTransform(pts,M) img2 = cv2.polylines(img2,[np.int32(dst)],True,255,3, cv2.LINE_AA) 别的: print "没有找到足够的匹配 - %d/%d" % (len(good),MIN_MATCH_COUNT) 匹配掩码 = 无 draw_params = dict(matchColor = (0,255,0), # 绘制绿色匹配 singlePointColor = 无, matchesMask = matchesMask, # 仅绘制内点 标志 = 2) img3 = cv2.drawMatches(img1,kp1,img2,kp2,good,None,**draw_params) plt.imshow(img3, '灰色'),plt.show()
更新
在尝试了很多事情之后,我现在可能已经更接近解决方案了。我希望可以建立索引,然后像这样在其中搜索:
flann_params = dict(算法=1,树=4) flann = cv2.flann_Index(npArray, flann_params) idx, dist = flann.knnSearch(queryDes, 1, params={})
但是我仍然没有设法为 flann_Index 参数构建一个接受的 npArray 。
循环遍历所有图像作为图像: npArray.append(sift.detectAndCompute(图像,无)) npArray = np.array(npArray)