匹配两张图像的关键点

3
如何在不使用opencv匹配器的情况下匹配两个图像的特征?我已经检测到它们的关键点和描述符。
kp1, des1 = sift.detectAndCompute(gray1,None)
kp2, des2 = sift.detectAndCompute(gray2,None)

如果我理解正确,我应该将des1中的每个描述符与des2中的每个描述符进行比较,并找到最佳匹配。但是我该如何进行比较呢?

你曾经想过计算des1des2之间的欧氏距离吗?你可以使用numpy模块中的np.linalg.norm(des1 - des2) - Jeru Luke
只使用描述符 mat 条目。例如,匹配 = 最低平方距离之和,从一个描述符到每个其他图像的距离将是某种暴力匹配器。 - Micka
只使用描述符 mat 条目。例如,匹配 = 最低平方距离之和,从一个描述符到每个其他图像的距离将是某种暴力匹配器。 - Micka
你可以编写自己的OpenCV匹配器类 ;) - Micka
1个回答

2

一个点的SIFT描述符只是一个128维向量,因此您可以简单地计算每两个向量之间的欧几里得距离,并匹配最近的一对。

从opencv SIFT中,您可以获取名为des1des2的数组,它们是每个点的SIFT向量数组。您可以通过numpy广播计算每一对之间的距离,如下所示:

distance = np.sqrt(np.sum((des1[:, np.newaxis, :] - des2[np.newaxis, :, :]) ** 2, axis=-1))

现在,在distance的每一行中,您都可以看到来自kp1的特定关键点与kp2的每个关键点之间的欧几里得距离。
这种方法很简单,但通常不是非常有效。如果您想自己实现更复杂的匹配器,则应阅读一些SIFT论文。
我找到了两篇: 论文1-较简单 论文2-更复杂

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接