OpenCV

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.

Documentación


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

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;
    • Lo que uno se imagina ;)
  • 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`

Procesamiento de imagenes

Algunos algoritmos


    • Resize
    • Blur
      • Simple
      • Por radio
    • Bordes
      • Sencillo
      • Canny

Ejemplos


    • Base de trabajo
      • ej5-imgproc.h
      • ej5-imgproc.c
    • Ejemplos
      1. ej5b-resize.c
      2. ej5c-blur.c
      3. ej5c-blur2.c
      4. ej5a-bordes.c


Para cada ejemplo crearemos un archivo.c
con el código de procesar_imagen()


Función Allegro Canny:

  • ej4a-canny.c
  • ej4b-canny.c

Bajar zip con los ejemplos (mismo de antes)

Algoritmo Resize y Blur


  • Resize
    • Voy recorriendo y sacando el promedio de a 4 pixels
    • Pnuevo = (Pi + Px + Py + Pz ) / 4

  • Blur
    • Voy recorriendo y sacando el promedio de los pixeles de alrededor.
    • Version sencilla 3x3. Version mejorada recorro el entorno con un radio de acción.

Algoritmo de bordes sencillo



Si llevamos esto a puntos: 2*pi - px - py

Con esto logramos un algoritmo similar a
la definición de derivada en horizontal y vertical.

Algoritmo de bordes sencillo


    Como resultado tendremos:
    • Si los valores de cada punto son similares:
      • La resta nos lleva al negro
    • Si los valores de cada punto son distintos:
      • La resta nos lleva al blanco

Canny


    Del opencv2refman.pdf (p135):
  • image: single-channel 8-bit input image.
  • edges: output edge map; it has the same size and type as image.
  • threshold1: first threshold for the hysteresis procedure.
  • threshold2: second threshold for the hysteresis procedure.
  • apertureSize: aperture size for the Sobel() operator.

Histeresis


Canny / Detección bordes