texto reconocimiento procesamiento objetos numeros imagenes deteccion caracteres python algorithm opencv image-processing hough-transform

reconocimiento - Python y OpenCV-Mejorando mi algoritmo de detección de carril



reconocimiento de numeros en imagenes python (1)

Yo recomendaría considerar el uso de la Transformada Probabilistic Hough Line para su aplicación. En la API Python de OpenCV, se implementa en la función cv2.HoughLinesP . Eso realmente le dará segmentos de línea, por lo que no necesitará calcular los puntos finales. También es mucho más rápido que la Transformada Hough Line estándar.

Sin embargo, hay algunos intercambios. Por ejemplo, puede que necesite agregar lógica para unir segmentos de línea. Por otro lado, descubrí que eso no es realmente algo malo. Uno de mis proyectos de juguete (un autobús en miniatura autoguiado), utilizó este enfoque, y tener segmentos de línea separados para unir hizo que fuera más fácil tratar con carreteras curvas en las que la línea estándar de transformación de la línea no le da ninguna línea en absoluto .

Espero que ayude.

EDITAR: Con respecto a los detalles de las "puntadas" del segmento de línea, depende de lo que desea lograr. Si solo desea mostrar la ruta y está satisfecho con la existencia de algunas brechas entre los segmentos de línea, es posible que no tenga que realizar ninguna costura, solo muestre todos los segmentos de línea. En mi solicitud, necesitaba determinar la curvatura del carril, así que hice algunas puntadas para construir un modelo de cada carril que incluyera la pendiente promedio del carril, que se usó como entrada para un módulo responsable de controlar un carril. servo para mover las ruedas en consecuencia.

Al "coser" no me refiero a nada particularmente sofisticado, pero no conozco ninguna función particular de OpenCV para lograrlo. Solo necesitaba una forma de segmentos de línea asociados que fueran parte del mismo carril. Así que HoughLinesP segmentos de línea devueltos por HoughLinesP desde la parte superior de la imagen que funcionaba hacia abajo, y usé la pendiente de cada segmento de línea y la intersección y para determinar dónde se cruzarían los segmentos de línea.

Tendré que detectar el carril de un video. Aquí está mi manera de hacerlo.

  1. Determine la región de interés (ROI) cortando la imagen (enfoque la parte media)
  2. Escala de grises del ROI
  3. cv2.equalizeHist retorno de la inversión en escala de grises con cv2.equalizeHist
  4. Aplicar desenfoque gaussiano a (3)
  5. Umbral (4) usando cv2.adaptiveThreshold
  6. Esqueleto (5) usando skimage.morphology.skeletonize
  7. Aplicar el cv2.HoughLines en (6)

Para cv2.HoughLines , configuré para que:

  1. Si rho es positivo (lo que significa que la línea recta está inclinada hacia la derecha (de abajo hacia arriba), solo dibujará la línea si está en ciertos ángulos (configuré el rango del ángulo))
  2. Si rho es negativo (la línea recta se inclina hacia la izquierda (de abajo hacia arriba), solo dibujará la línea si está en ciertos ángulos)

Este es mi código para dibujar las líneas:

lines = cv2.HoughLines(image_bin, 1, np.pi/180, 50) try: range = lines.shape[0] except AttributeError: range = 0 for i in xrange(range): for rho, theta in lines[i]: if rho > 0 and (np.pi*1/10 < theta < np.pi*4/10): a = np.cos(theta) b = np.sin(theta) x0 = a * rho y0 = b * rho x1 = int(x0 + 1000 * (-b)) y1 = int(y0 + 1000 * (a)) x2 = int(x0 - 1000 * (-b)) y2 = int(y0 - 1000 * (a)) cv2.line(roi, (x1, y1), (x2, y2), (0, 255, 0)) if rho < 0 and (np.pi*7/10 < theta < np.pi*9/10): a = np.cos(theta) b = np.sin(theta) x0 = a * rho y0 = b * rho x1 = int(x0 + 1000 * (-b)) y1 = int(y0 + 1000 * (a)) x2 = int(x0 - 1000 * (-b)) y2 = int(y0 - 1000 * (a)) cv2.line(roi, (x1, y1), (x2, y2), (0, 255, 0))

Si no hice lo que acabo de hacer para la función cv2.HoughLines , creo que se dibujarán muchas líneas innecesarias.

Después de ajustar los parámetros y tal, obtuve un resultado bastante bueno, pero eso es solo para una imagen. No creo que sea tan bueno para un video que seguirá cambiando. Lo que más me molesta es mi algoritmo para dibujar las líneas necesarias (ese es el camino). ¿Hay alguna forma mejor? Al menos mejor que el mío

Este es mi resultado:

La imagen original:

Histograma ecualizado, umbral y imagen esqueletizada del ROI:

Resultado final: