В моем коде я фильтрую хорошие изображения на основе ближайшего отношения соседей, как показано ниже:
for(int i = 0; i < min(des_image.rows-1,(int) matches.size()); i++)
{
if((matches[i][0].distance < 0.6*(matches[i][1].distance)) &&
((int)matches[i].size()<=2 && (int)matches[i].size()>0))
{
good_matches.push_back(matches[i][0]);
}
}
Поскольку я отфильтровываю хорошие изображения на основе отношения расстояний ближайших соседей, нужно ли мне по-прежнему вычислять евклидово расстояние?
И я хочу знать, когда я использую knnMatch
метод в FlannBasedMatcher
внутри метода они используют евклидово расстояние, чтобы соответствовать ключевым точкам?
Да, тебе нужно. Отношение ближайшего соседа означает, что вы:
1) Рассчитать расстояния от дескриптора на одном изображении до 1-го и 2-го ближайших соседей на втором изображении. d1 = d (desc1_img1, descA_img2); d2 = d (desc1_img1, descB_img2).
2) Рассчитать отношение расстояний R = d1 / d2. Если R < 0,6, то совпадение, вероятно, хорошо. Это сделано потому, что у вас всегда будет «ближайший» дескриптор на втором изображении, независимо от того, насколько он плох — вы проверяете его по соотношению.
Так что если у вас нет расстояний, из чего вы будете рассчитывать соотношение?
Тип расстояния зависит от значения, которое вы передали при построении KNN-matcher в параметре normType.
BFMatcher::BFMatcher(int normType=NORM_L2, bool crossCheck=false )
Других решений пока нет …