Escolar Documentos
Profissional Documentos
Cultura Documentos
Interaccin con OpenCV: deteccin de movimiento para realizar un instrumento virtual con OpenCV + OpenAL
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
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.
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 )?
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.
.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?
(l umbral a partir del cual un valor se considerar+ U 3 1 en una imagen de escala de grises.
int tr?
%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
#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
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
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
/ 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
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.
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.