当我使用 FLANN 匹配 SIFT 特征时,我发现相同的输入描述符在同一进程中给出不同的匹配对。
蟒蛇代码:
import cv2
def match(des_q, des_t):
FLANN_INDEX_KDTREE = 1
ratio = 0.7
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann1 = cv2.FlannBasedMatcher(index_params, search_params)
two_nn = flann1.knnMatch(des_q, des_t, k=2)
matches = [(first.queryIdx, first.trainIdx) for first, second in two_nn
if first.distance < ratio * second.distance]
print(matches)
return matches
def img_sim(img1, img2):
img1 = cv2.cvtColor(img1, cv2.IMREAD_GRAYSCALE)
img2 = cv2.cvtColor(img2, cv2.IMREAD_GRAYSCALE)
sift = cv2.xfeatures2d.SIFT_create()
eps = 1e-7
# find the keypoints and descriptors with SIFT
kp1, des1 = sift.detectAndCompute(img1, None)
des1 /= (des1.sum(axis=1, keepdims=True) + eps)
des1 = np.sqrt(des1)
kp2, des2 = sift.detectAndCompute(img2, None)
des2 /= (des2.sum(axis=1, keepdims=True) + eps)
des2 = np.sqrt(des2)
# test images,same input(des1,des2),different output?
matches1 = match(des1, des2)
matches2 = match(des1, des2)
img1 = '' # query image
img2 = '' # index image
img1 = cv2.cvtColor(cv2.imread(img1), cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(cv2.imread(img2), cv2.COLOR_BGR2RGB)
img_sim(img1, img2)
我发现第 11 行的匹配项不同,虽然我的输入描述符(des1,des2(相同,我想原因是 kd 树缓存,但我无法解决。有人可以帮助我吗?
我希望比赛结果始终相同。我的 cv2 版本是 3.4.0,提前感谢。
我不是专家,但我有一个假设:
FLANN 基于近似最近邻的随机 k-d 树算法。其目的是找到精度下降可接受的快速近似值。因此,结果可能并不总是相同的。
有关详细信息,请查看 FLANN 上列出的论文
根据您使用匹配的内容(例如同形异义词的计算(,可能根本没有问题。