2010-11-12 16 views
9

Tengo curiosidad acerca de cómo se comparan los descriptores de características OpenCV. Por ejemplo, puedo usar cvExtractSURF() para obtener una lista de características y sus descriptores de 64 bits (o de 128 bits), ¿dónde puedo averiguar cómo se pueden comparar dos descriptores?OpenCV - Comparación de funciones SURF

Al recorrer un código de muestra, para mí parece que dos de mis características "coincidentes" tienen descripciones muy diferentes (al menos en valores numéricos).

¿Alguien ha descubierto alguna vez cómo tomar dos matrices de descriptores y compararlas?

googlear no ha ayudado demasiado ...

Cheers, Brett

Respuesta

3

En la muestra de 2,1 OpenCV find_obj.cpp archivo, se presentan dos métodos:

  • la función integrada de C++ Flann (Flann dar solución aproximada y funciona más rápido), no sé exactamente cómo se funciona, pero está documentado here.
  • una función C más simple (findPairs()) que encuentra el vecino más cercano al calcular una distancia euclidiana simple entre los descriptores (consulte la función compareSURFDescriptors()). El laplaciano también se puede usar como primer indicador de similitud, ya que los puntos de coincidencia no tienen el mismo laplaciano (1 o -1). Esta muestra está disponible here.
7

Es posible que desee ver en el documento Local invariant feature detectors: a survey. Es un excelente documento con una descripción de los detectores de funciones ampliamente utilizados, incluido el SURF.

+4

De hecho vi ese papel. Esperaba ver el código junto con él, para poder ver cómo se implementa realmente. Sin embargo, ninguno de esos documentos académicos parece abrir el código fuente. Decepcionante, porque reinventar su trabajo nunca es trivial. – Brett

2

Las características de SURF son vectores unitarios de 64 dimensiones. Una forma natural de comparar dos vectores de características es mediante el cálculo de su producto de puntos. Si está cerca de 1, tienen una fuerte correlación positiva (= son similares). Si está cerca de 0, son casi ortogonales (sin correlación). Si es menor que cero, tienen una correlación negativa. Dependiendo de su aplicación, puede considerar que también coincide (en cuyo caso tomaría el valor absoluto del producto escalar) o considerarlo peor que ortogonal.

Pruebe a calcular algunos productos de puntos y vea qué resultados obtiene.

+0

No estoy seguro de que esta sea la manera en que OpenCV busca funciones combinadas. Calculé los productos de puntos para el conjunto de puntos que OpenCV consideró coincidencias y no coincidencias, y los productos de puntos estaban por todas partes. – Brett

3

Un método eficaz que encontré (y esto está inspirado en un código de ejemplo OpenCV) es - Utilice un k búsqueda del vecino más cercano, con K = 2 para encontrar 2 partidos para cada descriptor en el objeto de consulta. ahora, si distancia (1er partido) < 0.6 * distancia (2 ° partido), considera el 1er partido como un "buen partido".

La razón por la que necesita esto y por qué una simple búsqueda de un vecino más cercano no es suficiente es porque eso da MUCHOS positivos falsos.

Cuestiones relacionadas