Está en la página 1de 5

ESCUELA PROFESIONAL DE INGENIERÍA

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

PROCESAMIENTO DIGITAL CON OPENCV


Autor: Lizardo Pari

I .- OBJETIVOS:
• Integrar las librerías openCv dentro del entorno de programación C++.
• Iniciar en la utilización de openCv.

II.- CONOCIMIENTOS PREVIOS


• Conocimientos de entorno de programación C++
• Conocimientos básicos de procesamiento digital de imágenes.

III.- PROCEDIMIENTO

1.- Introducción
OpenCV (Open Source Computer Vision Library) es una librería de funciones en C y
C++ que contiene un conjunto de utilidades de procesamiento de imágenes, visión
artificial, captura de vídeo y visualización de imágenes. Es de código abierto, gratuita,
multiplataforma (disponible para entornos MS Windows, Mac OS y Linux), de fácil uso y
en continuo desarrollo. Páginas web de OpenCV:
http://opencv.willowgarage.com/wiki (Documentación en wiki)
http://sourceforge.net/projects/opencvlibrary (Descargar librería)
http://groups.yahoo.com/group/OpenCV (Foro de discusión)

2.- Integración de OpenCv en C++.


2.1.- Visual Studio 2015, openCv 3.2
a) verificar que la variable de entorno es: c:\opencv\build\x64\vc14\bin
b). Crear un proyecto nuevo y vacío (elegir un nombre) Win32 aplicación de consola.
c) Crear un archivo fuente C++ y agregarlo al proyecto.
d).Verificar el proyecto esté en modo DEBUG X64
e) En Project – Properties, realizar lo siguiente:
En VC++ Directories, Executable Directories añadir C:\opencv\build\x64\vc14\bin
Library Directories añadir C:\opencv\build\x64\vc14\lib
En Linker
General, Aditional Library Directories, añadir: C:\opencv\build\x64\vc14\lib
Input, Additional Dependences, añadir: opencv_world320d.lib
En C/C++
General, Additional Include Directories, añadir: C:\opencv\build\include

2.2.- Visual Studio 2005, openCv 1.1


a). Crear un proyecto nuevo y vacío (elegir un nombre) win32 Console Application.
b) Crear un archivo fuente C++.
c) En Project – Properties – Configuration Properties, realizar lo siguiente:
- En c/c++ - General – Additional Include Directories, copiar:
C:\Opencv\cv\include,C:\Opencv\otherlibs\highgui,C:\opencv\cxcore\include
- En Linker – General – Additional Library directories, tipear: C:\Opencv\lib.
- En Linker – Input – Additional Dependencies, agregar: cv.lib highgui.lib cxcore.lib

1
Autor: Lizardo Pari P.
ESCUELA PROFESIONAL DE INGENIERÍA
ELECTRÓNICA
LABORATORIO DE PROCESAMIENTO
DIGITAL DE IMÁGENES
EXPERIENCIA N°6

3.- Comandos de inicio.


a). Copiar en la carpeta creada de este proyecto las imágenes: lena.jpg, fruits.jpg,
baboon.jpg, u otras que tenga.
b). Seguir los siguientes pasos:
1. Crear un archivo fuente en C++
1.1. para usar Opencv se debe incluir las siguientes cabeceras:
#include <cv.h>
#include <highgui.h>

NOTA: en la versión opencv 3.2:


#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>

1.2.- Leer y mostrar una imagen:


void main()
{
IplImage *img= cvLoadImage("baboon.jpg");
cvNamedWindow("Imagen", 0);
cvShowImage("Imagen", img);
cvWaitKey(0);
cvReleaseImage(&img);
}
NOTA: se puede llamar una imagen diferente de baboon.jpg.
c) Grabar, compilar y ejecutar el programa.

2.- EL TIPO DE DATOS IMAGEN: IplImage*


