如何使用FLANN优化许多图片的SIFT功能匹配?
我有一个来自Python OpenCV文档的工作示例。但是,这是将一个图像与另一个图像进行比较,而且速度很慢。我需要它来搜索一系列图像(几千个)中匹配的特征,并且我需要它更快。
我目前的想法:
import sys#仅用于调试 将numpy导入为np 导入cv2 从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 = dict(checks = 50) flann = cv2.FlannBasedMatcher(index_params,search_params) 匹配= flann.knnMatch(des1,des2,k = 2) #根据Lowe的比率测试存储所有符合条件的匹配项。 好= [] 对于在比赛中的m,n: 如果m.distance MIN_MATCH_COUNT: src_pts = np.float32([k p1 [m.queryIdx] .pt for m in good])。reshape(-1,1,2) dst_pts = np.float32([m处于良好状态的[kp2 [m.trainIdx] .pt])。reshape(-1,1,2) M,遮罩= cv2.findHomography(src_pts,dst_pts,cv2.RANSAC,5.0) matchsMask = 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) 其他: 打印“找不到足够的匹配项-%d /%d”%(len(good),MIN_MATCH_COUNT) matchsMask =无 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(image,None)) npArray = np.array(npArray)
我从来没有在Python中解决过这个问题,但是我将环境切换到了C ++,在那里您可以获得更多的OpenCV示例,而不必使用包装较少的文档。
我在多个文件中存在匹配问题的示例可以在这里找到:https : //github.com/Itseez/opencv/blob/2.4/samples/cpp/matching_to_many_images.cpp
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句