Está en la página 1de 3

ESCUELA PROFESIONAL DE INGENIERÍA

ELECTRÓNICA
LABORATORIO DE PROCESAMIENTO
DIGITAL DE IMÁGENES
EXPERIENCIA N°8

DETECCIÓN DE BORDES, ESQUINAS Y LÍNEAS CON


OPENCV

I .- OBJETIVOS:
• Realizar una detección de bordes usando el método de Canny.
• Realizar una detección de esquinas usando el método de Harris, y Shi and
Tomasi.
• Realizar una detección de esquinas de un patrón de calibración.
• Realizar detección de líneas por transformada de Hough.

II.- CONOCIMIENTOS PREVIOS


• Conocimientos de comandos básicos de OpenCv.
• Conocimientos de detección de bordes, esquinas y líneas.

III.- PROCEDIMIENTO
1.- Programa de detección de bordes.
a.- En su proyecto, cree un nuevo archivo fuente .cpp, incluya las cabeceras.
b. Lea (variable “img”) y muestre en pantalla una imagen a color p.e. “fruits.jpg”
(figura1).
c. Convierta la imagen a color en escala de grises (variable: “mono”).
d. Detecte los bordes de la imagen con la función “cvCanny()”
double th1=4; // (low)50
double th2=40; // (high)200 NOTA: relación: 2:1 ó 3:1
canny = cvCreateImage( cvGetSize(img), 8, 1 );
cvCanny(mono,canny,th1,th2,3);
cvNamedWindow( "imagen bordes", 1 );
cvShowImage( "imagen bordes", canny );
e.- Realizar modificaciones a th1 y th2 y correr el programa
f.- Consulte en el manual OpenCv la función “cvCanny()”

Figura 1 Figura 2

Ejercicio:
Implemente dos controles deslizantes: uno para th1 y otro para th2.

1
ESCUELA PROFESIONAL DE INGENIERÍA
ELECTRÓNICA
LABORATORIO DE PROCESAMIENTO
DIGITAL DE IMÁGENES
EXPERIENCIA N°8

2.- Programas de detección de esquinas.


2.1.- cvCornerHarris()
a) Cargue y muestre en pantalla una imagen de un patrón de calibración (figura
2).
b) Convierta esta imagen a escala de grises (variable: “mono”)
c) Aplique el detector de esquinas de Harris:
harris=cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_32F, 1);
int blockSize = 5;
int apertureSize = 7; //9
double k = 0.04;
cvCornerHarris( mono, harris, blockSize, apertureSize, k);
cvNamedWindow( "corners_window");
cvShowImage( "corners_window", harris);

2.2.- GoodFeaturesToTrack
d) aplique el siguiente código para hallar las esquinas del patrón:
#define MAX 500
CvPoint2D32f corners[MAX];
int i, corner_count=150;
eig = cvCreateImage (cvGetSize (img), IPL_DEPTH_32F, 1);
temp = cvCreateImage (cvGetSize (img), IPL_DEPTH_32F, 1);
cvGoodFeaturesToTrack (mono, eig, temp, corners, &corner_count, 0.1, 15);
//NOTA: cambiar 0.1 por 0.25, ó 0.35.
// imprimimos en pantalla el número de esquinas detectadas:
printf("esquinas detectadas gftt = %d\n", corner_count);
// dibujamos en la imagen las esquinas detectadas:
Img2=cvClone(img);
for (i = 0; i < corner_count; i++)
cvCircle (img2, cvPointFrom32f (corners[i]), 3, CV_RGB (255, 0, 0), 2,8,0);
cvNamedWindow( "corners_window2");
cvShowImage( "corners_window2", img2 );
Ejercicio:
Imprimir por pantalla las esquinas detectadas.
for(i=0;i<corner_count;i++)
printf("%f %f\n",corners[i].x,corners[i].y);

2.3.- cvFindChessboardCorners()
e) Utilice este comando para encontrar las esquinas interiores de un patrón.
cvFindChessboardCorners( img, cvSize(7,7), corners2, &corner_count2,
CV_CALIB_CB_ADAPTIVE_THRESH );
//Dibujamos las esquinas en la imagen:
Img3=cvClone(img);
cvDrawChessboardCorners( img3, cvSize(7,7), corners2, corner_count2, 1);
printf("esquinas encontradas: %d\n",corner_count2);
cvNamedWindow( " corners_window3", 1);
cvShowImage( " corners_window3",src );
f) Consulte con el manual y verifique los argumentos de este comando.
Ejercicio
Imprimir por pantalla las esquinas detectadas.

2
ESCUELA PROFESIONAL DE INGENIERÍA
ELECTRÓNICA
LABORATORIO DE PROCESAMIENTO
DIGITAL DE IMÁGENES
EXPERIENCIA N°8

3.- Detección de líneas con Transformada de Hough.


Aplique el siguiente código:
CvMemStorage* storage = cvCreateMemStorage(0);
CvSeq* lines = 0;
color_dst = cvCreateImage(CvSize(img->width, img->height), 8, 3);
cvCvtColor(canny, color_dst, CV_GRAY2BGR);
//NOTA: canny: imagen resultado de cvCanny()
lines = cvHoughLines2(canny,storage,CV_HOUGH_STANDARD, 1, CV_PI / 180, 100, 0, 0);
//dibujar lineas:
for (i = 0; i < MIN(lines->total, 50); i++)
{
float* line = (float*)cvGetSeqElem(lines, i);
float rho = line[0];
float theta = line[1];
CvPoint 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));
cvLine(color_dst, pt1, pt2, CV_RGB(255, 0, 0), 1, CV_AA, 0);
}
cvNamedWindow("ventana5", 1);
cvShowImage("ventana5", color_dst);

EJERCICIOS:
1.- En el ítem 2.2. ó 2.3, generar el fichero “nombre.txt” con los valores de las
esquinas detectadas.
NOTA: usar: fprintf()
FILE *fp;
fp = fopen("nombre.txt", "w");
for (i = 0; i<corner_count2; i++)
fprintf(fp, "%.2f %.2f\n", corners2[i].x, corners2[i].y);
fclose(fp);
2.- Leer y mostrar en pantalla “patron01.jpg” en Matlab (u otro programa), y
dibujar en ella las esquinas detectadas.
I=imread(‘juliIzq01.jpg’);
Imshow(I), hold on
[x1 x2]=textread(‘nombre.txt’,’%f %f’);
Plot(x1,x2,’g+’)
3.- Incrementar la precisión de las esquinas detectadas.
NOTA: usar el comando:
cvFindCornerSubPix(src_gray, corners, corner_count, cvSize(5,5), cvSize(-1,-1),
cvTermCriteria(CV_TERMCRIT_ITER, 100, 0.1));
4.- Verificar la detección de esquinas con otra imagen patrón con diferente
número de cuadrados.

IV INFORME.
Además de los resultados, se deberán adjuntar las conclusiones que se deriven
de la ejecución de la presente práctica.

También podría gustarte