El tipo fundamental de OpenCV, el que nos permite representar imágenes, es
IplImage. Las imágenes pueden tener 1, 2, 3 ó 4 canales de un determinado tipo de
datos (DEPTH). Las variables para imágenes serán siempre punteros a la estructura
IplImage, ejemplo: IplImage *img.
Los campos fundamentales del tipo IplImage son:
img->depth tipo de datos de píxeles (IPL_DEPTH_8U, IPL_DEPTH_16S,
IPL_DEPTH_32S, IPL_DEPTH_32F, IPL_DEPTH_64F, ...)
img->nChannels número de canales de la imagen (normalmente 1 ó 3)
img->width ancho de la imagen (en píxeles)
img->height alto de la imagen (en píxeles)
img->origin origen de coordenadas; 0 = top-left (por defecto); 1 = bottom-left.
img->widthStep ancho efectivo de la imagen (en píxeles)
img->imageData datos de la imagen
En memoria las imágenes siempre están descomprimidas, el puntero img->imageData
apunta a la matriz de píxeles de la imagen.
Existen tres formas posibles de crear una nueva imagen:
Creando una nueva imagen vacía: cvCreateImage.
Leyendo una imagen desde un fichero: cvLoadImage.
Clonando una imagen existente: cvCloneImage.
Todas las demás funciones de OpenCV no crean imágenes, sino que necesitan que las
imágenes que se le pasan como parámetros existan.
Al dejar de usar las imágenes, deben de liberarse con cvReleaseImage.

2
Autor: Lizardo Pari P.
ESCUELA PROFESIONAL DE INGENIERÍA
ELECTRÓNICA
LABORATORIO DE PROCESAMIENTO
DIGITAL DE IMÁGENES
EXPERIENCIA N°6

3.- CREANDO IMÁGENES NUEVAS

3.1.- Crear una imagen vacía: cvCreateImage.


IplImage* cvCreateImage(CvSize size, int depth, int channels)
El primer parámetro es el tamaño (variable de tipo CvSize). El segundo es el tipo
de datos (IPL_DEPTH_ [8U, 8S, 16S, 16U, 32S, 32F, 64F]). Y el tercero es el
número de canales de la imagen.
Ejemplo:
IplImage *img;
img= cvCreateImage(cvSize(300, 200), IPL_DEPTH_8U, 3);
cvNamedWindow("Imagen vacía", 0);
cvShowImage("Imagen vacía", img);
¿Qué se ve? ¿Por qué? ¿Cómo inicializar la imagen?
(Respuesta: cvZero() y cvSet())
probar:
cvZero(img);
cvSet(img,CV_RGB(255,0,0),NULL);

3.2.- Leer una imagen desde un fichero:


IplImage* cvLoadImage (const char* nombre, int enColor=1)
El primer parámetro indica el nombre del fichero, y el segundo dice si se debe leer
en color (1), en grises (0) o tal y como esté en el fichero ( -1).
Probar:
cvNamedWindow("Imagen", 0);
for (int i= -1; i<=1; i++) {
IplImage *img= cvLoadImage("imagen.jpg", i);
cvShowImage("Imagen", img);
cvReleaseImage(&img);
cvWaitKey(4000);
}
3.3. Clonar una imagen existente: cvCloneImage.
IplImage* cvCloneImage (IplImage* entrada)
Probar:
cvNamedWindow("Imagen", 0);
IplImage *img= cvLoadImage("imagen.jpg");
for (int i= 0; i<255; i++) {
IplImage *cop= cvCloneImage(img);
cvSubS(cop, cvScalarAll(i), cop); // Restar una constante
cvShowImage("Imagen", cop);
cvReleaseImage(&cop);
cvWaitKey(10);
}
cvReleaseImage(&img);
3.4.-En cualquier caso, se deben liberar todas las imágenes al dejar de usarlas, con
cvReleaseImage(IplImage **img).

3
Autor: Lizardo Pari P.
ESCUELA PROFESIONAL DE INGENIERÍA
ELECTRÓNICA
LABORATORIO DE PROCESAMIENTO
DIGITAL DE IMÁGENES
EXPERIENCIA N°6

4.- ENTRADA/SALIDA BÁSICA


HighGUI incluye un mecanismo muy sencillo para crear ventanas para mostrar
imágenes de tipo IplImage. Las ventanas de HighGUI se referencian por un nombre,
que es una cadena de tipo char*.

