Вы находитесь на странице: 1из 6

UNIVERSIDAD DE COSTA RICA

FACULTAD DE INGENIERA
ESCUELA DE INGENIERA ELCTRICA
ESTRUCTURAS ABSTRACTAS DE DATOS Y
ALGORITMOS PARA INGENIERA IE-0217
II CICLO 2014
LABORATORIO 6: manipulacin de imgen con punteros
OpenCV

Introduccin
OpenCV (Open source Computer Vision library ) es una biblioteca abierta de visin por computadora liberado
bajo licencia BSD que permite que pueda ser utilizada en propsitos tanto comerciales como acadmicos y de
investigacin. Ha sido escrita en lenguajes C++/C optimizados brindando mayor ventaja en procesamiento multincleo.
Esta poderosa biblioteca posee interfaces para C, C++, Python y Java y es soportando por mltiples plataformas incluyendo Linux y Android. Contiene ms de 500 funciones repartidas en diversas reas de visin por
computadora como: reconocimiento facial, reconocimiento de objetos, calibracin de cmaras y visin robtica lo
que 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 update
sudo 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 builde s s e n t i a l cmake pkgconfig l i b g t k 2 .0dev pythondev
pythonnumpy
Los siguientes paquetes son necesarios para leer y escribir en imgenes en distintos formatos como png, jpeg
y tiff entre otras.
sudo aptget i n s t a l l libpng120 libpng12dev libpng++dev libpng3 l i b p n g l i t e dev
l i b p n g w r i t e r 0 dev l i b p n g w r i t e r 0 c 2 zlib1g dbg z l i b 1 g zlib1g dev pngtools
l i b j a s p e r dev l i b j a s p e r runtime l i b j a s p e r 1 l i b j p e g 8 l i b j p e g 8 dbg l i b j p e g 6 2
libjpeg62 dev l i b j p e g progs 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 t o o l s
ffmpeg libavcodecdev libavcodec52 libavformat52 libavformatdev libswscale0
libswscaledev 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 el
directorio build dentro del directorio opencv-2.4.9.
wget h t t p : / / sourceforge . net / p r o j e c t s / opencvlibrary / f i l e s / opencvunix / 2 . 4 . 9 /
opencv 2 . 4 . 9 . z i p
unzip opencv 2 . 4 . 9 . z i p
cd opencv 2 . 4 . 9 . z i p

UNIVERSIDAD DE COSTA RICA


FACULTAD DE INGENIERA
ESCUELA DE INGENIERA ELCTRICA
ESTRUCTURAS ABSTRACTAS DE DATOS Y
ALGORITMOS PARA INGENIERA IE-0217
II CICLO 2014
LABORATORIO 6: manipulacin de imgen con punteros

mkdir b u i l d
cd b u i l d
A continuacin se configurar la lista cmake para generar los makefiles de la mdulos de OpenCV necesarios
a compilar.
cmake D CMAKE_BUILD_TYPE=RELEASE D CMAKE_INSTALL_PREFIX= / usr / l o c a l D
BUILD_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 / l d . 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 / l o c a l / l i b / pkgconfig
export PKG_CONFIG_PATH
Ejemplo
Una vez instalada la biblioteca, es hora de probar algunas funciones bsicas como imread, imshow, adems
de 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 c f l a g s l i b s
ejemplo.cpp
# include
# include
# include
# include

<opencv2 / core / core . hpp>


<opencv2 / highgui / highgui . hpp>
<opencv2 / imgproc / imgproc . hpp>
<iostream >

