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);
}
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.
ResponderEliminarDebes poner la dirección donde se encuentra tu imagen, sino nunca funcionara. Por ejemplo en mi caso es así:
Eliminarconst 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á
No va el link compañero! Me interesa revisar el código la verdad, a ver si puedes subirlo de nuevo.
ResponderEliminarGracias!
El enlace ha sido reparado, ya puedes descargar el código fuente del programa, detector de líneas.
EliminarHola 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
ResponderEliminarPara utilizar la cámara puedes ver el tutorial:
Eliminarhttp://acodigo.blogspot.com/2013/06/acceso-la-webcam.html
En cada repetición aplicas el algoritmo para detectar líneas.
Hola, y si quiero saber los puntos de intersección de las lineas mostradas?
ResponderEliminarEl 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.
EliminarPuedes ver: https://goo.gl/TBcDph
Hola ! Alguien sabe como hacer esto en Python?
ResponderEliminarHola, 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