2011-11-24 30 views
5

Estoy empezando a usar OpenCV para detectar curvas específicas en una imagen. Primero, quiero verificar si hay una curva, y luego, me gustaría identificar el tipo de curva de acuerdo con la curva cóncava o convexa vertical u horizontal. ¿Hay una función disponible en OpenCV? Si no, ¿puedes darme algunas ideas sobre cómo puedo escribir tal función? ¡Gracias! Por cierto, estoy usando C++.Detección de curvas en OpenCV

+0

¿Con qué tipo de imágenes está tratando? ¿Qué antecedentes tienen? Si es posible, adjunte algunas imágenes de sus imágenes. – maximus

Respuesta

6

La coincidencia de plantillas no es una forma robusta de resolver este problema (es como mirar un objeto desde un pequeño orificio) y los detectores de bordes no necesariamente le devuelven los bordes verdaderos en la imagen; también se devuelven los bordes falsos, como los debidos a las sombras. Además, tiene que lidiar con el problema de los bordes incompletos y otros problemas que se amplían con la complejidad de la escena en su imagen.

El problema que usted planteó, en general, es muy desafiante y, a excepción de los ejemplos de juguetes, no hay buenas soluciones.

Un primer intento podría consistir en intentar detectar plausible bordes con un detector de bordes (por ejemplo, el detector de bordes astutos). Luego, use RANSAC para tratar de ajustar un subconjunto de puntos en los bordes detectados a su modelo de curva.

Por ej. digamos que está tratando de detectar una curva de la siguiente forma f (x) = ax^2 + bx + c. RANSAC básicamente tratará de encontrar entre los puntos en los bordes detectados, un subconjunto de ellos que mejor se ajuste a este modelo de curva. Para detectar diferentes curvas, cambie f (x) en consecuencia y ejecute RANSAC para cada una de ellas. A continuación, puede tratar de determinar si la curva representada por f (x) existe realmente en su imagen utilizando alguna heurística aplicada a partir de los puntos que RANSAC le asignó (por ejemplo, si se ajustaron muy pocos puntos al modelo, es probable que la curva no está allí. ¿Pero cómo determinar un buen umbral para la cantidad de puntos?). Su modelo se volverá más complejo cuando tenga en cuenta la transformación permitida, como la rotación, etc.

El problema con este enfoque es que básicamente intenta ajustar lo que cree que debería estar en la imagen a los puntos y, a veces, aunque lo que está buscando no está allí, le devolverá el ajuste "mejor posible". Por ej. tienes un montón de puntos detectados en un círculo concéntrico. ¡Si intenta detectar líneas rectas desde estos puntos, RANSAC le devolverá la mejor línea de ajuste! De hecho, podría darle muchas líneas diferentes de diferentes ejecuciones dependiendo de qué puntos seleccionó durante su etapa de inicialización aleatoria. Para obtener más información sobre cómo utilizar RANSAC en este tipo de problema, consulte RANSAC for Dummies en Marco Zuliani. También tiene un bonito MATLAB toolbox para acompañar este informe técnico, que probablemente pueda transferir al idioma de su elección.

A menos que sepa cómo se ve el fondo, o si tiene el control de él, p. al forzar un fondo limpio, este es un problema muy difícil de resolver.

Cuestiones relacionadas