Você está na página 1de 11

4

Interaccin con OpenCV: deteccin de movimiento para realizar un instrumento virtual con OpenCV + OpenAL

Apellidos, nombre Departamento Centro

Agust Melchor, Manuel1 (magusti@disca.upv.es) Ivars Bada, Antonio (anivba@ei.upv.es) 1 pto. e Ing. e !istemas " #omputadores $niversidad %olit&cnica de 'alencia

1 Resumen de las ideas clave


(n este artculo vamos a presentar como el computador puede detectar las acciones )ue se reali*an utili*ando una c+mara mediante el uso de ,pen#' -1, ./ para la entrada de datos " ,penA0 -1/ para generar la in2ormaci3n de salida, esto es, vamos a hacer un poco de ruido. (l desarrollo se puede ver en un conte4to multimedia como una aplicaci3n interactiva, )ue mediante t&cnicas de 'isi3n por #omputador ('4#) detectar+ d3nde se produce movimiento " generar+ como respuesta a estos eventos sonido, aun)ue no pro2undi*aremos en las caractersticas de sonido envolvente de ,penA0 en este caso. %ara ello tomaremos como partida ,pen#' 1.1 " ,penA0 1.1. %ara su desarrollo nos centraremos en la plata2orma 56$70inu4, aun)ue todo lo e4puesto es transportable a otras en )ue se ha"an instalado estas libreras " se disponga de acceso a una c+mara $!B " a unos altavoces.

Introduccin
(ste artculo mostrar+ c3mo reali*ar un e8ercicio de interacci3n multimodal entre el usuario " el computador. (l usuario se mover+ en el espacio )ue monitori*a la c+mara del computador para actuar sobre los ob8etos virtuales, los )ue se de2inen dentro del computador " )ue no e4isten 2sicamente en el entorno de traba8o real. (l computador, por su parte recoger+ datos con la c+mara (in2ormaci3n visual) " devolver+ como respuesta alguna visuali*aci3n en pantalla para realimentar la acci3n del usuario, pero b+sicamente sonido (in2ormaci3n audible) en respuesta a los eventos del usuario. Anali*aremos por separado la 2orma de traba8o de ,pen#' en cuanto a la ad)uisici3n " procesado de la in2ormaci3n de vdeo " la de ,penA0 para generar " reproducir sonidos pregrabados.. Ambas partes ser+n enla*adas 2inalmente para o2recer el prototipo )ue lleve a cabo una propuesta de instrumento virtual (no e4istir+ 2sicamente) )ue ser+ utili*ado mediante la identi2icaci3n de movimiento en ciertas +reas de la imagen obtenida " )ue, como respuesta, dar+n lugar a hacer sonar determinada nota o sonido en general. (stos e8emplos son parte de un traba8o -4/ de la asignatura Integraci3n de Medios igitales (IM ). (n la 9eb re2erenciada podr+ encontrar el lector el c3digo completo de los e8emplos.

! Ob"etivos
$na ve* )ue el lector ha"a ledo este documento " e4plorado el c3digo )ue se proporciona, ser+ capa* de: !eguir la e8ecuci3n de los e8emplos parciales. (4plicar los di2erentes elementos )ue componen la soluci3n 2inal. (nri)uecer el contenido de audio de la soluci3n 2inal. %roponer nuevos instrumentos virtuales.

# Interaccin visual con OpenCV


escribe este apartado el modo de traba8o con ,pen#' para la ad)uisici3n de im+genes en vivo desde una c+mara. espu&s pasaremos a hablar de c3mo limitar la e4ploraci3n a determinadas +reas en la imagen. %ara terminar se muestra c3mo se puede detectar el movimiento )ue sucede en la escena observada en la imagen.

#$1 Ad%uisicin de v&deo


(1) Indicamos )ue capture desde cual)uier c+mara con el valor (.) =epetimos el proceso inde2inidamente.
(..1) #apturamos un cuadro desde el origen " lo guardamos en 2orma de imagen (...) Muestra la imagen capturada desde la c+mara en la ventana. (..1)..." lo mostramos por la ventana anteriormente creada. (..4) !i se pulsa la tecla (!#, entonces salimos del bucle (1) 0iberamos el dispositivo de captura " cerramos la ventana.

