72
Introduccion al uso de OpenCV (1) Dr. J.B. Hayet CENTRO DE INVESTIGACI ´ ON EN MATEM ´ ATICAS Agosto 2007 , J.B. Hayet OpenCV parte 1, Agosto 2007 1 / 72

opencv1

Embed Size (px)

DESCRIPTION

Para que funccione una aplicacion de CV se necesita varioscomponentes en areas bien distintas : procesamiento de senal,algebra lineal, optimizacion. . .Para aplicaciones de cierto nivel de complejidad en CV,much´ısimo trabajo; no queremos re-inventar la rueda

Citation preview

Page 1: opencv1

Introduccion al uso de OpenCV (1)

Dr. J.B. Hayet

CENTRO DE INVESTIGACION EN MATEMATICAS

Agosto 2007

,J.B. Hayet OpenCV parte 1, Agosto 2007 1 / 72

Page 2: opencv1

Outline

1 Descripcion general e instalacion

2 Estructuras esenciales de OpenCV

3 Programar con OpenCV

,J.B. Hayet OpenCV parte 1, Agosto 2007 2 / 72

Page 3: opencv1

Motivacion

Para que funccione una aplicacion de CV se necesita varioscomponentes en areas bien distintas : procesamiento de senal,algebra lineal, optimizacion. . .

Para aplicaciones de cierto nivel de complejidad en CV,muchısimo trabajo; no queremos re-inventar la rueda !

,J.B. Hayet OpenCV parte 1, Agosto 2007 3 / 72

Page 4: opencv1

Descripcion general e instalacion

Outline

1 Descripcion general e instalacion

2 Estructuras esenciales de OpenCV

3 Programar con OpenCV

,J.B. Hayet OpenCV parte 1, Agosto 2007 4 / 72

Page 5: opencv1

Descripcion general e instalacion

Origen

Laboratorios de Intel (aplicaciones particulares)

Adaptado para chips Intel (con libreria IPP), uso de primitivasde tipo MMX, SSE. . .

,J.B. Hayet OpenCV parte 1, Agosto 2007 5 / 72

Page 6: opencv1

Descripcion general e instalacion

Breve descripcion

Libreria en C/C++ (pero no intrinsicamente OO)

Open Source, Licencia de tipo BSD

Alto nivel de optimizacion ; dedicado aplicaciones tiempo real

Versiones Windows/Linux/MacOS

Herramientas para cargar, salvar, adquirir imagenes o vıdeo

,J.B. Hayet OpenCV parte 1, Agosto 2007 6 / 72

Page 7: opencv1

Descripcion general e instalacion

Como conseguirla

Sitio de Intelhttp://www.intel.com/technology/computing/opencv/

Sourceforgehttp://sourceforge.net/projects/opencvlibrary/

Viene como paquete en Ubuntu

,J.B. Hayet OpenCV parte 1, Agosto 2007 7 / 72

Page 8: opencv1

Descripcion general e instalacion

Documentacion y soporte

Documentacion con el software

Active group [email protected]

,J.B. Hayet OpenCV parte 1, Agosto 2007 8 / 72

Page 9: opencv1

Descripcion general e instalacion

La competencia. . .

LTI-LibMejor estructuracion (C++ completamente OO) pero menoseficiente al mas bajo nivel de procesamiento. Conveniente parametas didacticas. Representacion de imagenes de color diferente(RGBA)

VXLPor la gente de Oxford

,J.B. Hayet OpenCV parte 1, Agosto 2007 9 / 72

Page 10: opencv1

Descripcion general e instalacion

Los +’s y -’s

+ Eficiencia (business. . . )

+ Comunidad activa de desarolladores

+ Cantidad de funcciones disponibles (>500)

- No OO, clases etc. . .

- Estructuracion menos fuerte

,J.B. Hayet OpenCV parte 1, Agosto 2007 10 / 72

Page 11: opencv1

Descripcion general e instalacion

Estructura general (1)

5 librerias vienen en OpenCV

cxcore : estructuras basicascv : principales algoritmoscvaux : algoritmos mas experimentaleshigui : GUI and Video I/Oml : machine learning

,J.B. Hayet OpenCV parte 1, Agosto 2007 11 / 72

Page 12: opencv1

Descripcion general e instalacion

Estructura general (2)

functions

cv

Stable image processing

and vision functions

cvaux

Experimental stuff

higui

I/O and display

ml

Machine learning

AplicacionIntegrated Performance

Primitives

IPP cxcore

Core structures and

,J.B. Hayet OpenCV parte 1, Agosto 2007 12 / 72

Page 13: opencv1

Descripcion general e instalacion

Manejamiento de la memoria

Funciones dedicadas para alocacion y liberacion de memoriaEstructuras de bajo nivel para manejar estructuras dinamicas,compuestas de bloques de memoria de tamano dado,organizadas en una pila :