using namespace cv ;
using namespace std ;
i n t main ( i n t argc , char argv ) {
i f ( argc != 2 ) {
cout <<" Usage : display_image ImageToLoadAndDisplay" << endl ;
r e t u r n 1;}
Mat image = imread ( argv [ 1 ] , CV_LOAD_IMAGE_COLOR ) ;

UNIVERSIDAD DE COSTA RICA


FACULTAD DE INGENIERA
ESCUELA DE INGENIERA ELCTRICA
ESTRUCTURAS ABSTRACTAS DE DATOS Y
ALGORITMOS PARA INGENIERA IE-0217
II CICLO 2014
LABORATORIO 6: manipulacin de imgen con punteros

i f ( ! image . data ) {
/ / i f ( imge . empty ( ) ) { o t r a opcin
cout << "Could not open or f i n d the image" << endl ;
r e t u r n 1;}
Mat gray ;
cvtColor ( image , gray , CV_BGR2GRAY) ;
Mat sobelx ;
Sobel ( gray , sobelx , CV_32F , 1 , 0 ) ;
double minVal , maxVal ;
minMaxLoc ( sobelx , &minVal , &maxVal ) ; / / f i n d minimum and maximum i n t e n s i t i e s
Mat sobel ;
sobelx . convertTo ( sobel , CV_8U, 2 5 5 . 0 / ( maxValminVal ) , minVal 2 5 5 . 0 / ( maxValminVal ) ) ;
namedWindow( " Display Window" , CV_WINDOW_AUTOSIZE ) ;
imshow ( " Display Window" , image ) ;
namedWindow( " Result window" , CV_WINDOW_AUTOSIZE ) ;
imshow ( " Result window" , gray ) ;
namedWindow( " Result window 2" , CV_WINDOW_AUTOSIZE ) ;
imshow ( " Result window 2" , sobelx ) ;
namedWindow( " Result window 3" , CV_WINDOW_AUTOSIZE ) ;
imshow ( " Result window 3" , sobel ) ;
waitKey ( 0 ) ;
destroyWindow ( " Display Window" ) ;
destroyWindow ( " Result window" ) ;
destroyWindow ( " Result window" ) ;
destroyWindow ( " Result window" ) ;
return 0;
}

/ / wait f o r a keypress
/ / destroy the window
/ / destroy the window
/ / destroy the window
/ / destroy the window

Para ejecutar el programa, note que los parmetros se pasan por la linea de comandos por lo que debe agregar
el nombre de la imagen junto con su extensin al lado de la llamada a ejecucin. Por ejemplo:
. / ejemplo imagen . jpg
Implementacin

A continuacin lo que se le solicita es la implementacin en C++ de dos clases capaces cargar una imagen
y obtener parmetros como el ancho (width), altura (height), nmero de canales (channels) y adems poseer
mtodos simples para mostrar y guardar la imagen, junto con mtodos bsicos de procesamiento como modificar
los colores, dibujar sobre la imagen, filtrado, segmentacin entre otros. Se le dar el prototipo de las clases y cada
uno deber hacer la implementacin de estas, segn las especificaciones mostradas ms adelante. Adems de
la implementacin de un programa principal para probar cada mtodo de ambas clases.

UNIVERSIDAD DE COSTA RICA


FACULTAD DE INGENIERA
ESCUELA DE INGENIERA ELCTRICA
ESTRUCTURAS ABSTRACTAS DE DATOS Y
ALGORITMOS PARA INGENIERA IE-0217
II CICLO 2014
LABORATORIO 6: manipulacin de imgen con punteros

imagenRGB.hh
# include <opencv2 / core / core . hpp>
# include <opencv2 / highgui / highgui . hpp>
# include <iostream >
using namespace cv ;
using namespace std ;
# i f n d e f IMAGERGBCLASS
# define IMAGERGBCLASS
class ImageRGB{
private :
i n t width ;
i n t height ;
unsigned char data ;
public :
ImageRGB( void ) ;
/ / constructor l e e un imagen y l a almacena en a r r e g l o apuntado por data
~ImageRGB( void ) ;
/ / destructor l i b e r a memoria u t i l i z a d a
void showImage ( void ) ;
/ / muestra l a imagen almacenada en una ventana
void toGray ( void ) ;
/ / transforma l a imagen de color a escala de grises
void drawCircle ( i n t x , i n t y , unsigned i n t radius ) ;
/ / dibuja un c i r c u l o en l a f i g u r a en l a s coordenadas indicadas
}
#endif
imagenGS.hh
# include <opencv2 / core / core . hpp>
# include <opencv2 / highgui / highgui . hpp>
# include <iostream >
using namespace cv ;
using namespace std ;
# i f n d e f IMAGEGSCLASS
# define IMAGEGSCLASS
class ImageGS{
private :
i n t width ;
i n t height ;
unsigned char data ;
public :

UNIVERSIDAD DE COSTA RICA


FACULTAD DE INGENIERA
ESCUELA DE INGENIERA ELCTRICA
ESTRUCTURAS ABSTRACTAS DE DATOS Y
ALGORITMOS PARA INGENIERA IE-0217
II CICLO 2014
LABORATORIO 6: manipulacin de imgen con punteros

ImageGS ( void ) ;
/ / constructor l e e un imagen y l a almacena en a r r e g l o apuntado por data
~ImageGS ( void ) ;
/ / destructor l i b e r a memoria u t i l i z a d a
void showImage ( void ) ;
/ / muestra l a imagen almacenada en data en una ventana
void medianFilter ( i n t ksize ) ;
/ / f i l t r a l a imagen con ruido
void sobelOperator ( void ) ;
/ / detecta bordes en l a imagen
void thershold ( void ) ;
/ / segmenta l a imagen a t r a v s del v a l o r umbral
void variance ( i n t a , i n t k ) ;
/ / c a l c u l a l a varianza
}
#endif
Especificaciones
Para cada mtodo constructor debe utilizar la funcin imread de OpenCV para cargar una imagen desde su
directorio de trabajo en un objeto tipo Mat de OpenCV y despues copiar los datos a un arreglo manejado
por 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 datos
del arreglo data a un objeto Mat con su constructor respectivo de OpenCV. Investigue sobre la bandera
necesaria a utilizar en el constructor Mat, para que la imagen sea correctamente presentada por la funcin
imshow.
Para modificar la imagen de color (RGB) a escala de grises deber crear tres arreglos R, G y B para extraer
de la imagen almacenada en el arreglo data, cada canal de color correspondiente. Posteriormente deber
utilizar el mtodo de conversin luma que define el arreglo Y de un solo canal de escala de grises mediante
la combinacin lineal: Y = R + G + B donde = 0,299, = 0,587 y = 0,114. El mtodo toGray deber
guardar 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 el
centro y radius para el radio, verificando que este no quede fuera de los mrgenes de la imagen. Al igual
que el mtodo anterior, deber usar imwrite para guardar su resultado.
Para los mtodos medianFilter, sobelOperator, thershold, variance deber investigar como operar sobre el
arreglo de pxeles para modificar la imagen, recuerde usar un arreglo auxiliar para almacenar los datos
modificados y no alterar la imagen original. Al igual que los mtodos anteriores deber transformar los
resultados 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 alertar
de cualquier valor ingresado fuera de este rango.
Para el mtodo thershold deber usar un arreglo de enteros para obtener un histograma con el nmero de
apariciones de los diferentes valores de la escala de grises de la imagen. Luego utilizar el mtodo Otsu para
escoger el valor umbral ptimo que define la segmentacin binaria de la imagen.

UNIVERSIDAD DE COSTA RICA


FACULTAD DE INGENIERA
ESCUELA DE INGENIERA ELCTRICA
ESTRUCTURAS ABSTRACTAS DE DATOS Y
ALGORITMOS PARA INGENIERA IE-0217
II CICLO 2014
LABORATORIO 6: manipulacin de imgen con punteros

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

1X
2=
(Xi X)
n i=1

1X 2
X
n i=1 i

!
2
X

(1)

Вам также может понравиться