2011-03-04 8 views
6

Estoy tratando de implementar un reconocedor de señales de tráfico con el método OpenCV y SURF. Mi problema es que obtengo resultados aleatorios (a veces muy precisos, a veces obviamente incorrectos) y no puedo entender por qué. Así es como yo implementé la comparación:Resultado extraño con la comparación SURF

  • Primera detecto contornos de mi imagen
  • Luego, en cada contorno, yo uso SURF para averiguar si una señal de tráfico está dentro y el que la señal de tráfico

La detección de contorno funciona perfectamente bien: el uso de una falta de definición de bordes de Canny gaussain y me las arreglo para encontrar un contorno similar a éste:

enter image description here

Entonces i extraer la imagen que corresponde a este contorno y comparo esta imagen imagen de la plantilla señales de tráfico que son como éstos:

enter image description here

enter image description here

El cvExtractSURF devuelve 189 descriptores de la imagen de contorno para. Luego utilizo el método naiveNearestNeighbor para descubrir similitudes entre mi imagen de contorno y cada imagen de plantilla.

Aquí están mis resultados:

6/189 por primera plantilla (que es el que yo estoy esperando encontrar)

92/189 para la segunda plantilla (que es obviamente muy diferente en todos los sentidos a la imagen de contorno)

realmente no entiendo estos resultados ...

Aquí está la lista de los pasos i por formulario:

  • Girar la imagen de contorno en escala de grises
  • Girar la imagen de la plantilla en escala de grises
  • Igualar el histograma de la imagen de contorno (cvEqualizeHist)
  • redimensionar la imagen plantilla para que coincida con la imagen de contorno
  • falta de definición de la imagen de plantilla (cvSmooth)
  • falta de definición de la imagen de contorno (cvSmooth)
  • hacer un cvExtractSURF en la plantilla ima ge
  • Hacer un cvExtractSURF la imagen de contorno
  • en Para cada descriptor de la imagen de contorno hago un naiveNearestNeighbor
  • almaceno el número de "buena" o Puntos

Para evaluar la similitud entre el 2 imágenes que utilizan la relación:

número de puntos goog/número total de descriptores

PS: Para obtener información he seguido este tutorial: http://www.emgu.com/wiki/index.php/Traffic_Sign_Detection_in_CSharp

y se utiliza la muestra find_obj de OpenCV para adaptarlo en C.

Respuesta

6

descriptores SURF están muy bien para la comparación de imágenes ricas en texturas ... Creo que no hay suficiente textura en las señales de tráfico para ellos.

Al extraer descriptores, se encuentran los primeros "puntos sobresalientes", en su caso, por ejemplo, en las esquinas de las marcas rectangulares en ambos signos (el rectángulo y la letra P), se recopilan propiedades locales para ellos. Al igual que, cómo se ve una esquina de un rectángulo, de cerca, borrosa y en escala de grises.

Entonces, estas descripciones se corresponden con la esquina de un rectángulo de la letra P. No son tan diferentes ... (ya que no estamos teniendo en cuenta ninguna información de forma). Tal vez las esquinas de la letra P son un poco más cercanas a las del signo de "no entrada". Aleatoriamente.

Por supuesto, todo esto es solo una especulación ... la única manera de descubrirlo es depurarlo completamente. Intente mostrar las imágenes con pequeños círculos donde se encontraron los descriptores (el tamaño del círculo podría depender de la escala en la que se encontró el punto). O coloque ambas imágenes en una imagen Ipl y dibuje líneas entre los descriptores coincidentes.Algo como esto:

http://www.flickr.com/photos/[email protected]/268039276

cuanto a cómo solucionar este problema ... ¿qué pasa con el mismo método de ajuste de forma para el interior que se utiliza para detectar los contornos exteriores de la señal de tránsito? (Por ejemplo, podría buscar objetos en forma de P una vez que se encuentre una señal.)

+2

Sé que esta es una respuesta anterior, pero me ayudó a evitar el uso de SURF para una aplicación de coincidencia de imágenes donde tuve imágenes de textura pobre similar. ¿Alguna sugerencia para un buen algoritmo genérico para la extracción de características y la comparación en tales imágenes? – rkagerer

+0

buena pregunta, me interesaría tal algoritmo también :) (Creo que sería una buena pregunta de nivel superior) – Latanius

0

Para evaluar la similitud entre las 2 imágenes que utilizo la relación: número de puntos goog/número total de descriptores

Creo que es una mala medida que necesita utilizar métricas basadas en vectores de descriptores y debe utilizar información esencial entre los puntos.

Esto se debe a que las características similares a SIFT coinciden solo con los "mismos puntos" pero no con puntos similares, tal vez puede ajustar cambiando los criterios de coincidencia. Porque el criterio de concordancia opencv es obtener el punto más cercano (por descriptor) y verificar si hay es otro descriptor cerca de 0.6 similitud.

la concordancia del descriptor consiste en dos pasos. El primer paso sigue al algoritmo de coincidencia simple pero poderoso de David Lowe. Más precisamente, para ver si un descriptor A en la imagen de la izquierda coincide con algún descriptor en la imagen de la derecha o no, calculamos primero la distancia euclidiana d (A, A ') entre el descriptor A en la imagen de la izquierda con todos los descriptores A 'en la imagen correcta. Si la distancia más cercana, digamos d (A, A1 '), es menor que k multiplicada por la segunda distancia más cercana, digamos d (A, A2'), entonces A y A1 'se consideran coincidentes. Establecemos k = 0.6

tal vez usted puede cambiar k, pero creo que da más falsos positivos.

Cuestiones relacionadas