opencv - online - enfocar fotos
¿Un buen enfoque para detectar líneas en una imagen? (5)
He escrito un código que usa librerías OpenCV para detectar líneas blancas pintadas sobre césped. Necesito la opinión de alguien sobre el enfoque que utilicé (ya que estoy seguro de que hay una manera mucho mejor que la mía). Además, los resultados que obtengo no son tan buenos como esperaba, porque las pequeñas variaciones en la imagen requieren ajustes en los parámetros (y necesito operar con parámetros fijos).
Mi enfoque hasta ahora:
- Capture la imagen de la cámara web (y vuélvala a escala de grises, obviamente)
- Ejecútelo a través de un filtro de umbral (usando el modo THRESH_TO_ZERO, donde borra todos los píxeles por debajo del valor del umbral).
- difuminar la imagen
- ejecutarlo a través de un filtro de erosión
- ejecutarlo a través de un detector de bordes Canny
- finalmente, tome esta imagen procesada y encuentre las líneas usando Probabilistic Hough Transform HoughLinesP
¿Debo cambiar la secuencia de los filtros?
PD: no estoy demasiado preocupado por el poder de procesamiento; Estoy ejecutando HoughLinesP en la GPU B-)
Además, aquí hay una imagen de muestra:
Los resultados que obtengo: con astuto SIN canny (parámetros levemente modificados)
¡Cualquier ayuda o guía sería apreciada! ¡Simplemente no tengo idea de qué hacer para mejorarlo!
ACTUALIZACIÓN Después de usar una implementación de esqueleto realmente rápida (con TONELADAS de desenfoque) según la respuesta elegida, obtuve esto:
Después de su último resultado (después del filtro de esqueleto), obtiene muchos segmentos pequeños. Creo que estás en una muy buena posición en ese momento para implementar lo que se ha hecho en este artículo:
http://www.cs.ubc.ca/~lowe/papers/aij87.pdf
Básicamente, proporcionan herramientas para reagrupar diferentes características en una imagen en función de la probabilidad de que pertenezcan a un mismo objeto. Entonces, todo lo que tendrías que hacer es alimentar tus resultados con su algoritmo y probablemente obtengas una sola línea como resultado.
Estaba usando Canny para imágenes de interior, pero para exteriores considero más adecuado el filtro Laplace y el filtro Sobel, que aplicar la Transformada de línea Probabilistic Hough (PHT).
Si desea aumentar el grosor de sus líneas, debe probar el operador de Sobel después de Laplace y finalmente el PHT. Si tu imagen es demasiado curiosa, podría empeorar.
Intentaré usar una representación de esqueleto de la imagen. El problema con tu astuto, aquí, es que básicamente resulta en dos líneas debido al ancho de la línea.
Luego aplicaría la transformada Hough en ella.
Una posible solución es tomar todos los puntos de ventaja que obtenga de la detección de borde astuto y ajustar una línea usando mínimos cuadrados lineales (quizás iterativos) en estos puntos. De esta manera, siempre obtendrá una sola línea que "se adapte mejor" a los puntos de ventaja. Prácticamente no hay parametrización involucrada con este método.
RANSAC
algoritmo RANSAC
puede ser un buen método. Este método es similar a regression
enfoques de regression
o interpolation
. Deberías extraer puntos después de usar una edge detection
(el mejor método es canny
para este objetivo, como creo). Entonces deberías encontrar la mejor línea. Para encontrar la línea que pasa por varios puntos, existen diferentes métodos, como la regresión lineal o RANSAC. Puede encontrar implementación y notas sobre el algoritmo RANSAC
en este enlace .
Tenga en cuenta que RANSAC y otros algoritmos útiles para este objetivo already implemented
están already implemented
en OpenCV
(como sé en la versión 3.2) y en Accord NET
(una biblioteca gratuita para el procesamiento de imágenes).