4.1.- Para crear una nueva ventana:


void cvNamedWindow(char *nombreVentana, int flag)
flag indica si se puede redimensionar el tamaño de la ventana (0) o no (1).
Probar la diferencia, de poner cvNamedWindow("Ventana1",0);y
cvNamedWindow("Ventana1",1);

4.2.- Una vez creada una ventana, se muestran las imágenes en ella con:
void cvShowImage(char *nombreVentana, IplImage *img)

4.3.- La ventana se puede cambiar de tamaño con cvResizeWindow y de posición con


cvMoveWindow.
Probar:
cvNamedWindow("Ventana2", 0);
IplImage *img= cvCreateImage(cvSize(320,240), IPL_DEPTH_8U, 3);
for (int i= 0; i<256; i++) {
cvSet(img, CV_RGB((i&7)*36,(i&28)*9,i&224));
cvShowImage("Ventana2", img);
cvMoveWindow("Ventana2", i, 100);
cvWaitKey(10);
}
cvReleaseImage(&img);

4.4.- Las ventanas se pueden eliminar con cvDestroyWindow(char *nombre). Pero


también se puede dejar que las cierre el usuario del programa.

4.5.- Las imágenes se guardan en disco con cvSaveImage(nombre, img).


Disponemos de una gran variedad de formatos (BMP, JPG, TIF, GIF, PNG, etc.).
Ejemplo:
IplImage *img= cvLoadImage("imagen.bmp", 1);
cvSaveImage("salida.jpg", img);
cvReleaseImage(&img);

4.6.-En el caso de los archivos JPG, se puede indicar la calidad de compresión JPG
llamando a la función cvSaveImage con un tercer parámetro adicional.
IplImage *img= cvLoadImage("imagen.bmp");
int param[2]= {CV_IMWRITE_JPEG_QUALITY, 2};
cvSaveImage("imagen.jpg", img, param);
cvReleaseImage(&img);

4.7.- Leer una tecla de teclado:


int cvWaitKey(int time)
Lee una tecla, time indica cuánto tiempo esperar (milisegundos). Si no se pulsa en
ese intervalo, devuelve -1. Si time==0, espera indefinidamente. Nota: para que esta
operación funcione, debe haber alguna ventana de HighGUI abierta.

4
Autor: Lizardo Pari P.
ESCUELA PROFESIONAL DE INGENIERÍA
ELECTRÓNICA
LABORATORIO DE PROCESAMIENTO
DIGITAL DE IMÁGENES
EXPERIENCIA N°6

Ejemplo:
cvNamedWindow("Imagen", 0);
IplImage *img= cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 3);
cvShowImage("Imagen", img);
int tecla= 0, x= 320, y=240;
while (tecla!=27) {
tecla= cvWaitKey(1);
switch (tolower(tecla)) {
case 'q': x-=4; break;
case 'w': x+=4; break;
case 'p': y-=4; break;
case 'l': y+=4; break;
}
cvSmooth(img, img, CV_GAUSSIAN);
cvSubS(img, cvScalarAll(1), img);
cvCircle(img, cvPoint(x,y),20,CV_RGB(255,255,255),-1);
cvShowImage("Imagen", img);
}
cvReleaseImage(&img);
cvDestroyWindow("Imagen");

4.8.- El valor de los píxeles es de tipo CvScalar:


typedef struct CvScalar {
double val[4];
} CvScalar;

4.8.1.-Leer el valor de un píxel: CvScalar cvGet2D(img, y, x)

4.8.2.-Escribir el valor de un píxel: void cvSet2D(img, y, x, escalar)


Ejemplo de cvSet2D.
IplImage*img= cvCreateImage(cvSize(256,256),IPL_DEPTH_8U,3);
for (int y= 0;y<256;y++)
for (int x= 0; x<256; x++)
cvSet2D(img, y, x, CV_RGB(y,x,0));
cvShowImage("Resultado", img);
cvReleaseImage(&img);

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.

5
Autor: Lizardo Pari P.

También podría gustarte