Как технически работает vl_ubcmatch?

Я читаю исходный код функции vl_ubcmatch, предоставленный здесь , и я пытаюсь понять, как он вычисляет оценку и как он работает технически внутри.

Однако в этом коде C есть эти макросы, странные переменные ## и многое другое, с которыми у меня нет опыта. Так что основная проблема здесь скорее в моей некомпетентности в C. Если возможно, кто-нибудь может сказать мне, как именно работает vl_ubcmatch? Как он сравнивает два дескриптора?


person Karl    schedule 01.12.2012    source источник
comment
Я не думаю, что есть краткое руководство по написанию шаблонов C++ с объяснением макросов C. Вы должны прочитать книгу.   -  person Bo Persson    schedule 01.12.2012
comment
Карл, хочешь присоединиться к чату? chat.stackoverflow.com/rooms/20457/chat-with-karl   -  person    schedule 01.12.2012


Ответы (1)


Это объясняется в разделах 7.1 и 7.2 документа Отличительные признаки изображения на основе масштабно-инвариантных ключевых точек.

Документация по этой функции находится здесь: http://www.vlfeat.org/mdoc/VL_UBCMATCH.html.

Совпадение признака d1 на изображении 1 с признаком d2 на изображении 2 используется только в том случае, если расстояние между d1 и d2 значительно меньше, чем расстояние до d1 и любого другого признака на изображении 2. Соответствие должно быть значительно лучше, чем любое другое. потенциальное совпадение. «Значительный» определяется порогом, который вы передаете функции VL_UBCMATCH.

Раздел 7.2 относится к приблизительной структуре поиска ближайшего соседа, но VL_UBCMATCH не использует это:

for(k1 = 0 ; k1 < K1 ; ++k1, L1_pt += ND ) {                        \
                                                                    \
  PROMOTE_##MXC best = maxval ;                                     \
  PROMOTE_##MXC second_best = maxval ;                              \
  int bestk = -1 ;                                                  \
                                                                    \
  /* For each point P2[k2] in the second image... */                \
  for(k2 =  0 ; k2 < K2 ; ++k2, L2_pt += ND) {                      \
                                                                    \
    int bin ;                                                       \
    PROMOTE_##MXC acc = 0 ;                                         \
    for(bin = 0 ; bin < ND ; ++bin) {                               \
      PROMOTE_##MXC delta =                                         \
        ((PROMOTE_##MXC) L1_pt[bin]) -                              \
        ((PROMOTE_##MXC) L2_pt[bin]) ;                              \
      acc += delta*delta ;                                          \
    }                                                               \
                                                                    \
    /* Filter the best and second best matching point. */           \
    if(acc < best) {                                                \
      second_best = best ;                                          \
      best = acc ;                                                  \
      bestk = k2 ;                                                  \
    } else if(acc < second_best) {                                  \
      second_best = acc ;                                           \
    }                                                               \
  }                                                                 \
                                                                    \
  L2_pt -= ND*K2 ;                                                  \
                                                                    \
  /* Lowe's method: accept the match only if unique. */             \
  if(thresh * (float) best < (float) second_best &&                 \
     bestk != -1) {                                                 \
    pairs_iterator->k1 = k1 ;                                       \
    pairs_iterator->k2 = bestk ;                                    \
    pairs_iterator->score = best ;                                  \
    pairs_iterator++ ;                                              \
  }                                                                 \
}

Вот псевдокод:

matches = []
For each descriptor k1 in image 1:
    closest_match_distance = Infinity
    second_closest_match_distance = Infinity
    best_match = None
    For each descriptor k2 in image 2:
        distance_squared = d(k1, k2)
        if (distance_squared < closest_match_distance):
            second_closest_match_distance = closest_match_distance
            closest_match_distance = distance_squared
            best_match = k2
    If (threshold * closest_match_distance <
      second_closest_match_distance AND best_match != None):
        matches.Insert((k1, best_match, closest_match_distance))
return matches
person Community    schedule 01.12.2012