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:
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:
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.
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
buena pregunta, me interesaría tal algoritmo también :) (Creo que sería una buena pregunta de nivel superior) – Latanius