Laboratorio 6

6
UNIVERSIDAD DE COSTA RICA FACULTAD DE INGENIERÍA ESCUELA DE INGENIERÍA ELÉCTRICA ESTRUCTURAS ABSTRACTAS DE DATOS Y ALGORITMOS PARA INGENIERÍA IE-0217 II CICLO 2014 LABORATORIO 6: manipulación de imágen con punteros OpenCV Introducción OpenCV (Open source Computer Vision library ) es una biblioteca abierta de visión por computadora liberado bajo licencia BSD que permite que pueda ser utilizada en propósitos tanto comerciales como académicos y de investigación. Ha sido escrita en lenguajes C++/C optimizados brindando mayor ventaja en procesamiento multi- núcleo. Esta poderosa biblioteca posee interfaces para C, C++, Python y Java y es soportando por múltiples plata- formas incluyendo Linux y Android. Contiene más de 500 funciones repartidas en diversas áreas de visión por computadora como: reconocimiento facial, reconocimiento de objetos, calibración de cámaras y visión robótica lo que permite un amplio uso en aplicaciones sofisticadas para diversos usuarios. Instalación Primero actualice la lista de repositorios y elimine cualquier versión instalada de ffmpeg y x264 sudo apt-get update sudo apt-get -qq remove ffmpeg x264 libx264 -dev Seguidamente se instalan las dependencias, las primeras tres son obligatorias, las restantes son opcionales: sudo apt-get install build -essential cmake pkg -config libgtk2.0 -dev python-dev python- numpy Los siguientes paquetes son necesarios para leer y escribir en imágenes en distintos formatos como png, jpeg y tiff entre otras. sudo apt-get install libpng12 -0 libpng12-dev libpng++ -dev libpng3 libpnglite -dev libpngwriter0 -dev libpngwriter0c2 zlib1g - dbg zlib1g zlib1g -dev pngtools libjasper -dev libjasper -runtime libjasper1 libjpeg8 libjpeg8 - dbg libjpeg62 libjpeg62 -dev libjpeg -progs libtiff4 -dev libtiff4 libtiffxx0c2 libtiff -tools ffmpeg libavcodec-dev libavcodec52 libavformat52 libavformat -dev libswscale0 libswscale -dev openexr libopenexr6 libopenexr -dev Se recomiendan otros paquetes adicionales (opcional) sudo apt-get install swing bzip2 Descargue los archivos en fuente un directorio local de su preferencia, descomprima el archivo y cree el directorio build dentro del directorio opencv-2.4.9. wget http : / / sourceforge . net / projects / opencvlibrary / files /opencv -unix/2.4.9/ opencv - 2.4.9.zip unzip opencv - 2.4.9.zip cd opencv - 2.4.9.zip

description

Ejercicios de procesamiento de imágenes con OpenCV

