2012-06-10 13 views
16

Estoy usando findHomography en una lista de puntos y envío el resultado a warpPerspective.Detectando homografías de basura de findHomography en OpenCV?

El problema es que a veces el resultado es basura completa y la imagen resultante está representada por extraños rectángulos grises.

¿Cómo puedo detectar cuándo findHomography me envía malos resultados?

Respuesta

28

Existen varias pruebas de cordura que puede realizar en la salida. En la parte superior de mi cabeza:

  1. Calcule el determinante de la homografía, y vea si está demasiado cerca de cero para mayor comodidad.
  2. Mejor aún, calcule su SVD y verifique que la proporción del primer y único valor de singular sea correcta (no demasiado alta). Cualquiera de los resultados le dirá si la matriz está cerca de singular.
  3. Calcula las imágenes de las esquinas de la imagen y de su centro (es decir, los puntos que obtienes al aplicar la homografía a esas esquinas y centro), y verifica que tengan sentido, es decir, están dentro del lienzo de la imagen (si usted espera que lo sean)? ¿Están bien separados el uno del otro?
  4. Graficar en matlab/octava los puntos de salida (datos) que ajustó la homografía a, junto con con sus valores calculados de los de entrada, usando la homografía, y verifique que están cerca (es decir, el error es bajo).

Un error común que conduce a resultados basura es el ordenamiento incorrecto de las listas de puntos de entrada y salida, que hace que la rutina de ajuste funcione utilizando correspondencias incorrectas. Verifique que sus índices sean correctos.

+0

+1 para SVD ..... – Throwback1986

+2

¿Alguien podría explicar 2.condición más? ¿Cómo puedo calcular SVD y verificar que la relación entre el primer y último valor singular es la correcta con OpenCV? – Tony

+2

http://opencv.willowgarage.com/documentation/cpp/core_operations_on_arrays.html#SVD pase NO_UV, ya que solo está interesado en los valores singulares. Luego calcule la relación (número de condición) del primer al último valor singular. Consulte también, para obtener una explicación del número de condición: http://books.google.com/books?id=1aAOdzK3FegC&pg=PA69&lpg=PA69&dq=numerical+recipes+condition+number&source=bl&ots=3iSoC8Hoqi&sig=Aq1Yc2MHTpXPI4t8wIhU7h388jg&hl=en&sa=X&ei=hUmKUaqeMemx0QXr -ICAAg & ved = 0CDMQ6AEwAA # v = onepage & q = numerical% 20recipes% 20condition% 20number & f = false –

0

Pero esto depende de las correspondencias de puntos que usa para calcular la homografía ... Solo piense que está tratando de encontrar una transformación que mapee líneas a líneas (de un plano a otro), por lo que no hay configuración posible de correspondencias de puntos le dará una homografía que crea imágenes agradables. Incluso es posible que la homografía haga corresponder algunos de los puntos con el infinito.

+0

Mapear puntos hasta el infinito significa que hay algunos puntos en el infinito ya que la función findHomography() minimiza las métricas correctas (suma de las diferencias de coordenadas cuadradas). En resumen, la Homografía se aproxima primero a través de un algoritmo lineal (DLT) que minimiza el error en los parámetros, que es subóptimo; su salida se usa como una suposición para una solución no lineal (algoritmo de Levenberg-Marquardt) que minimiza una métrica correcta: la suma de coord al cuadrado. diferencias; Si la suposición es inexacta, el algoritmo diverge y se atascó en mínimos locales, lo que produce una solución incorrecta. – Vlad

3

La clave está en comprender los casos de homogeneización degenerada. No puede obtener una buena homografía si sus puntos son colineales o cercanos a colineales, por ejemplo. Además, los grandes cuadrados grises pueden indicar escalas extremas. Ambos casos pueden surgir del hecho de que hay muy pocos inliers en su cálculo de homografía final o que el mapeo es incorrecto.

Para asegurarse de que esto nunca ocurra:
1. Asegúrese de que los puntos estén bien separados en ambas imágenes.
2. Asegúrese de que haya al menos 10-30 correspondencias (4 es suficiente si el ruido es pequeño).
3. Asegúrese de que los puntos coincidan correctamente y que la transformación sea una homografía.

Para encontrar malas homografías, aplique H encontrado en sus puntos originales y vea la separación de sus puntos esperados que es |x2-H*x1| < Tdist, donde Tdist es su umbral para el error de distancia. Si solo hay unos pocos puntos que satisfagan este umbral, su homografía puede ser mala y probablemente haya violado uno de los requisitos mencionados anteriormente.