Почему после сопоставления с Flann Matcher в OpenCV с FAST и FREAK расстояние DMatch всегда равно 0?

Это как я инициализировал FlannBasedMatcher согласно учебнику здесь.

FLANN_INDEX_LSH = 6

index_params = dict(algorithm=FLANN_INDEX_LSH,
                    table_number=6,
                    key_size=12,
                    multi_probe_level=2)
search_params = dict(checks=100)
flann = cv.FlannBasedMatcher(index_params, search_params)

Затем я делаю быстрое обнаружение характерных точек следующим образом:

fast = cv.FastFeatureDetector_create(threshold=60, nonmaxSuppression=False)
kp1 = fast.detect(image1, None) # image = cv.imread('image1')
kp2 = fast.detect(image2, None) # image = cv.imread('image2')

После этого я получаю дескрипторы, использующие FREAK, например:

freak = cv.xfeatures2d.FREAK_create()

d1 = freak.compute(image1, kp1)[1]
d2 = freak.compute(image2, kp2)[1]
# [1] for the descriptors, [0] is keypoints

И тогда совпадения:

matches = flann.knnMatch(d1, d2, k=2)

Проблема в том, что когда я проверяю расстояние на DMatch, оно всегда равно 0:

for i, (m, n) in enumerate(matches):
    print("m.distance: " + str(m.distance)) # prints 0
    print("n.distance: " + str(n.distance)) # prints a non zero float

Вот, m.distance всегда 0.0 но n.distance имеет хорошие значения с плавающей точкой. Что (m, n) вот и почему m.distance == 0.0, Кроме того, чтобы использовать бумагу Лоу (из того же учебника), чтобы найти наилучшие совпадения, мне нужно использовать расстояние от обоих значений. Но, учитывая, что один из них равен 0, я не могу отфильтровать плохие совпадения, а полученные совпадения действительно плохие.

Почему это происходит?

0 ответов

Другие вопросы по тегам