<p><strong>要在两个图像的描述符之间搜索,请使用:</p>
<pre><code>img1 = cv2.imread('box.png',0)
img2 = cv2.imread('box_in_scene.png',0)
kp1,des1 = surf.detectAndCompute(img1,None)
kp2,des2 = surf.detectAndCompute(img2,None)
bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=False)
matches = bf.match(des1,des2)
</code></pre>
<p><strong>在多个图像中搜索</strong></p>
<p>使用<code>add</code>方法添加多个测试图像的描述符。一旦索引了所有描述符,就运行<code>train</code>方法来构建底层数据结构(例如:KdTree,在FlannBasedMatcher的情况下将用于搜索)。然后,您可以运行<code>match</code>来查找哪个测试映像与哪个查询映像是否更匹配。您可以检查<a href="https://en.wikipedia.org/wiki/K-d_tree" rel="noreferrer">K-d_tree</a>并查看如何使用它来搜索多维向量(Surf提供64维向量)。</p>
<p><strong>注意:-</strong>BruteForceMatcher顾名思义,没有内部搜索优化数据结构,因此具有空列方法。</p>
<p><strong>多图像搜索的代码示例</p>
<pre><code>import cv2
import numpy as np
surf = cv2.xfeatures2d.SURF_create(400)
# Read Images
train = cv2.imread('box.png',0)
test = cv2.imread('box_in_scene.png',0)
# Find Descriptors
kp1,trainDes1 = surf.detectAndCompute(train, None)
kp2,testDes2 = surf.detectAndCompute(test, None)
# Create BFMatcher and add cluster of training images. One for now.
bf = cv2.BFMatcher(cv2.NORM_L1,crossCheck=False) # crossCheck not supported by BFMatcher
clusters = np.array([trainDes1])
bf.add(clusters)
# Train: Does nothing for BruteForceMatcher though.
bf.train()
matches = bf.match(testDes2)
matches = sorted(matches, key = lambda x:x.distance)
# Since, we have index of only one training image,
# all matches will have imgIdx set to 0.
for i in range(len(matches)):
print matches[i].imgIdx
</code></pre>
<p>有关bf.match的DMatch输出,请参见<a href="http://docs.opencv.org/2.4/modules/features2d/doc/common_interfaces_of_descriptor_matchers.html#dmatch" rel="noreferrer">docs</a>。</p>
<p>请参阅此处的完整示例:<a href="http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_feature2d/py_matcher/py_matcher.html" rel="noreferrer">Opencv3.0 docs</a>。</p>
<p><strong>其他信息</strong></p>
<p>操作系统:Mac。<br/>
Python:2.7.10.<br/>
Opencv:3.0.0-dev[如果记住正确,请使用brew安装]。</p>