¿Cómo funciona técnicamente vl_ubcmatch?

Estoy leyendo el código fuente de la función vl_ubcmatch, que se proporciona aquí , y estoy tratando de entender, cómo se calcula la puntuación y cómo funciona técnicamente internamente.

Sin embargo, este código C tiene estas macros, variables ## extrañas como, y qué no, con las que no tengo experiencia. Entonces, el principal problema aquí es más bien mi incompetencia en C. Si es posible, ¿podría alguien decirme, cómo funciona exactamente vl_ubcmatch ? ¿Cómo compara dos descriptores?

Esto se explica en las Secciones 7.1 y 7.2 de Características de imagen distintiva de puntos clave invariantes de escala .

La documentación para la función está aquí: http://www.vlfeat.org/mdoc/VL_UBCMATCH.html

Una coincidencia de la característica d1 en la imagen 1 a la característica d2 en la imagen 2 se usa solo si la distancia entre d1 y d2 es significativamente menor que la distancia a d1 y cualquier otra característica en la imagen 2. La coincidencia debe ser significativamente mejor que cualquier otra emparejamiento potencial “Significante” se define por el umbral que pasa a la función VL_UBCMATCH.

La Sección 7.2 se refiere a una estructura de búsqueda de vecinos más cercana aproximada, pero VL_UBCMATCH no usa esto:

 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++ ; \ } \ } 

Aquí está el pseudocódigo:

 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