Instrucciones OpenCV y C

Preview:

Citation preview

Dr. S. Rolando Cruz Ramírez

Agregar librerías

La primer librería "stdafx.h« la da por default el programa y no debemos borrarla.

Las siguientes librerías <cv.h>, <cxcore.h>, <highgui.h> son para incluir openCV en nuestro programa deben de introducirse las 3.

Validar librerías Para validarlas se da clic derecho sobre el nombre del proyecto y posteriormente en propiedades

Dentro de la propiedades del lado izquierdo, damos clic sobre C/C++, posteriormente en general y en «AdditionalIncludeDirectories».

Aquí adentro agregamos las rutas donde se encuentran las librerías en nuestra computadora.

Dentro de las mismas propiedades damos clic en «Linker», y dentro de el en «input».

Una vez aquí en «Additional Dependencies» también agregamos las librerías con la ruta de nuestra computadora,

Para agregar imágenes

Dentro de «int_tmain» el cual es el cuerpo de nuestro programa, declaramos las variables con la instrucción «IPlImage  *(nombre) = 0;». En nombre podemos asignar cualquier nombre que deseemos.

En este caso los nombres son img1 y img2

Después a cada nombre de imagen le asignamos la dirección donde se encuentra guardada nuestra imagen.

Si: Se encuentra dentro del mismo proyecto solo es necesario poner … y la ruta dentro del proyecto.

Se encuentra en cualquier otro lado es necesario escribir la ruta completa.

Con «cvNamedWindow» creamos la pantalla donde se mostrara la imagen, el nombre puede ser cualquiera, en este caso «DISPLAY».

Posteriormente en «cvShowImage» asignamos a la pantalla (DISPLAY), que imagen mostraremos. En este caso la «img1».

Por ultimo «cvWaitKey ()» es para esperar cualquier tecla antes de continuar.

Con «cvShowImage» mostramos la siguiente imagen «img».

Con «cvWaitKey» esperamos una tecla para continuar. Con «return 0;» terminamos el programa.

Crear puntos

Con «CvPoint» declaras variables que servirán como punto A, B, C, D y E. Con A.x asignas la ubicación del punto A en el eje x, en este caso en el pixel 0. Con A.y asignas la ubicación del punto A en el eje y, en este caso en el pixel 0. Con B.x asignas la ubicación del punto B en el eje x, en este caso al ultimo pixel 

que se encuentra a lo ancho de la img1. Con B.y asignas la ubicación del punto B en el eje y, en este caso al ultimo pixel 

que se encuentra a lo alto de la img1. Para asignar el ancho y alto se utiliza el comando «nombre imagen ‐> width o 

height».

Con «cvLine» creamos la línea, en este caso la creamos sobre img1, del punto A al punto B, con «CV_RGB»asignas el color de la línea modificando los tres canales, con 10 asignas el ancho de línea, con 25 el tipo de línea y finalmente 0.

Con «cvShowImage» muestra la línea en la pantalla «DISPLAY».

Dibujar Líneas

Con «cvRectangle» creas un rectángulo, defines en que imagen img1, después el punto superior izquierdo A, luego el punto inferior derecho B, con «CV_RGB»asignas el color al rectángulo, con 10 el ancho de línea y con 8 el tipo de línea.

Con «cvShowImage» muestras el rectángulo en la pantalla «DISPLAY».

Dibujar Rectángulo 

Dibujar circulo

Con E.x definimos la ubicación del punto E en el eje x, en este caso con width/2 a la mitad de la img1.

Con E.y definimos la ubicación del punto E en el eje y, en este caso con height/2 a la mitad de la img1.

Con «cvCircle» creamos el circulo en la img1, con centro en el punto E, con un radio de 100 pixeles, con CV_RGB asignamos el color a la línea del circulo, con 10 el ancho de la línea y con 8 el tipo de línea.

Con «cvShowImage» mostramos el circulo en la pantalla «DISPLAY».

Detector de Contornos

Comenzamos declarando 3 variables int las cuales son key, th_1 y th_2.

Declaramos la imagen src con «IplImage *nombre». A src le asignamos un clon con «cvCloneImage»proveniente de la imagen img_gray_scale declarada anteriormente.

Finalmente declaramos la imagen dst con «IplImage * nombre»

Ciclar programa

Con el fin de poder controlar ciertos parámetros con las teclas tenemos que ciclar nuestro programa. Con while { abrimos el ciclo. Dentro del ciclo creamos la imagen dst con «cvCreateImage», además al mismo tamaño de src, esto lo hacemos obteniendo el tamaño con «cvGetSize(imagen)».

Detección 

Con «cvCanny» detectamos el contorno, para esto lleva ciertos parámetros. Primero lleva de que imagen se va a detectar en este caso src, después lleva la imagen donde se mostrara el contorno en este caso dst, luego lleva dos valores th_1 y th_2 con los que variando podemos detectar mas o menos contornos.

Con «cvShowImage» mostramos la imagen en DISPLAY. Con «cvWaitKey» esperamos que se oprima una tecla.

Ciclo para controlar con teclado

A la variable key le asignamos que espera una tecla. Creamos el ciclo switch y le asignamos que verifique la variable key Si se presiona 1 case 49, th_1 disminuye en 10. Si se presiona 2 case 50, th_1 aumenta en 10. Si se presiona 3 case 51, th_2 disminuye en 10. Si se presiona 4 case 52, th_2 aumenta en 10. Si se presiona  esc case 27, se finaliza el swtich.

Con esto detectamos que teclas se presiona y modificamos las variables th_1 y th_2. Los numero de case se obtienen en base al código ASCII.

Imprimir valores

Con «printf» imprimimos texto en este caso imprimimos 2 con nombre de th_1 = %d y th_2 = %d y a este texto le asignamos las variables th_1 y th_2 respectivamente

Con «cvWaitKey» esperamos que se presione una tecla.

Con } cerramos el ciclo while. end: es en donde se rompe el switch.

