OpenCV Detectar Líneas

Las funciones de OpenCV HoughLines y HoughLinesP son usadas para detectar líneas en una imagen, ambas funciones usan el método HoughTransform usado para buscar líneas, círculos y otras formas básicas.

Para la detección de líneas usamos dos métodos:

  • El método estándar HougLines Standard Hough Line Transform.
  • El método probabilístico es más eficiente HougLinesP Probabilistic Line Transform.

Antes de usar alguna de estas funciones primero aplicaremos dos funciones a la imagen, Canny para detectar los bordes de la imagen y cvtColor para cambiar la imagen de escala de grises a BGR y poder mostrar los resultados.

Canny(src, dst, 50, 200, 3);
cvtColor(dst, cdst, CV_GRAY2BGR);

Aplicar el método HoughLines con los parámetros indicados, de las línea # 3 a 13 se dibujan la líneas encontradas:

  • dst: proporcionado por Canny.
  • lines: almacena las líneas detectadas.
  • rho : usaremos 1 pixel.
  • theta: usaremos 1 grado (CV_PI/180).
  • threshold: numero mínimo de líneas a detectar.
  • srn and stn: cero por defecto.
vector<Vec2f> lines;
HoughLines(dst, lines, 1, CV_PI/180, 200, 0, 0 );
for ( size_t i = 0; i < lines.size(); i++ ) {
     float rho = lines[i][0], theta = lines[i][1];
     Point pt1, pt2;
     double a = cos(theta), b = sin(theta);
     double x0 = a*rho, y0 = b*rho;
     pt1.x = cvRound(x0 + 1000*(-b));
     pt1.y = cvRound(y0 + 1000*(a));
     pt2.x = cvRound(x0 - 1000*(-b));
     pt2.y = cvRound(y0 - 1000*(a));
     line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
 }

Para aplicar el método HoughLinesP se hace de manera similar solo cambian algunos parámetros y la manera como devuelve las líneas:

  • dst: proporcionado por Canny.
  • lines: almacena las líneas detectadas.
  • rho : usaremos 1 pixel.
  • theta: usaremos 1 grado (CV_PI/180).
  • threshold: numero mínimo de líneas a detectar.
  • minLinLength: mínimo de puntos que forman una línea.
vector<Vec4i> lines;
 HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
 for ( size_t i = 0; i < lines.size(); i++ ) {
     Vec4i l = lines[i];
     line( cdst, Point(l[0], l[1]),
           Point(l[2], l[3]), Scalar(0,0,255),
           3, CV_AA);
 }
    
detector de lineas

Descargar Detector de Líneas

Comentarios

  1. Hola, he intentado usar el codigo pero la matriz me sale vacia, la imagen la he colocado en C: y tambien en el directorio donde esta el proyecto junto al .cpp pero nada.

    ResponderEliminar
    Respuestas
    1. Debes poner la dirección donde se encuentra tu imagen, sino nunca funcionara. Por ejemplo en mi caso es así:

      const char* filename = argc >= 2 ? argv[1] : "C:\\Users\\Robert Alexander\\Documents\\OpenCV\\Practica 1\\imagen.jpg";

      Es MUY IMPORTANTE poner \\ de lo contrario tampoco funcionará

      Eliminar
  2. No va el link compañero! Me interesa revisar el código la verdad, a ver si puedes subirlo de nuevo.
    Gracias!

    ResponderEliminar
    Respuestas
    1. El enlace ha sido reparado, ya puedes descargar el código fuente del programa, detector de líneas.

      Eliminar
  3. Hola una pregunta como puedo hacer eso sin usar una imagen sino enfocar la camara de mi celular o de la compu y se vean las lineas en forma real

    ResponderEliminar
    Respuestas
    1. Para utilizar la cámara puedes ver el tutorial:

      http://acodigo.blogspot.com/2013/06/acceso-la-webcam.html

      En cada repetición aplicas el algoritmo para detectar líneas.

      Eliminar
  4. Hola, y si quiero saber los puntos de intersección de las lineas mostradas?

    ResponderEliminar
    Respuestas
    1. El algoritmo retorna dos puntos que conforman la línea recta, con ellos puedes encontrar la ecuación de la recta que tiene la forma (y = mx + b), si encuentras las ecuaciones de las rectas cuyo punto de intersección deseas conocer solo resuelves el sistema de ecuaciones y obtienes el punto, si existe.

      Puedes ver: https://goo.gl/TBcDph

      Eliminar
  5. Hola ! Alguien sabe como hacer esto en Python?

    ResponderEliminar
  6. Hola, Alguien activo por estos lados? si quisiera entrenarlo para reconocer, por ejemplo un circulo que tenga la mitad relleno y la mita vacío? o algún otro caractér. Hay algún material que pueda consultar?. Muchas gracias de antemano.

    ResponderEliminar

Publicar un comentario

Temas relacionados

Entradas populares de este blog

tkinter Grid

Conectar SQL Server con Java

JavaFX Uso de ComboBox

tkinter Canvas

JavaFX Reproducción de Audio y Video