typedef s t ruc t CvMemStorage {s t ruc t CvMemBlock∗ bottom ; /∗ p r ime r b loque ∗/s t ruc t CvMemBlock∗ top ; /∗ b loque a c t u a l ∗/s t ruc t CvMemStorage∗ pa r en t ;i n t b l o c k s i z e ; /∗ tamano ∗/i n t f r e e s p a c e ; /∗ e s p a c i o l i b r e en a c t u a l ∗/

} CvMemStorage ;

Para estructuras dinamicas (grafos. . . ) se necesita tenerreservado ya (en inicializacion esta zona de memoria :

CvMemStorage∗ cvCreateMemStorage ( i n t s i z e =0);

,J.B. Hayet OpenCV parte 1, Agosto 2007 13 / 72

Page 14: opencv1

Estructuras esenciales de OpenCV

Outline

1 Descripcion general e instalacion

2 Estructuras esenciales de OpenCV

3 Programar con OpenCV

,J.B. Hayet OpenCV parte 1, Agosto 2007 14 / 72

Page 15: opencv1

Estructuras esenciales de OpenCV

Puntos

typedef s t ruc t CvPoint {i n t x ; /∗ x−coo rd i n a t e , u s u a l l y zero−based ∗/i n t y ; /∗ y−coo rd i n a t e , u s u a l l y zero−based ∗/

} CvPoint ;typedef s t ruc t CvPoint2D32f {

f l o a t x ; /∗ x−coo rd i n a t e , u s u a l l y zero−based ∗/f l o a t y ; /∗ y−coo rd i n a t e , u s u a l l y zero−based ∗/

} CvPoint2D32f ;typedef s t ruc t CvPoint2D64f {

double x ; /∗ x−coo rd i n a t e , u s u a l l y zero−based ∗/double y ; /∗ y−coo rd i n a t e , u s u a l l y zero−based ∗/

} CvPoint2D64f ;

Igual para puntos 3D con una tercera componente.

,J.B. Hayet OpenCV parte 1, Agosto 2007 15 / 72

Page 16: opencv1

Estructuras esenciales de OpenCV

Puntos : constructores

CvPoint p = cvPo in t ( x , y ) ;CvPoint2D32f p = cvPo int2D32f ( xf , y f ) ;CvPoint3D32f p = cvPo int3D32f ( xf , y f , z f ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 16 / 72

Page 17: opencv1

Estructuras esenciales de OpenCV

Tamano

typedef s t ruc t CvSize {i n t width ; /∗ width o f the r e c t a n g l e ∗/i n t h e i g h t ; /∗ h e i g h t o f the r e c t a n g l e ∗/

} CvSize ;

Constructor:

CvSize p = cvS i z e ( width , h e i g h t ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 17 / 72

Page 18: opencv1

Estructuras esenciales de OpenCV

Rectangulos

typedef s t ruc t CvRect {i n t x ; /∗ x o f the l e f t −most c o r n e r [ s ] ∗/i n t y ; /∗ y o f the top−most or bottom−most

r e c t a n g l e c o r n e r [ s ] ∗/i n t width ; /∗ width o f the r e c t a n g l e ∗/i n t h e i g h t ; /∗ h e i g h t o f the r e c t a n g l e ∗/

} CvRect ;

Constructor:

CvRect r = cvRect ( posx , posy , width , h e i g h t ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 18 / 72

Page 19: opencv1

Estructuras esenciales de OpenCV

Escalares

Estructura para 1-,2-,3- or 4-tuples

typedef s t ruc t CvSca l a r {double v a l [ 4 ] ;

} CvSca l a r ;

Constructor:

CvSca l a r c o l o r = c vS c a l a r (b , g , r ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 19 / 72

Page 20: opencv1

Estructuras esenciales de OpenCV

Matrices

typedef s t ruc t CvMat {i n t type ; /∗ S igna tu r e , t ype and f l a g s ∗/i n t s t e p ; /∗ f u l l row l e ng t h i n by t e s ∗/i n t ∗ r e f c o u n t ; /∗ data r e f . c oun t e r ∗/union {

uchar ∗ p t r ;short ∗ s ;i n t ∗ i ;f l o a t ∗ f l ;double∗ db ;

} data ; /∗ data p o i n t e r s ∗/

i n t rows ; /∗ number o f rows ∗/i n t c o l s ; /∗ number o f columns ∗/

} CvMat ;,

J.B. Hayet OpenCV parte 1, Agosto 2007 20 / 72

Page 21: opencv1

Estructuras esenciales de OpenCV

Matrices

Una matriz = un header (CvMat) + datos

Creacion de matrices :

CvMat∗ cvCreateMat ( i n t rows , i n t co l s , i n t type ) ;

Liberacion de la memoria :

void cvRe leaseMat ( CvMat∗∗ mat ) ;

Ejemplo :

mS im i l a r i t y = cvCreateMat (3 , 3 , CV 32FC1 ) ;. . .cvRe leaseMat (& mS im i l a r i t y ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 21 / 72

Page 22: opencv1

Estructuras esenciales de OpenCV

Matrices

Posibilidad de reservar memoria solo para el header usandoespacio ya reservado para los datos

CvMat∗ cv In i tMatHeade r (CvMat∗ mat , i n t rows ,i n t co l s , i n t type ,void ∗ data=NULL ,i n t s t e p=CV AUTOSTEP ) ;

Por ejemplo,

double a [ ] = { 1 , 2 , 4 ,5 , 6 , 7 ,9 , 10 , 12 } ;

CvMat Ma;cv In i tMatHeade r (&Ma, 3 , 3 , CV 64FC1 , a ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 22 / 72

Page 23: opencv1

Estructuras esenciales de OpenCV

Matrices : data types

CV_<bit_depth>(S|U|F)C<numero_de_canales>

S = entero signado

U = entero no signado

F = flotante

Ejemplos :

CV_8UC1 : 1 canal de octetos no signados.

CV_32FC2: 2 canales de flotantes.

,J.B. Hayet OpenCV parte 1, Agosto 2007 23 / 72

Page 24: opencv1

Estructuras esenciales de OpenCV

Matrices : data types

Cuidado al checar el tipo : el campo “type” lleva muchos flagsademas del de tipo (por ejemplo para indicar que no es contigua enmemoria). Usar las macros correspondientes :

#define CV_MAT_TYPE(flags) ((flags) & CV_MAT_TYPE_MASK)

Verlas todas en cxtypes.h

,J.B. Hayet OpenCV parte 1, Agosto 2007 24 / 72

Page 25: opencv1

Estructuras esenciales de OpenCV

Matrices : acceder al elemento i,j (1)

Usar las funciones:

void cvSet2D ( CvArr∗ a r r , i n t i , i n t j , CvSca l a r v ) ;void cvSetReal2D ( CvArr∗ a r r , i n t i , i n t j , double v a l u e ) ;

Seguro pero poco eficiente.

,J.B. Hayet OpenCV parte 1, Agosto 2007 25 / 72

Page 26: opencv1

Estructuras esenciales de OpenCV

Matrices : acceder al elemento i,j (2)

Usar las funciones:

void cvmSet ( CvMat∗ mat , i n t row , i n t co l , double v a l ) ;double cvmGet ( const CvMat∗ mat , i n t row , i n t c o l ) ;

Funcciona solo para matrices de tipo flotante (float/double) peroesta mas rapido que cvSetReal2D : esta inline, no hace tantasverificaciones

,J.B. Hayet OpenCV parte 1, Agosto 2007 26 / 72

Page 27: opencv1

Estructuras esenciales de OpenCV

Matrices : acceder al elemento i,j (3)

Acceso directo:

CvMat∗ M = cvCreateMat (4 , 4 , CV 32FC1 ) ;i n t s t e p = M−>s t e p / s i z eo f ( f l o a t ) ;f l o a t ∗ data = M−>data . f l ;

( data+i ∗ s t e p ) [ j ] = 3 . 0 ;

Aun mas rapido pero cuidado (paso y limites) !

,J.B. Hayet OpenCV parte 1, Agosto 2007 27 / 72

Page 28: opencv1

Estructuras esenciales de OpenCV

Matrices : acceder al elemento i,j (4)

Acceso en un ciclo:

CvMat∗ M = cvCreateMat (400 ,400 , CV 32FC1 ) ;i n t s t e p = M−>s t e p / s i z eo f ( f l o a t ) , i , j ;f l o a t ∗ data ;

f o r ( i =0; i<M−>rows ; i++) {data = M−>data . f l+i ∗ s t e p ;f o r ( j =0; j<M−>c o l s ; j++) {

∗( data++) = j ∗ i− i ;}

}

Aun mas rapido, pero tambien cuidado.

,J.B. Hayet OpenCV parte 1, Agosto 2007 28 / 72

Page 29: opencv1

Estructuras esenciales de OpenCV

Matrices : acceder al elemento i,j (5)

Usar macros definidas ya :

#def ine CV MAT ELEM PTR FAST(mat , row , co l , p i x s i z e )\( a s s e r t ( ( unsigned ) ( row)<(unsigned ) ( mat ) . rows &&\

( unsigned ) ( c o l )<(unsigned ) ( mat ) . c o l s ) ,\(mat ) . data . p t r+( s i z e t ) ( mat ) . s t e p ∗( row)+( p i x s i z e )∗ ( c o l ) )

#def ine CV MAT ELEM( mat , e lemtype , row , c o l )\(∗ ( e l emtype ∗)CV MAT ELEM PTR FAST(mat , row , co l ,\

s i z eo f ( e l emtype ) ) )

,J.B. Hayet OpenCV parte 1, Agosto 2007 29 / 72

Page 30: opencv1

Estructuras esenciales de OpenCV

Imagenes

typedef s t ruc t I p l Imag e {i n t nS i z e ; /∗ s i z e o f ( I p l Image ) ∗/i n t ID ; /∗ v e r s i o n (=0)∗/i n t nChanne l s ; /∗ 1 ,2 ,3 or 4 ∗/i n t depth ; /∗ depth i n b i t s ∗/i n t dataOrder ; /∗ 0 ( i n t e r l . ) , 1 ( sep . ) ∗/i n t o r i g i n ; /∗ 0 ( t− l . ) , 1 (b− l . ) ∗/i n t width ; /∗ image width ∗/i n t h e i g h t ; /∗ image h e i g h t ∗/s t ruc t I p lRO I ∗ r o i ; /∗ image ROI ∗/i n t imageS i ze ; /∗ data s i z e i n by t e s ∗/char ∗ imageData ; /∗ a l i g n e d data ∗/i n t widthStep ; /∗ row s i z e i n by t e s ∗/char ∗ imageDataOr ig in ; /∗ ” r e a l ” data ∗/

} I p l Image ;,

J.B. Hayet OpenCV parte 1, Agosto 2007 30 / 72

Page 31: opencv1

Estructuras esenciales de OpenCV

Imagenes

Cuidado : por default, la representacion de las imagenes color es detipo BGR, 24 bits (mientras es RGBA, 32 bits en LTI-Lib, porejemplo).

,J.B. Hayet OpenCV parte 1, Agosto 2007 31 / 72

Page 32: opencv1

Estructuras esenciales de OpenCV

Imagenes

Creacion de imagenes :

I p l Image ∗ cvCreate Image ( CvS ize s i z e , i n t depth ,i n t channe l s ) ;

Liberacion de la memoria :

cvRe l ea se Image ( I p l Image ∗∗ image ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 32 / 72

Page 33: opencv1

Estructuras esenciales de OpenCV

Imagenes : usar datos externos

Inicializacion de headers de imagenes :

I p l Image ∗ c v I n i t ImageHeade r ( I p l Image ∗ image ,CvS ize s i z e , i n t depth ,i n t channe l s , i n t o r i g i n ,i n t a l i g n ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 33 / 72

Page 34: opencv1

Estructuras esenciales de OpenCV

Imagenes : depth

IPL_DEPTH_8U - unsigned 8-bit integers

IPL_DEPTH_8S - signed 8-bit integers

IPL_DEPTH_16U - unsigned 16-bit integers

IPL_DEPTH_16S - signed 16-bit integers

IPL_DEPTH_32S - signed 32-bit integers

IPL_DEPTH_32F - single precision floating-point numbers

IPL_DEPTH_64F - double precision floating-point numbers

,J.B. Hayet OpenCV parte 1, Agosto 2007 34 / 72

Page 35: opencv1

Estructuras esenciales de OpenCV

Imagenes : ejemplos

// Re s e r v a r una imagen de 1 cana l de o c t e t o sI p l Image ∗ img1=cvCreate Image ( c vS i z e (640 ,480) ,

IPL DEPTH 8U , 1 ) ;// Re s e r v a r una imagen de 3 c a n a l e s de f l o t a n t e sI p l Image ∗ img2=cvCreate Image ( c vS i z e (640 ,480) ,

IPL DEPTH 32F , 3 ) ;. . .c vRe l ea se Image (&img1 ) ;cvRe l ea se Image (&img2 )

,J.B. Hayet OpenCV parte 1, Agosto 2007 35 / 72

Page 36: opencv1

Estructuras esenciales de OpenCV

Imagenes : acceder al elemento i,j (1)

Igual a matrices:

void cvSet2D ( CvArr∗ a r r , i n t i , i n t j , CvSca l a r v ) ;

Seguro pero poco eficiente.

,J.B. Hayet OpenCV parte 1, Agosto 2007 36 / 72

Page 37: opencv1

Estructuras esenciales de OpenCV

Imagenes : acceder al elemento i,j (2)

Por el apuntador hacia lost datos:

I p l Image ∗ img=cvCreate Image ( c vS i z e (320 ,240) ,IPL DEPTH 8U , 1 ) ;

( ( uchar ∗ ) ( img−>imageData+i ∗ img−>widthStep ) ) [ j ]=23;

Eficiente pero menos seguro. Recuerda que imageData es de tipochar * incluso si los datos son flotantes.

,J.B. Hayet OpenCV parte 1, Agosto 2007 37 / 72

Page 38: opencv1

Estructuras esenciales de OpenCV

Imagenes : acceder al elemento i,j (3)

Existe una macro

#def ine CV IMAGE ELEM( image , e lemtype , row , c o l )\( ( ( e l emtype ∗ ) ( ( image)−>imageData+\( image)−>widthStep ∗( row ) ) ) [ ( c o l ) ] )

,J.B. Hayet OpenCV parte 1, Agosto 2007 38 / 72

Page 39: opencv1

Estructuras esenciales de OpenCV

Imagenes : acceder al elemento i,j (4)

Puede ser interesante encapsular la estructura IplImage en una clasetemplate C++ y escribir los equivalentes de cvmSet, cvmGet(inline...), definiendo como operador [] el acceso a las lineas.

/∗∗∗ Get row∗/

i n l i n e T∗ op e r a t o r [ ] ( const i n t rowIndx ) const {return ( (T ∗ ) ( img−>imageData+rowIndx ∗ img−>widthStep ) ) ;} ;/∗∗∗ Get p i x e l v a l u e∗/

i n l i n e T& at ( i n t i , i n t j ) const {return (∗ t h i s ) [ i ] [ j ] ;} ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 39 / 72

Page 40: opencv1

Estructuras esenciales de OpenCV

Imagenes : ROI

Concepto fundamental en varias aplicaciones

La mayoria de las funciones de OpenCV los toman en cuenta :procesamiento solo en esas areas

Usa el campo roi de la estructura IplImage y se manipula con

void cvSetImageROI ( I p l Image ∗ image , CvRect r e c t ) ;CvRect cvGetImageROI ( const I p l Image ∗ image ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 40 / 72

Page 41: opencv1

Estructuras esenciales de OpenCV

Imagenes : conversion

Para cambiar una imagen de un espacio de color a otro:

void cvCvtCo lo r ( const CvArr∗ s r c , CvArr∗ dst , i n t cod ) ;

El code tiene la forma:

CV_<src_color_space>2<dst_color_space>

Los espacios soportados : RGB; BGR; HSV; XYZ; YCrCb; GRAY;HLS; Lab; Luv; Bayer

,J.B. Hayet OpenCV parte 1, Agosto 2007 41 / 72

Page 42: opencv1

Estructuras esenciales de OpenCV

Arrays

typedef void CvArr ;

Tipo de array generico (Matriz o Imagen) : usado principalmentecomo apuntador, en parametros de funciones que pueden manejardiferentes tipos.

,J.B. Hayet OpenCV parte 1, Agosto 2007 42 / 72

Page 43: opencv1

Estructuras esenciales de OpenCV

Imagenes a matrices y vice-versa

Funciones rellenando un header para usar imagen como matriz (o alreves)

CvMat∗ cvGetMat ( const CvArr∗ a r r , CvMat∗ header ,i n t ∗ c o i=NULL , i n t allowND =0);

I p l Image ∗ cvGetImage ( const CvArr∗ a r r ,I p l Image ∗ image heade r ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 43 / 72

Page 44: opencv1

Estructuras esenciales de OpenCV

Clonar imagenes/matrices

I p l Image ∗ cvClone Image ( const I p l Image ∗ image ) ;CvMat∗ cvCloneMat ( const CvMat∗ mat ) ;

Alocacion y copia de estructuras (no olvidar que liberar el espaciocorrespondiente !)

,J.B. Hayet OpenCV parte 1, Agosto 2007 44 / 72

Page 45: opencv1

Estructuras esenciales de OpenCV

Copiar imagenes/matrices

void cvCopy ( const CvArr∗ s r c , CvArr∗ dst ,const CvArr∗ mask=NULL ) ;

Copia de estructuras (supone que la estructura de destinacion estareservada)

,J.B. Hayet OpenCV parte 1, Agosto 2007 45 / 72

Page 46: opencv1

Estructuras esenciales de OpenCV

Extraer un canal entre varios

void c v S p l i t ( const CvArr∗ s r c , CvArr∗ dst0 , CvArr∗ dst1 ,CvArr∗ dst2 , CvArr∗ ds t3 ) ;

Ejemplo : extraer la componente de rojo en una imagen color

c v S p l i t ( img , r , g , b ,NULL ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 46 / 72

Page 47: opencv1

Estructuras esenciales de OpenCV

Cambiar la forma de imagenes/matrices

CvMat∗ cvReshape ( const CvArr∗ a r r , CvMat∗ header ,i n t new cn , i n t new rows =0);

Permite por ejemplo representar los datos de una matriz m × n enun vector 1×mn :

CvMat∗ mat = cvCreatemat (10 ,20 , CV 32FC1 ) , vec ;cvReshape (mat ,&vec , 0 , 1 ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 47 / 72

Page 48: opencv1

Estructuras esenciales de OpenCV

Usar sub-matrices de una matriz/imagen

CvMat∗ cvGetSubRect ( const CvArr∗ a r r , CvMat∗ submat ,CvRect r e c t ) ;

CvMat∗ cvGetRow ( const CvArr∗ a r r , CvMat∗ submat ,i n t row ) ;

CvMat∗ cvGetCo l ( const CvArr∗ a r r , CvMat∗ submat ,i n t c o l ) ;

Usa un header ya reservado, con los datos de la matriz/imagenoriginal.

,J.B. Hayet OpenCV parte 1, Agosto 2007 48 / 72

Page 49: opencv1

Estructuras esenciales de OpenCV

Sequences

Es un ejemplo de estructura dinamica, usa entonces lasestructuras de CvMemStorage para la memoria

Implementa una deque

Si C++, tal vez mejor usar las estructuras de la STL

,J.B. Hayet OpenCV parte 1, Agosto 2007 49 / 72

Page 50: opencv1

Programar con OpenCV

Outline

1 Descripcion general e instalacion

2 Estructuras esenciales de OpenCV

3 Programar con OpenCV

,J.B. Hayet OpenCV parte 1, Agosto 2007 50 / 72

Page 51: opencv1

Programar con OpenCV

GUI

Implementacion de bajo nivel dependiendo del tipo de OS (ex:GTK para Linux) pero interfaz comun

Ventana definida por su nombre (cadenas de caracteres) :

i n t cvNamedWindow( const char∗ name ) ;void cvMoveWindow ( const char∗ name , i n t x , i n t y ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 51 / 72

Page 52: opencv1

Programar con OpenCV

GUI

Visualizar una imagen:

void cvShowImage ( const char∗ name , const CvArr∗ im ) ;

Esperar un click:

i n t cvWaitKey ( i n t de l a y =0);

,J.B. Hayet OpenCV parte 1, Agosto 2007 52 / 72

Page 53: opencv1

Programar con OpenCV

GUI : trackbar

Visualizar un parametro y asociar una funcion de callback a suscambios:

i n t cvCrea t eTrackba r ( const char∗ t rackbar name ,const char∗ window name ,i n t ∗ va lue , i n t count ,CvTrackba rCa l l back on change ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 53 / 72

Page 54: opencv1

Programar con OpenCV

GUI : dibujar

Funciones varias para dibujar rectangulos, circulos, lineas. . .

,J.B. Hayet OpenCV parte 1, Agosto 2007 54 / 72

Page 55: opencv1

Programar con OpenCV

Manejar errores

Sistema de macros incluidos en OpenCV para hacer funcionesmanejando errores

/∗ Ra i s e s an e r r o r w i t h i n the c u r r e n t con t e x t ∗/#def ine CV ERROR( Code , Msg ){

c vE r r o r ( ( Code ) , cvFuncName , Msg , F ILE , L INE ) ;EXIT ;

}

Ejemplo:

CV ERROR( CV StsBadArg , ” I n p u t a r r a y not v a l i d ” ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 55 / 72

Page 56: opencv1

Programar con OpenCV

Imagen y vıdeo I/O (1)

Cargar una imagen:

I p l Image ∗ cvLoadImage ( const char∗ f i l e name ,i n t f l a g s=CV LOAD IMAGE COLOR ) ;

Ejemplo:

I p l Image ∗ img=0;img=cvLoadImage ( f i l eName ) ;i f ( ! img )p r i n t f ( ”Could not l oad f i l e : %s \n” , f i l eName ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 56 / 72

Page 57: opencv1

Programar con OpenCV

Imagen y vıdeo I/O (2)

Salvar una imagen:

i n t cvSaveImage ( const char∗ f i l e name ,const CvArr∗ image ) ;

Formatos soportados : JPEG, PNG, PNM, BMP, TIFF

,J.B. Hayet OpenCV parte 1, Agosto 2007 57 / 72

Page 58: opencv1

Programar con OpenCV

Imagen y vıdeo I/O (3)

Cargar imagenes a partir de un archivo video:

CvCapture ∗ c vC r e a t e F i l eC ap t u r e ( const char∗ f i l e n ame ) ;i n t cvGrabFrame ( CvCapture∗ cap tu r e ) ;I p l Image ∗ cvRe t r i e v eF rame ( CvCapture ∗ cap tu r e ) ;

Ejemplo:

CvCapture ∗ cap tu r e = cvCaptureFromAVI ( ” i n f i l e . a v i ” ) ;I p l Image ∗ img = 0 ;i f ( ! cvGrabFrame ( cap tu r e ) ){ // Capture

p r i n t f ( ”Could not grab a frame \n” ) ;e x i t ( 0 ) ;

}img=cvRe t r i e v eF rame ( cap tu r e ) ; // R e t r i e v e the frame

,J.B. Hayet OpenCV parte 1, Agosto 2007 58 / 72

Page 59: opencv1

Programar con OpenCV

Imagen y vıdeo I/O (4)

Cargar imagenes a partir de una camara:

CvCapture ∗ cvCreateCameraCapture ( i n t i n d e x ) ;i n t cvGrabFrame ( CvCapture∗ cap tu r e ) ;I p l Image ∗ cvRe t r i e v eF rame ( CvCapture ∗ cap tu r e ) ;

Ejemplo:

CvCapture ∗ cap tu r e = cvCaptureFromCAM ( 0 ) ;I p l Image ∗ img = 0 ;i f ( ! cvGrabFrame ( cap tu r e ) ){ // Capture

p r i n t f ( ”Could not grab a frame \n” ) ;e x i t ( 0 ) ;

}img=cvRe t r i e v eF rame ( cap tu r e ) ; // R e t r i e v e the frame

,J.B. Hayet OpenCV parte 1, Agosto 2007 59 / 72

Page 60: opencv1

Programar con OpenCV

Algebra lineal (1)

La mayoria de esas funciones se aplican sobre CvArr (matricese imagenes)

Muchas de las funciones de algebra lineal imponen restriccionessobre el tipo de matriz en salida

,J.B. Hayet OpenCV parte 1, Agosto 2007 60 / 72

Page 61: opencv1

Programar con OpenCV

Algebra lineal (2)

void c vConve r tS ca l e ( const CvArr∗ s r c , CvArr∗ dst ,double s c a l e =1,double s h i f t =0);

Aplica elemento por elemento una multiplicacion por una escala yuna adicion con una constante:

dst[i , j ] = src[i , j ] ∗ scale + shift

,J.B. Hayet OpenCV parte 1, Agosto 2007 61 / 72

Page 62: opencv1

Programar con OpenCV

Algebra lineal (3)

Adicion, multiplicacion, operaciones elemento a elemento :

void cvAdd ( const CvArr∗ s r c1 , const CvArr∗ s r c2 ,CvArr∗ dst , const CvArr∗ mask=NULL ) ;

void cvMul ( const CvArr∗ s r c1 , const CvArr∗ s r c2 ,CvArr∗ dst , double s c a l e =1);

void cvMax ( const CvArr∗ s r c1 , const CvArr∗ s r c2 ,CvArr∗ ds t ) ;

Las matrices de entrada tienen que ser de mismo tipo y mismotamano. Atencion, cvMul es la multiplicacion elemento porelemento, no la multiplicacion de matriz !

,J.B. Hayet OpenCV parte 1, Agosto 2007 62 / 72

Page 63: opencv1

Programar con OpenCV

Algebra lineal (4)

Estadısticas sobre vectores:

CvSca l a r cvSum( const CvArr∗ a r r ) ;CvSca l a r cvAvg ( const CvArr∗ a r r ,

const CvArr∗ mask=NULL ) ;void cvMinMaxLoc ( const CvArr∗ a r r ,

double∗ min va l , double∗ max val ,CvPoint ∗ min=NULL , CvPoint ∗ max=NULL ,const CvArr∗ mask=NULL ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 63 / 72

Page 64: opencv1

Programar con OpenCV

Algebra lineal (5)

Operadores clasicos sobre matrices : transposicion, determinante,trace, inversion.Ejemplo:

c vConve r tS ca l e ( Jacob ian , Jacob ian , s c ) ;cvMulTransposed ( Jacob ian , JJ1 , 1 ) ; // JJ = JˆT∗JcvCopy ( JJ1 , JJ2 ) ;f o r ( i n t l =0; l <8; l++) { // Add lambda I to JJ

cvmSet ( JJ1 , l , l , cvmGet ( JJ1 , l , l )+lambda1 ) ;cvmSet ( JJ2 , l , l , cvmGet ( JJ2 , l , l )+lambda2 ) ;

}cvGEMM( Jacob ian , we ights ,−1 ,NULL, 0 , b ,CV GEMM A T ) ;

c vSo l v e ( JJ1 , b , dq ) ; // So l v e f o r lambda 1c vConve r tS ca l e ( dq , dq , s c ) ;cvAdd ( qcur , dq , qPost1 ) ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 64 / 72

Page 65: opencv1

Programar con OpenCV

Algebra lineal (6)

Caso de la multiplicacion de matriz : funcion mas generica

void cvGEMM( const CvArr∗ s r c1 , const CvArr∗ s r c2 ,double a lpha ,const CvArr∗ s r c3 , double beta ,CvArr∗ dst , i n t tABC=0 ) ;

La multiplicacion es de forma

dst = alpha ∗ op(src1) ∗ op(src2) + beta ∗ op(src3)

donde op(X ) es X o XT , dependiendo de tABC, que es 0 ocombinacion de

CV_GEMM_A_T - transposicion de src1

CV_GEMM_B_T - transposicion de src2

CV_GEMM_C_T - transposicion de src3

,J.B. Hayet OpenCV parte 1, Agosto 2007 65 / 72

Page 66: opencv1

Programar con OpenCV

Un ejemplo sencillo (1)

#inc l u d e <cv . h> // I n c l u d e s e s e n c i a l e s#inc l u d e <h i g h gu i . h>#inc l u d e <math . h>

I p l Image ∗ image ,∗ imcopy ;CvPoint c e n t e r ;double lambda ;

i n t main ( i n t argc , char ∗∗ a rgv ) {image = argc==2 ? cvLoadImage ( a rgv [ 1 ] ) : 0 ; // Carga imageni f ( ! image ) r e t u r n −1;imcopy= cvClone Image ( image ) ; // Clone o f imagei n t d i s t o r t c o e f f ;cvNamedWindow( ” D i s t o r t e d ” , 1 ) ;c vCrea t eTrackba r ( ” D i s t o r t i o n ” , ” D i s t o r t e d ” , // Crea te TrackBar

&d i s t o r t c o e f f , 100 , d i s t o r t ) ; // ’ d i s t o r t ’ c a l l e d

cvShowImage ( ” D i s t o r t e d ” , image ) ; // Show imagecvWaitKey ( 0 ) ;r e t u r n 0 ;

}

,J.B. Hayet OpenCV parte 1, Agosto 2007 66 / 72

Page 67: opencv1

Programar con OpenCV

Un ejemplo sencillo (2)

vo id d i s t o r t ( i n t f a c t ) {// D i s t o r t i o n f a c t o rlambda= 0.0000001∗ f a c t ;f o r ( i n t i =0; i<image−>h e i g h t ; i++)

f o r ( i n t j =0; j<image−>width ; j++) {uchar ∗ pt2= &CV IMAGE ELEM( imcopy , uchar , i , j ∗3 ) ;i n t u , v ; d i s t o r t P o i n t ( i , j , u , v ) ;i f (u>=0 && v>=0 && u<image−>h e i g h t && v<image−>width ) {

uchar ∗ pt1= &CV IMAGE ELEM( image , uchar , u , v ∗3 ) ;pt2 [ 0 ] = pt1 [ 0 ] ; pt2 [ 1 ] = pt1 [ 1 ] ; pt2 [ 2 ] = pt1 [ 2 ] ;

} e l s e {pt2 [ 0 ] = 0 ; pt2 [ 1 ] = 0 ; pt2 [ 2 ] = 0 ;

}}

cvShowImage ( ” D i s t o r t e d ” , imcopy ) ;} ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 67 / 72

Page 68: opencv1

Programar con OpenCV

Un ejemplo sencillo (3)

vo id d i s t o r t P o i n t ( i n t i , i n t j , i n t &u , i n t &v ) {double dx=j−c e n t e r . x ; double dy=i−c e n t e r . y ;double r = dx∗dx+dy∗dy ; double f a c= (1+lambda∗ r ) ;u = c en t e r . y+ i n t (.5+ f a c ∗dy ) , v = c en t e r . x+ i n t (.5+ f a c ∗dx ) ;

} ;

,J.B. Hayet OpenCV parte 1, Agosto 2007 68 / 72

Page 69: opencv1

Programar con OpenCV

Un ejemplo sencillo (4)

,J.B. Hayet OpenCV parte 1, Agosto 2007 69 / 72

Page 70: opencv1

Programar con OpenCV

Un ejemplo sencillo (5)

,J.B. Hayet OpenCV parte 1, Agosto 2007 70 / 72

Page 71: opencv1

Programar con OpenCV

Exercicios

Escribir programas para :1 Cargar una imagen cualquiera y, para cada pixel, cambiar el rojo

por el verde y viceversa. Visualizar la imagen antes y despues deeste procesamiento.

2 Cargar una imagen cualquiera y (sin usar las funciones yahechas, solo con for) calcular su derivada en la direction x .

3 Cargar una imagen cualquiera y dibujar con flechitas el campode vectores unitarios (u, v) siguiente (p.e. cada 20 pixeles) :

f (x , y) = x(1−4y); g(x , y) = x2; u =f√

(f 2 + g 2); v =

g√(f 2 + g 2)

;

4 Cargar una video (de preferiencia escena estatica con un pocode movimiento); considerar las imagenes de las 20 ultimasframes : determinar su media y substraerla a la imagen actual.Visualizar el resultado.

,J.B. Hayet OpenCV parte 1, Agosto 2007 71 / 72

Page 72: opencv1

Programar con OpenCV

To be continued !

Seguida en la proxima sesion de repaso.

,J.B. Hayet OpenCV parte 1, Agosto 2007 72 / 72