Liberar espacio

Con «cvReleaseImage» eliminamos cada una de las imágenes que se crearon img1, img_gray_scale, etc.

Con «cvDestroyWindow» eliminamos la pantalla DISPLAY.

Con return 0 se termina el programa.

Trackbars 

Para el control por track bar primero se declaran las cabeceras de funciones «void nombre(int nombre)», además se declaran variables «int nombre=inicializa»

Creando track bars

El track bar se crea con «cvCreateTrackbar», y lleva de parámetros: Nombre del track bar (Radio_Y,) En que pantalla se mostrara(DISPLAY) Nombre de la variable a controlar antecedida por & (&slider_Cy) Numero final de longitud de track bar (1000) Nombre de la función que controla el trackbar ( F_inc_Cy)

Ciclo trackbar

Se declara la variable int  nombre ( int key) Se inicia ciclo while { Se espera que se presione una tecla y se le asigna a la variable creada. (key=cvWaitKey(1))

Se abre un ciclo switch analizando la variable (key)

En el switch: Si es un caso 13 que es cuando se presiona enter, se dibujara un circulo con cvCircle(nombre de la imagen donde se dibuja, nombre de la variable que controla el centro del circulo, nombre de la variable que controla el radio del circulo, colores con CV_RGB(r,g,b), ancho de línea y 8)

Si es un caso 27 que es cuando se presiona esc se finaliza el ciclo en end:

Creando las funciones

Después de declara la cabecera de funciones hay que definir las funciones de servicios, estas se crean al final del programa fuera del programa principal main.

Se comienza con void F‐inc_Cy(int h), nombre de la función designado cuando se declaro Y dentro de la función se pone la acción, en este caso la posición del track bar guardado 

en la variable slider_Cy se le asigna a la variable C_circulo.y que define la posición del centro del circulo en el eje y

En la función void F_inc_Cx se le asigna el valor de slider_Cx a la variable C_circulo.x que es la posición en el eje x del centro del circulo

Función umbral

Se declaran dos variables int i y j. Se crea una imagen con «IplImage *nombre=0;» A la imagen creada se le asigna una imagen «img_tmp=cvCloneImage(img_gray_scale);»

Se crea una variable uchar* nombre; Se abre el ciclo while(1){

Ciclo para analizar la imagen con función umbral

A la imagen img_gray_scale se le asigna un clon de la img_tmp con el objetivo que continuamente se este haciendo la función umbral al mover un track bar de lo contrario solo se haría una vez.

Se abre un ciclo for donde analizaremos la variable ifor(i=o, mientras i sea menor que el ancho lo seguirá 

haciendo, cada vez que analice suma uno a la cuenta de i) Se abre un ciclo j dentro del i para analizar el alto de la imagen

Dentro del ciclo j se realiza la función umbral Intensidad= &((uchar*)(imagen a analizar‐>imageData + imagen a analizar ‐>widthStep*variablej))[i];

Y luego se determina las condicionantes: si Intensidad es menor que lo que hay en la variable umbral entonces la intensidad se pondrá en 0. (if(Intensidad[0]<= umbral){Intensidad[0]=0})

De lo contrario Intensidad será igual a 255(else{ Intensidad[0]=255)

Para mostrar el resultado de la función se hace con cvShowImage.

Se espera el clic de una tecla para borrar la imagen con cvReleaseImage con el fin de no saturar la memoria.

La variable umbral con la que es comparada Intensidad 2 presentaciones anteriores es una función cuya definición es la de la imagen

A la variable umbral se le asigna el valor contenido en la variable slider_Cy obtenido a partir de un trackbar

Captura desde Cámara

Comenzamos con la declaración de variables CvCapture* nombre es para la cámara

Inicializamos la captura con cvCaptureFromCAM(0) y se lo asignamos a la variable capture.

Revisamos  con if si existe captura si no el programa finaliza.

Nota: el “0” de la cámara es el índice, se modifica según la cámara que usemos.

En frame se asigna un cvQueryFrame con capturecomo variable.

Se clona frame y se asigna a imagen.

Se revisa si frame existe con if, si no termina.

Finalmente se muestra en pantalla webcam lo que tenemos en imagen.

Detección de círculos

CvMemStorage* storage = cvCreateMemStorage(0) con esto  creamos un lugar de memoria para guardar los datos de los números.

CvSeq*circles, para crear la secuencia Con circles=cvHoughCircles(imagen, variable donde se guarda, método entrada, 2, min dist, 10, 120, 5, 300) hacemos la identificación de los círculos.

Nota: con los parámetros de numero se varían para modificar cuantos círculos detecta.

Se crea un for para mostrar en la imagen cada circulo detectado y los datos de cada circulo.

Se hace con float*nombre=(float*)cvGetSeqElem(circles,i).es decir datos=obtener secuencia(de círculos, en posición i)