Laboratorio 6
-
Upload
ernesto-cespedes -
Category
Documents
-
view
11 -
download
2
description
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)