python cv2功能匹配给出不同的结果

问题描述 投票:0回答:1

当我使用FLANN匹配SIFT特征时,我发现相同的输入描述符在同一个过程中给出不同的匹配对。

python代码:

 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-tree缓存,但我无法解决它。任何人都可以帮助我?

我希望匹配结果总是一样的。我的cv2版本是3.4.0,在此先感谢。

opencv3.0 sift cv2 kdtree flann
1个回答
0
投票

我不是专家,但我有一个假设:

FLANN基于近似最近邻居的随机k-d树算法。其目的是找到可接受的精度下降的快速近似。因此,结果可能并不总是相同。

有关详细信息,请查看FLANN上列出的论文

根据您使用匹配的内容(例如,单应性的计算),可能根本没有问题。

© www.soinside.com 2019 - 2024. All rights reserved.