如何使用FLANN优化许多图片的SIFT功能匹配?
我有一个来自Python
OpenCV文档的工作示例。但是,这是将一个图像与另一个图像进行比较,而且速度很慢。我需要它来搜索一系列图像(几千个)中匹配的特征,并且我需要它更快。
我目前的想法:
http://docs.opencv.org/trunk/doc/py_tutorials/py_feature2d/py_feature_homography/py_feature_homography.html
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([k p2 [m.trainIdx] .pt for m in good])。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
问题内容: 我正在尝试基本上在Java上进行模板匹配。我使用简单的算法来找到匹配项。这是代码: 但这是非常缓慢的方法。我测试了2张图像(768×1280)和子图像(384 x 640)。这持续了很长时间。openCV是否可以使用现成的函数cvMatchTemplate()快速执行模板匹配? 问题答案: 您会发现openCV cvMatchTemplate()比您已实现的方法快得多。您创建的是一种统
问题内容: 我无法使用此功能。基本上,我正在进行特征检测并与参考图像进行匹配。我想将匹配的功能叠加在输入图像的顶部。这是我的代码: 这是Feature2d.drawMatches,特别是这个问题。根据我收到的Android错误,某些尺寸没有对齐。说实话,我什至不知道应该如何在Android上工作,因为任何地方都没有文档。 我想要做的是在inputImage顶部绘制匹配项。我已经开始工作,但是不确定
目标 学习使用OpenCV绘制不同的几何形状 您将学习以下功能:cv.line(),cv.circle(),cv.rectangle(),cv.ellipse(),cv.putText()等。 代码 在上述所有功能中,您将看到一些常见的参数,如下所示: img:您要绘制形状的图像 color:形状的颜色。对于BGR,将其作为元组传递,例如:(255,0,0)对于蓝色。对于灰度,只需传递标量值即可。
本文向大家介绍Elixir模式匹配功能,包括了Elixir模式匹配功能的使用技巧和注意事项,需要的朋友参考一下 示例
问题内容: 我已经阅读了有关如何使用OpenCV的基于HOG的行人检测器的文章: 如何使用OpenCV检测和跟踪人员? 我想使用HOG来检测图像中的其他类型的对象(不仅仅是行人)。但是, HOGDetectMultiScale 的Python绑定似乎无法提供对实际HOG功能的访问。 是否可以使用Python + OpenCV直接从任何图像中提取HOG功能? 问题答案: 如果您想要用于HOG功能的快
Im使用java中的OpenCV,使用eclipse开发,图像以这种方式读取以进行模板匹配。 这很好,但我的图像不在本地计算机中。我应该比较mysql数据库中服务器上的2000个图像。把2000张图片保存到我的电脑上,然后读取它们是没有意义的。 所以我需要的是那个高鬼。imread(infle)读取图像:Highgui。imread(图像中的图像)或Highgui。imread(文件填充),我找不