Listado 1: Algo itmo de ad!"isici#$ de im%ge$es desde "$a c%ma a&


(l e8ercicio tpico introductorio de ,pen#' pasa por cargar " mostrar por pantalla lo )ue recoge de, por e8emplo, nuestra webcam. %ara ello, debemos crear un sencillo programa. %or e8emplo el algoritmo mostrado en el listado 1 se muestra implementado en # en el listado .. (s importante destacar en la implementaci3n )ue el uso de la 2unci3n cvWaitKey es mu" importante )ue se e8ecute en el bucle principal, "a )ue es la ;nica 2orma del m3dulo HighGUI (las 2unciones de alto nivel de ,pen#') para devoluci3n " mane8o de eventos. %or ello, debe ser invocado de 2orma peri3dica para un proceso de eventos normal.

#$ Re'iones de inter(s )ROI*


<a" un concepto mu" a tener en cuenta a la hora de interactuar con un programa en ,pen#'. (specialmente un programa cu"a interacci3n no se reali*a a trav&s de medios tan concretos como el rat3n " el teclado, sino m+s bien a trav&s de un medio m+s impreciso como la webcam. (n este conte4to, ocurrir+ mu" a menudo )ue )ueramos detectar un ob8eto dentro de un +rea apro4imada. %ara ello, ,pen#' o2rece una herramienta simple pero su2iciente: las regiones de inter&s o =,I. $na =,I, es una +rea rectangular delimitada por cuatro puntos. (s decir, un rect+ngulo (%ara de2inir un rect+ngulo, disponemos de una variable ,pen#' llamada CvRect). %ara asignarle valores a este tipo de variables, llamaremos a una 2unci3n a la )ue le indicaremos los cuatro valores )ue de2inir+n el rect+ngulo:
#v=ect cv=ect( int pos>i*)uierda, int pos>superior, int ancho, int alto )?

0uego "a, para establecer uno de estos rect+ngulos como =,I para una imagen dada, llamaremos a la 2unci3n cvSetImageROI
void cv!etImage=,I( IplImage@ image, #v=ect rect )?

Binclude Cstdio.hD Binclude Ccv.hD Binclude Chighgui.hD

int main() E #v#apture@ capture F cv#aptureGrom#AM( #'>#A%>A6H )? i2( Icapture ) E 2print2( stderr, J(==,=: no se puede abrir el dispositivo.KnJ )? getchar()? return L1?M IplImage@ imgFcvNuer"Grame(capture)? i2(Iimg) E 2print2(stderr,J(rror: no ha" imagen de la c+mara.KnJ)? getchar()? return L1?M 77J#'>OI6 ,O>A$P,!IQ(J se asigna el tamaRo a la ventana autom+ticamente cv6amedOindo9( Jm"9indo9J, #'>OI6 ,O>A$P,!IQ( )? 77 =epetimos el proceso inde2inidamente. 9hile( 1 ) E 77 Pomamos un cuadro7imagen img F cvNuer"Grame( capture )? i2( Iimg ) E 2print2( stderr, J(==,=: no ha" imagen de la c+mara.KnJ )? getchar()? breaS? M cv!ho9Image( Jm"9indo9J, img )? i2( (cvOaitTe"(1U) V .AA) FF .W ) breaS? M 77 0iberamos el dispositivo de captura " eliminamos la ventana. cv=elease#apture( Vcapture )? cv estro"Oindo9( Jm"9indo9J )? return U? M

Listado (: )*em'lo de c#digo 'a a la ad!"isici#$ de v+deo, co$ O'e$C-, desde la c%ma a&
(sta 2unci3n, cambiar+ el valor =,I )ue tiene guardada Il'Image internamente. 0as variables I'lImage, al crearse, se les asigna por de2ecto una =,I igual a la super2icie total de la imagen.

#$! Interaccin por movimiento: piano virtual


(l movimiento ante la c+mara se traduce en variaciones entre cuadros tomados consecutivamente en el tiempo. (stas variaciones son como estelas )ue pueden ser interpretadas como elementos a tener en cuenta a la hora de interactuar con el programa. !iguiendo este ra*onamiento, podemos restar cuadros consecutivos para descubrir estas di2erencias. (sta idea se desarrolla en el e8emplo de . Mill+n -A/.

.ig" a 1: Salida del e*em'lo o igi$al de /& 0ill%$ 123: image$ de di4e e$cias bi$a i5ada 6i5!"ie da7 'a a la sec"e$cia de v+deo 68ltimo c"ad o a la de echa7&
#on esta idea como base se puede desarrollar un pe)ueRo piano virtual cu"as teclas aparecen dibu8adas en la parte superior de la ventana )ue muestra la captura de la c+mara. 0as JteclasJ son en realidad +reas de inter&s sobre las cuales se detectan los movimientos aplicando la di2erencia entre cuadros consecutivos. %ara ello es necesario: eclarar algunas variables globales. (l cuadro actual para poder compararlo con el anterior " as, poder detectar las di2erencias.
IplImage@ image, lastImage?

0as di2erencias entre los cuadros image " lastimage.


IplImage@ di22Image?

0as di2erencias obtenidas en di2Image en binario (blanco " negro).


IplImage@ bitImage?

(l umbral a partir del cual un valor se considerar+ U 3 1 en una imagen de escala de grises.
int tr?

%ara delimitar las =,I.


#v=ect rect-X/?

%or su parte, en el programa principal, iniciali*amos " creamos las =,I )ue coincidir+n con la posici3n de las teclas a partir de las propiedades de la imagen obtenida de la c+mara.
2or(iFU?iCX?iYY) E rect-i/Fcv=ect((9idth7X)@i,U,(9idth7X),height74)?

%or su parte, el bucle principal (v&ase listado 1) se de2inen las variables de tipo imagen con las mismas caractersticas )ue la obtenida desde la c+mara, pero con un s3lo canal: hemos decidido traba8ar con im+genes en escala de grises por simplicidad del c3digo, aun)ue se pierda

resoluci3n de color. As )ue la secuencia de vdeo de la c+mara deber+ ser convertida de =5B a grises en primer lugar.
lint main() E ... 2or(??) E IplImage@ 2rame F U? int c? 2rame F cvNuer"Grame( capture )? i2( I2rame ) breaS? i2(Iimage)E imageFcv#reateImage(cv!i*e(2rameLD9idth,2rameLDheight),2rameLDdepth,1)? bitImageFcv#reateImage(cv!i*e(2rameLD9idth,2rameLDheight),2rameLDdepth,1)? M cv#vt#olor(2rame, image,#'>B5=.5=AH)? i2(IlastImage)E lastImageFcv#loneImage(image)? M i2(Idi22Image)E di22ImageFcv#reateImage(cv!i*e(2rameLD9idth,2rameLDheight),2rameLDdepth,1)?M 2or(iFU?iCX?iYY) E cv=ectangle(2rame,cv%oint(9idth7X@i,U),cv%oint(9idth7X@(iY1),height74), #'>=5B(U,U,U),.,.,U)? cv=ectangle(2rame,cv%oint((9idth7X@i)YX,U),cv%oint(9idth7X@(iY1),(height74)LX), #'>=5B(.AA,.AA,.AA),1U,X,U)? M cv!ho9Image( J#am!ubJ, 2rame )? cvAbs i22(image,lastImage,di22Image)? cvPhreshold(di22Image,bitImage,tr,.AA,#'>P<=(!<>BI6A=H)? 2or(iFU?iCX?iYY) E cv!etImage=,I(bitImage,rect-i/)? mediaFcvMean(bitImage,6$00)? i2(mediaD1.U) cv=ectangle(2rame,cv%oint(9idth7X@i,U),cv%oint(9idth7X@(iY1),height74), #'>=5B(U,U,U), #'>GI00( ,.,U)? M lastImageFcv#loneImage(image)? cv=esetImage=,I( bitImage )? cv!ho9Image(J#am!ub 1J,bitImage)? c F cvOaitTe"(1U)? i2( (char) c FF .W ) breaS? M77Gin del bucle principal

Listado 9: /etalle de c#digo 'a a la im'leme$taci#$ del 'ia$o vi t"al&

#onvertidas a grises "a se pueden obtener las di2erencias entre los valores de la imagen del bucle anterior " el actual. $mbrali*amos la imagen de di2erencias a dos valores (blanco " negro) " guardamos el resultado . =evisamos las =,I ", si la media de sus valores umbrali*ados supera cierto valor, pintaremos el interior de la Ztecla[ para demostrar el lugar donde tratar el evento de Zpulsaci3n[ de tecla, si no s3lo se pinta el borde de la misma. !iempre superpuesto a la imagen de la c+mara para )ue el usuario tenga una realimentaci3n de d3nde est+ el instrumento virtual. (l programa continua en esta din+mica mientras no se pulse la tecla (!#.

+ Audio
(n este apartado utili*aremos ,pen#' para e4traer in2ormaci3n de una imagen, con ese c+lculo generaremos sonido. (l ob8etivo 2inal es crear un so2t9are )ue genere audio en 2unci3n de la in2ormaci3n )ue se obtenga a trav&s de la c+mara. Iremos poco a poco creando Zinstrumentos virtuales[. 0a primera decisi3n de relevancia, pasaba por elegir una librera de audio adecuada. 6uestra elecci3n ha sido ,penA0, por ser una librera libre, multiplata2orma, gratuita " versatil. 0a caracterstica )ue )ui*+s da m+s personalidad a ,penA0, es su orientaci3n a la generaci3n de audio 1 . ,penA0 permite a8ustar la percepci3n del audio a la de una 2uente situada en el espacio. Adem+s, permite programar todo tipo de e2ectos con las 2unciones )ue incorpora.

+$1

,enerador de ruido

#omo primer e8emplo para generar audio, hemos pretendido generar un sencillo tono en base a la media del movimiento )ue la c+mara perciba. \#omo se consigue esto] =estando los cuadros consecutivos de una secuencia de vdeo. (l resultado de la di2erencia entre ambos identi2ica el movimiento )ue ha habido a partir de la base del e8emplo de . Mill+n -A/. (l algoritmo utili*ado se muestra en el listado .. !e busca generar un tono en 2unci3n de la media de movimiento )ue percibe la c+mara. (l c3digo de partida obtiene una imagen binaria: una matri* de ceros " unos )ue asigna un cero a los p4eles de la entrada )ue no han cambiado entre el cuadro anterior " el actual? as como un uno para a)uellos p4eles )ue ha"an variado (todo esto, con un margen de relevancia o umbral). Pomando la citada imagen (bitImage) podemos obtener una media en coma 2lotante )ue indi)ue el porcenta8e de puntos )ue han su2rido una variaci3n. (l c3digo resultante se puede ver en el listado A. 0a primera apro4imaci3n a la interacci3n pasa por generar un tono en 2unci3n de la media de movimiento )ue percibe la c+mara. (sta es una e)uivalencia con el porcenta8e de puntos )ue han su2rido una variaci3n. (l c+lculo del tono 2ue una decisi3n sub8etiva. (l odo humano puede percibir 2recuencias )ue oscilan entre los .U " los ..UUU her*ios apro4imadamente. %or ello, un c+lculo m+s a8ustado, teniendo en cuenta )ue la media de la imagen siempre estar+ entre los U " .AA, sera
double 2recuenciaF.U.UY(media7.AA)@..UUU

(1) Ad)uirir un cuadro ^ lastImage (.) =epetimos el proceso inde2inidamente.


(..1) #apturamos un cuadro ^ image (...) #alcular la di2erencia di22Image _ image L lastImage (..1)..Binari*ar la imagen de di2erencias (..4) #alcular una medida del Zmovimiento[ habido (..A) Asignar un tono al valor as obtenido " hacerlo sonar (..`) lastImage _ image

(1) #errar ventanas, liberar recursos " dispositivos

Listado :: Algo itmo del ge$e ado de to$os a 'a ti de im%ge$es&


77 ,tros 2icheros de cabera Binclude CA07alut.hD

77 6uevas variables globales para manipular el sonido A0uint helloBu22er, hello!ource?

void generaPono(double media) E double 2recuenciaF.U.UYmedia@.AA? helloBu22er F alut#reateBu22erOave2orm(alut#reateBu22erOave2orm, 2recuencia, U.U, 1.U)? al!ource!top(hello!ource)? al!ourcei (hello!ource, A0>B$GG(=, helloBu22er)? al!ource%la" (hello!ource)? M

77 (n el main ... alutInit(6$00,U)? ... double mediaFcvMean(bitImage,6$00)? generaPono(media)?

Listado ;: )*em'lo de c#digo 'a a la ge$e aci#$ de to$os sim'les a 'a ti de im%ge$es&

es decir, primero convertimos la media en un valor comprendido entre U " 1. espu&s lo escalamos por la m+4ima 2recuencia audible. 6o obstante, salvo )ue se tome un umbral de sensibilidad ba8o, o )ue nos movamos mucho ante la c+mara, los resultados )ue se arro8an est+n en

el rango de 2recuencias m+s ba8o? de ah el )ue se ha"a optado por un c+lculo m+s agresivo " llamativo. #argamos en hello<"44e una 2orma de onda )ue creamos mediante al"tC eate<"44e Wave4o m. 0a con2iguraci3n toma la opci3n de 2orma de onda senoidal, con valor de 2recuencia igual a la variable creada para el e2ecto, 2ase inicial igual a U.U, " duraci3n del sonido de 1.U segundos. etenemos la generaci3n de sonido )ue pueda estar sonando, asignamos a la 2uente el contenido )ue hemos introducido en hello<"44e y volvemos a lan*ar la generaci3n de sonido. !e puede compilar el programa en 56$70inu4 con gcc usando la siguiente orden, asumiendo )ue el 2ichero de c3digo 2uente se llama a"di4yCamS"b&c: a gcc audi2"#am!ub.c bpSgLcon2ig LLc2lags opencv LLlibs opencvb Llalut Llopenal Lo audi2"#am!ub

+$1$1 -i .rimer .iano


(ste e8emplo, se podra decir )ue es el tpico paso l3gico. 0legados al punto de poder generar sonidos en 2unci3n del +rea )ue est& su2riendo una di2erencia, bien podemos delimitar varias +reas " hacerlas sonar como si de un pe)ueRo teclado se tratara. !e utili*ar+n 2unciones de generaci3n de sonidos simples, de8ando de lado el tener un OA' por cada nota. ,bviamente, esto har+ )ue nuestro piano virtual no suene precisamente como un Stei$way, pero podr&is captar la idea, " asignarle vuestras propias notas no supondr+ ma"or es2uer*o )ue una visita al oportuno buscador o un pe)ueRo e8ercicio con un programa de edici3n de audio. (l listado ` muestran dos detalles del c3digo de este e8emplo: la iniciali*aci3n del audio " la determinaci3n de )u& sonido generar en el programa principal. !e de2ine un n;mero de 2uentes de audio (sip, tambi&n hemos hecho )ue la nota suene m+s hacia un lado u otro en 2unci3n de la posici3n del o"ente. (stas 2uentes har+n sonar los sonidos )ue crearemos con la a"uda de otros tantos b"44e s de audio. (l ra*onamiento1 sobre la curiosa 23rmula )ue he utili*ado para calcular los tonos de cada nota (44U.U@po9(..U,((iY1.U)71..U))). %ara compilar en linu4 este c3digo:
a gcc piano#am.c bpSgLcon2ig LLc2lags opencv LLlibs opencvb Llalut Llopenal Lo piano#am

