Почему после сопоставления с 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, я не могу отфильтровать плохие совпадения, а полученные совпадения действительно плохие.
Почему это происходит?