Upload
jeremiah-martinez
View
10
Download
0
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Programar con OpenCV
GUI : dibujar
Funciones varias para dibujar rectangulos, circulos, lineas. . .
,J.B. Hayet OpenCV parte 1, Agosto 2007 54 / 72
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Programar con OpenCV
Un ejemplo sencillo (4)
,J.B. Hayet OpenCV parte 1, Agosto 2007 69 / 72
Programar con OpenCV
Un ejemplo sencillo (5)
,J.B. Hayet OpenCV parte 1, Agosto 2007 70 / 72
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
Programar con OpenCV
To be continued !
Seguida en la proxima sesion de repaso.
,J.B. Hayet OpenCV parte 1, Agosto 2007 72 / 72