/ Conclusin
(ste artculo ha e4plorado elementos b+sicos hasta elaborar un e8emplo de interacci3n entre el usuario " el computador mediante el uso de la imagen " el sonido. (s un e8emplo de inter2a* multimodal o tambi&n perceptual. Praba8ando con libreras multiplata2orma (,pen#' " ,penA0) " sin ninguna atadura al sistema operativo permite portar esta aplicaci3n
1

Grancisco =oco. #omo calcular la 2recuencia de una nota musical " hacer m;sica con Matlab 7 5nuL,ctave. (.1 de enero de .UUW) cltima visita ma"o .U11. Chttp:77rocoblog.blogspot.com7.UUW7U17clculoLdeL2recuenciasLparaL unaLnotaL".htmlD

a cual)uier sistema " entorno de desarrollo para la creaci3n del e8ecutable.


void iniciali*arAudio()E int i, error? alutInit (U,6$00)? al5et(rror()? al0istener2v(A0>%,!IPI,6,listener%os)? al0istener2v(A0>'(0,#IPH,listener'el)? al0istener2v(A0>,=I(6PAPI,6,listener,ri)? error F al5et(rror()? i2 (error) print2(JdsKnJ, alut5et(rror!tring(error))? else print2(J,"ente #readoKnJ)? al5enBu22ers(6$M>B$GG(=!, bu22er)? errorFal5et(rror()? i2(error)Eprint2(JdsKnJ,alut5et(rror!tring(error))?M 2or(iFU?iCX?iYY) E bu22er-i/ F alut#reateBu22erOave2orm(A0$P>OA'(G,=M>!I6(, 44U.U@po9(..U,((iY1.U)71..U)), U.U, 1.U)? error F al5et(rror()? i2 (error) print2(JdsKnJ, alut5et(rror!tring(error))? else print2(JL Bu22er para tono dd creado.KnJ,(iY1))? M al5en!ources(6$M>!,$=#(!, source)? error F al5et(rror()? i2 (error) print2(JdsKnJ, alut5et(rror!tring(error))? else print2(JL Guentes creadas.KnJ)? 2or(iFU?iCX?iYY) E al!ource2(source-i/,A0>%IP#<,1.U2)? al!ource2(source-i/,A0>5AI6,1.U2)? al!ource2v(source-i/,A0>%,!IPI,6,source%os-i/)? al!ource2v(source-i/,A0>'(0,#IPH,source'el)? al!ourcei(source-i/,A0>B$GG(=,bu22er-i/)? al!ourcei(source-i/,A0>0,,%I65,A0>GA0!()? M M

77 (n el programa principal 2or(iFU?iCX?iYY) E cv!etImage=,I(bitImage,rect-i/)? mediaFcvMean(bitImage,6$00)? i2(mediaD1.U)al!ource%la"(source-i/)? M

Listado =: )*em'lo de c#digo 'a a la ge$e aci#$ de to$os sim'les 'a a el 'ia$o vi t"al&

Ahora, apreciado lector, es tu turno. Pe animo a ponerte manos a la obra sobre los e8emplos " construir uno )ue, por e8emplo, de2ina +reas de inter&s (de un tamaRo 2i8o) ocupando toda la imagen, Al moverse dentro de ellas deberan hacer sonar un audio " provocar un cambio en la imagen como se muestra en la 2ig... 0o llamaremos discoCam.

.ig" a (: Salida del e*em'lo de discoCam&

0 1iblio'ra2&a 3 re2erencias
-1/ Z,pen #omputer 'ision 0ibrar"[. isponible en Chttp:77source2orge.net7pro8ects7opencvlibrar"7D. cltima consulta ma"o de .U11. -./ Z,pen#'OiSi[ , isponible en http:77opencv.9.illo9garage.com79iSi7Oelcome. -1/ ,penA0, Chttp:77connect.creativelabs.com7openal7de2ault.asp4D. cltima consulta enero de .U11. -4/ Antonio Ivars Badia . !alvapantallas activo con c+mara 9eb (Praba8ando con ,pen#'). Praba8o de la asignatura IM Chttp:779ebL sisop.disca.upv.es7eimdD, curso .UUX7.UUf. -A/ avid Mill+n, ,pen#' More 9ith cameras, Chttp:77blog.damiles.com7] pF`WD. cltima consulta ma"o de .U11.

Você também pode gostar