OpenCV
- Biblioteca open source para C/C++ para procesamiento de imagenes y vision computarizada, desarrollada inicialmente por Intel.
- Disponible en Linux, Mac, y Windows
- Tiene estructuras básicas de datos para operaciones con matrices y procesamiento de imagenes.
- Permite visualizar datos muy sencillamente y extraer informacion de imagenes y videos.
- Tiene funciones de captura y presentacion de imagenes.
Opencv se compone de 4 Modulos
- cv: Contiene las Funciones principales de la biblioteca
- cvaux: Contiene las Funciones Auxiliares (experimental)
- cxcore: Contiene las Estructuras de Datos y Funciones de soporte para Algebra lineal
- highgui: Funciones para manejo de la GUI
Instalación Debian y compilación
- Instalando:
apt-get install libopencv-dev opencv-doc
apt-get install libopencv-core2.4 libopencv-core-dev
apt-get install libopencv-highgui2.4 libopencv-highgui-dev
- Como compilar:
pkg-config --cflags --libs opencv
- pkg-config --list-all
- | grep allegro
- | grep opencv
- Compilando:
gcc -oej1 ej1-jpg.c `pkg-config --cflags --libs opencv`
Nombres de funciones y datos
- Convenciones para los nombres de las Funciones
- cvActionTargetMod (...)
- Action: Funcion core. Ej: set, create.
- Target: Elemento destino de la Accion. Ej: Contorno, polígono.
- Mod: Modificadores opcionales. Ej: Tipo de argumento.
- Matrix data types
- CV <bit depth>(S|U|F)C<número de canales>
- S: Entero Signado, U: Entero no Signado, F: Float
- Ej: CV 8UC1 : matriz de un canal de 8 bits no signados,
CV 32FC2: matriz de dos canales de 32 bits punto flotante.
- Tipos de datos de imagenes
- IPL DEPTH <bit depth>(S|U|F)
- Ej: IPL DEPTH 8U : imagen de 8 bits no signados.
IPL DEPTH 32F: imagen de 32 bits punto flotante.
Ejercicio1
ej1b-bmp.c y ej1a-jpg.c
Estos ejemplos abren un archivo BMP uno (sin compresion)
y JPG el otro (comprimido)
gcc -oej1a ej1a-bmp.c `pkg-config --cflags --libs opencv`
gcc -oej1b ej1a-jpg.c `pkg-config --cflags --libs opencv`
Bajar el archivo con los códigos de ejemplo que veremos.
Funciones Básicas
Carga de una imagen
IplImage *image = cvLoadImage("lenna.jpeg");
Crear y Ubicar una ventana
cvNamedWindow ("ejemplo1", CV_WINDOW_AUTOSIZE);
// Desde borde superior izquierdo
cvMoveWindow ("ejemplo1", 100, 100);
Mostrar la imagen en la ventana creada
cvShowImage("ejemplo1", image);
Liberar recursos
cvReleaseImage(&image);
Recordar convención de nombres: prefijoAcciónDestino
La estructura IplImage
typedef struct _IplImage {
int nSize;
int ID;
int nChannels;
int alphaChannel;
int depth;
char colorModel[4];
char channelSeq[4];
int dataOrder;
int origin;
int align;
int width;
int height;
// sigue...
struct _IplROI *roi;
struct _IplImage *maskROI;
void *imageId;
struct _IplTileInfo *tileInfo;
int imageSize;
char *imageData;
int widthStep;
int BorderMode[4];
int BorderConst[4];
char *imageDataOrigin;
} IplImage;
La estructura IplImage
La estructura IplImage
La estructura IplImage
- char *imageData;
- La imagen en memoria
- Cada elemento un pixel
- Un byte o 4 dependiendo si usamos color o no
- int nChannels;
- 1 si es matiz de grises
- RGB: 3 canales mas un 4to para canal alpha
- (o transparencias como en PNG o GIF)
- int width; int height;
- int widthStep;
- Cuanto avanzar para pasar a la siguiente linea.
Manejando grises o color
- 8 bit depth: Escala de grises
- Color 32bits:
- R: Rojo (8bits)
- G: Verde (8bits)
- B: Azul (8bits)
- Transparente (8bits)
Manejando grises o color
Manejando grises o color
Invirtiendo una imagen
ej3a-invert.c : Invirtiendo imagen de un canal (matiz de grises)
gcc -oej3a ej3a-invert.c `pkg-config --cflags --libs opencv`
ej3b-invert.c : Invirtiendo una imagen color
gcc -oej3b ej3b-invert.c `pkg-config --cflags --libs opencv`
La estructura IplImage
- Cualquier imagen va a parar a una estructura de este tipo.
- OpenCV permite visualizar videos desde dos fuentes de informacion:
- Camara web conectada a la PC
- Archivo avi
- La imagen de video se compone de cuadros de n*m pixeles
- Cada cuadro se carga en una estructura IplImage
Usando la camara de video
ej3a-invert.c : Invirtiendo imagen de un canal (matiz de grises)
gcc -oej2 ej2-webcam.c `pkg-config --cflags --libs opencv`