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

Publicar un comentario

Entradas populares de este blog

Conectar SQL Server con Java

Entrenar OpenCV en Detección de Objetos

Detección de figuras geométricas