Transcript of Laboratorio 6

  • UNIVERSIDAD DE COSTA RICAFACULTAD DE INGENIERA

    ESCUELA DE INGENIERA ELCTRICAESTRUCTURAS ABSTRACTAS DE DATOS YALGORITMOS PARA INGENIERA IE-0217

    II CICLO 2014LABORATORIO 6: manipulacin de imgen con punteros

    OpenCV

    Introduccin

    OpenCV (Open source Computer Vision library ) es una biblioteca abierta de visin por computadora liberadobajo licencia BSD que permite que pueda ser utilizada en propsitos tanto comerciales como acadmicos y deinvestigacin. Ha sido escrita en lenguajes C++/C optimizados brindando mayor ventaja en procesamiento multi-ncleo.

    Esta poderosa biblioteca posee interfaces para C, C++, Python y Java y es soportando por mltiples plata-formas incluyendo Linux y Android. Contiene ms de 500 funciones repartidas en diversas reas de visin porcomputadora como: reconocimiento facial, reconocimiento de objetos, calibracin de cmaras y visin robtica loque permite un amplio uso en aplicaciones sofisticadas para diversos usuarios. Instalacin

    Primero actualice la lista de repositorios y elimine cualquier versin instalada de ffmpeg y x264

    sudo aptget updatesudo aptget qq remove ffmpeg x264 libx264dev

    Seguidamente se instalan las dependencias, las primeras tres son obligatorias, las restantes son opcionales:

    sudo aptget i n s t a l l buildessent ia l cmake pkgconfig l ibgtk2 .0dev pythondevpythonnumpy

    Los siguientes paquetes son necesarios para leer y escribir en imgenes en distintos formatos como png, jpegy tiff entre otras.

    sudo aptget i n s t a l l libpng120 libpng12dev libpng++dev libpng3 l ibpngl i te devlibpngwriter0dev libpngwriter0c2 zlib1gdbg zl ib1g zlib1gdev pngtoolsl ib jasper dev l ib jasper runtime l ib jasper1 l ib jpeg8 libjpeg8dbg libjpeg62libjpeg62dev l ibjpegprogs l i b t i f f 4 dev l i b t i f f 4 l i b t i f f x x 0 c 2 l i b t i f f toolsffmpeg libavcodecdev libavcodec52 libavformat52 libavformatdev libswscale0libswscaledev openexr libopenexr6 libopenexrdev

    Se recomiendan otros paquetes adicionales (opcional)

    sudo aptget i n s t a l l swing bzip2

    Descargue los archivos en fuente un directorio local de su preferencia, descomprima el archivo y cree eldirectorio build dentro del directorio opencv-2.4.9.

    wget http : / / sourceforge . net / projects / opencvlibrary / f i l e s / opencvunix / 2 . 4 . 9 /opencv 2.4 .9 . zip

    unzip opencv2.4 .9 . zip

    cd opencv 2.4 .9 . zip

  • UNIVERSIDAD DE COSTA RICAFACULTAD DE INGENIERA

    ESCUELA DE INGENIERA ELCTRICAESTRUCTURAS ABSTRACTAS DE DATOS YALGORITMOS PARA INGENIERA IE-0217

    II CICLO 2014LABORATORIO 6: manipulacin de imgen con punteros

    mkdir build

    cd build

    A continuacin se configurar la lista cmake para generar los makefiles de la mdulos de OpenCV necesariosa compilar.

    cmake D CMAKE_BUILD_TYPE=RELEASE D CMAKE_INSTALL_PREFIX=/ usr / local DBUILD_ZLIB=ON D BUILD_PYTHON_SUPPORT=ON . . /

    Seguidamente compilamos las fuentes.

    make

    Instalamos la biblioteca.

    sudo make i n s t a l l

    Adicionalmente se configura el path a OpenCV, creando el archivo opencv.conf en el directorio /etc/ld.so.conf.d/y agregando en la primera linea el texto /usr/local/lib

    sudo nano / etc / ld . so . conf . d / opencv . conf

    Finalmente se configura la variable PKG_CONFIG_PATH, abriendo el archivo bash.bashrc

    sudo nano / etc / bash . bashrc

    y agregando las siguientes dos linea al final del archivo

    PKG_CONFIG_PATH=$PKG_CONFIG_PATH : / usr / local / l i b / pkgconfigexport PKG_CONFIG_PATH

    Ejemplo

    Una vez instalada la biblioteca, es hora de probar algunas funciones bsicas como imread, imshow, ademsde familiarizarse con algunas estructuras de datos de OpenCV como Mat.

    Copie el siguiente archivo ejemplo.cpp y compile de la siguiente manera.

    g++ o ejemplo ejemplo . cpp pkgconfig opencv cflags l ibs

    ejemplo.cpp

    #include #include #include #include

    using namespace cv ;using namespace std ;

    i n t main ( i n t argc , char argv ) {i f ( argc != 2 ) {

    cout

  • UNIVERSIDAD DE COSTA RICAFACULTAD DE INGENIERA

    ESCUELA DE INGENIERA ELCTRICAESTRUCTURAS ABSTRACTAS DE DATOS YALGORITMOS PARA INGENIERA IE-0217

    II CICLO 2014LABORATORIO 6: manipulacin de imgen con punteros

    i f ( ! image . data ) {/ / i f ( imge . empty ( ) ) { otra opcin

    cout

  • UNIVERSIDAD DE COSTA RICAFACULTAD DE INGENIERA

    ESCUELA DE INGENIERA ELCTRICAESTRUCTURAS ABSTRACTAS DE DATOS YALGORITMOS PARA INGENIERA IE-0217

    II CICLO 2014LABORATORIO 6: manipulacin de imgen con punteros

    imagenRGB.hh

    #include #include #include

    using namespace cv ;using namespace std ;

    # i fndef IMAGERGBCLASS#define IMAGERGBCLASS

    class ImageRGB{pr ivate :

    i n t width ;i n t height ;unsigned char data ;

    public :ImageRGB( void ) ;/ / constructor lee un imagen y la almacena en arreglo apuntado por data~ImageRGB( void ) ;/ / destructor l ibera memoria u t i l i z a d avoid showImage( void ) ;/ / muestra la imagen almacenada en una ventanavoid toGray ( void ) ;/ / transforma la imagen de color a escala de grisesvoid drawCircle ( i n t x , i n t y , unsigned i n t radius ) ;/ / dibuja un circulo en la f igura en las coordenadas indicadas

    }#endif

    imagenGS.hh

    #include #include #include

    using namespace cv ;using namespace std ;

    # i fndef IMAGEGSCLASS#define IMAGEGSCLASS

    class ImageGS{pr ivate :

    i n t width ;i n t height ;unsigned char data ;

    public :

  • UNIVERSIDAD DE COSTA RICAFACULTAD DE INGENIERA

    ESCUELA DE INGENIERA ELCTRICAESTRUCTURAS ABSTRACTAS DE DATOS YALGORITMOS PARA INGENIERA IE-0217

    II CICLO 2014LABORATORIO 6: manipulacin de imgen con punteros

    ImageGS( void ) ;/ / constructor lee un imagen y la almacena en arreglo apuntado por data~ImageGS( void ) ;/ / destructor l ibera memoria u t i l i z a d avoid showImage( void ) ;/ / muestra la imagen almacenada en data en una ventanavoid medianFilter ( i n t ksize ) ;/ / f i l t r a la imagen con ruidovoid sobelOperator ( void ) ;/ / detecta bordes en la imagenvoid thershold ( void ) ;/ / segmenta la imagen a travs del valor umbralvoid variance ( i n t a , i n t k ) ;/ / calcula la varianza

    }#endif

    Especificaciones

    Para cada mtodo constructor debe utilizar la funcin imread de OpenCV para cargar una imagen desde sudirectorio de trabajo en un objeto tipo Mat de OpenCV y despues copiar los datos a un arreglo manejadopor el puntero miembro data.

    Los mtodos destructor de cada clase debern liberar la memoria utilizada por el puntero miembro data.

    El mtodo showImage() deber utilizar la funcin imshow de OpenCV. Para ello deber pasar los datosdel arreglo data a un objeto Mat con su constructor respectivo de OpenCV. Investigue sobre la banderanecesaria a utilizar en el constructor Mat, para que la imagen sea correctamente presentada por la funcinimshow.

    Para modificar la imagen de color (RGB) a escala de grises deber crear tres arreglos R, G y B para extraerde la imagen almacenada en el arreglo data, cada canal de color correspondiente. Posteriormente deberutilizar el mtodo de conversin luma que define el arreglo Y de un solo canal de escala de grises mediantela combinacin lineal: Y = R+G+ B donde = 0,299, = 0,587 y = 0,114. El mtodo toGray deberguardar la imagen transformada en su directorio de trabajo utilizando la funcin imwrite de OpenCV.

    El mtodo drawCricle deber dibujar un crculo dentro de la imagen segn las coordenadas x y y para elcentro y radius para el radio, verificando que este no quede fuera de los mrgenes de la imagen. Al igualque el mtodo anterior, deber usar imwrite para guardar su resultado.

    Para los mtodos medianFilter, sobelOperator, thershold, variance deber investigar como operar sobre elarreglo de pxeles para modificar la imagen, recuerde usar un arreglo auxiliar para almacenar los datosmodificados y no alterar la imagen original. Al igual que los mtodos anteriores deber transformar losresultados en un objeto Mat para guardar la imagen con imwrite.

    El parmetro k del mtodo medianFilter define el tamao del vecindario del kernel aplicado en el filtro.Recuerde que este parmetro debe ser impar y mayor que 1, por lo que su implementacin deber alertarde cualquier valor ingresado fuera de este rango.

    Para el mtodo thershold deber usar un arreglo de enteros para obtener un histograma con el nmero deapariciones de los diferentes valores de la escala de grises de la imagen. Luego utilizar el mtodo Otsu paraescoger el valor umbral ptimo que define la segmentacin binaria de la imagen.

  • UNIVERSIDAD DE COSTA RICAFACULTAD DE INGENIERA

    ESCUELA DE INGENIERA ELCTRICAESTRUCTURAS ABSTRACTAS DE DATOS YALGORITMOS PARA INGENIERA IE-0217

    II CICLO 2014LABORATORIO 6: manipulacin de imgen con punteros

    En el mtodo variance deber procesar la imagen para calcular la varianza dentro de un vecindario detamao k utilizando la frmula mostrada en (1). Con el parmetro a se escoger si el clculo se hacerecorriendo cada pixel de la imagen, o si se utilizan imgenes integrales

    1n

    ni=1

    (Xi X)2 =(

    1n

    ni=1

    X2i

    ) X2 (1)