ideo racking V Panel T 178


Save this PDF as:
 WORD  PNG  TXT  JPG

Tamaño: px
Comenzar la demostración a partir de la página:

Download "ideo racking V Panel T 178"

Transcripción

1 178 Panel Tracking Video

2 9. Tracking video En GAmuza se pueden hacer scripts para tracking video utilizando las clases y métodos propios de opneframeworks: ofvideograbber() u ofxkinect() para detectar la fuente y los addons de opencv ofxcvcolorimage(), ofxcvcontourfinder(), ofxcvfloatimage(), ofxcvgrayscaleimage(), ofxcvshortimage(), ofxcvhaarfinder(), ofxopticalflowlk(), o utilizar el panel de Computer visión con interface GUI que ha sido preconfigurado principalmente para facilitar este proceso a aquellos que no sean expertos en programación. A diferencia de los módulos, los paneles se generan por programación en la ventana de salida usando las clases de GAmuza gacameratracking() o gakinecttracking(), se pueden activar desde los ejemplos Computer Vision/camTrackingPanel para cámaras de video o Computer Vision/ kinecttrackingpanel cuando se trabaja con el sensor kinect Panel Tracking: por cámara video En este apartado se describe la interface del panel de Tracking para cámaras de video y los métodos de la clase de GAmuza gacameratracking(), explicándolo a partir del código que genera su carga. /* GAmuza 043 E Panel de Tracking video creado por n3m3da */ campanel = gacameratracking() drawgui = true camid = 0 // asocia variable global a la clase de GAmuza capturewidth = 320 captureheight = 240 cam = oftexture() // tamaño captura de video // textura para acoger la imagen video function setup() // para guardar el archivo de configuración XML campanel:setguisettingsfile(gadatapath("camtrackingsettings.xml")) campanel:setup(camid,capturewidth,captureheight) // inicializa panel // inicializa textura opengl para imagen video cam:allocate(capturewidth,captureheight,gl_rgb) 179

3 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA function update() cam = campanel:getcameratexturemod() // la textura actualiza los frames de video campanel:update() // actualiza el panel de tracking function draw() gabackground(0.1,1.0) // para mostrar la imagen en directo de la cámara a pantalla completa ofsetcolor(255) scaleh = OUTPUT_H scalew = scaleh* capturewidth / captureheight cam:draw(output_w/2 - scalew/2,0, scalew,scaleh) ofsetcolor(255) if drawgui then campanel:draw() // muestra el panel si drawgui está activo function keyreleased() if gakey() == string.byte('g') then drawgui = not drawgui // con la tecla g se muestra/oculta el panel function mousedragged() // para ajustar las opciones del panel con el ratón campanel:mousedragged(gamousex(),gamousey()) function mousepressed() campanel:mousepressed(gamousex(),gamousey()) function mousereleased() campanel:mousereleased(gamousex(),gamousey()) Como en otros trabajos con clases, inicialmente se asocia una variable global, campanel, a la clase gacameratracking(); la segunda variable, drawgui, es booleana y permitirá visualizar/ocultar el panel en la ventana de salida; camid asigna el ID de la cámara y las dos siguientes variables, capturewidth y captureheight, definen las dimensiones del video capturado; la última variable, cam, está vinculada a la clase oftexture() como soporte de la imagen capturada por la cámara de video 180

4 9. TRACKING VIDEO En el bloque setup() se inicializa el panel con el método setguisettingsfile cuyo parámetro indica la ruta y nombre del archivo XML que guardará la configuración del panel. Al activar el script aparece el panel en la ventana de salida, tras realizar los ajustes que requiera el proyecto, debe guardarse esa configuración clicando el botón "save" situado en el vértice superior derecho del panel. Al guardarlo se genera el archivo camtrackingsettings.xml en la carpeta data del script. El método setup tiene como parámetros el ID de la cámara y el tamaño del frame. Después, con el método allocate de la clase oftexture() se asignan el tamaño y tipo de color de opengl del frame de vídeo. En el bloque update(), se identifica la textura con el panel a través del método getcameratexturemod() [devuelve la captura de la cámara con el eventual mirror aplicado en horizontal/vertical] o con getcameratexture() [devuelve la captura desde la cámara en "raw"], con cualquiera de ellos se relaciona la clase de openframeworks con la de GAmuza, y después con el método update se actualiza, para cada frame, la información de la imagen capturada. En el bloque draw(), se dibuja la imagen en directo de la cámara adaptada a pantalla completa, y después, para que quede encima de la imagen, se dibuja el panel cuando la variable booleana drawgui es verdadera. En el bloque keyreleased(), se establece una condicional para que al teclear la letra "g" la variable drawgui pase de verdadera a falsa y viceversa, construyo un switch para ver u ocultar el panel. Los bloques mousedragged(), mousepressed() y mousereleased() permiten manipular con el ratón los sliders y botones de la interface del panel. 181

5 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA Descripción panel El panel Tracking video permite analizar características visuales del campo que registra la cámara, recoger determinados datos como la luminosidad, color o movimiento, seleccionar y/o ajustar esos datos, para después generar con ellos otra situación que responda en tiempo real a sus cambios, facilitando la aplicación de los algoritmos para tracking video al regular con sliders, menús y botones las condiciones básicas de entrada de datos al sistema. GAmuza recoge el reconocimiento que el ordenador ha hecho de la cámara o cámaras conectadas, asignando un ID a cada una de ellas, empezando por el 0, es decir, si solo hay una cámara conectada su id es 0, si hay dos la primera es 0 y la segunda 1 y así sucesivamente. Las interface del panel está distribuida en función de las distintas técnicas básicas para tracking video: Blob detection, reconocimiento de regiones o áreas. Puede detectar los blobs por Background subtraction o por Color tracking. Para el reconocimiento del contorno se debe activar el algoritmo Compute Contour Finder y para la geometría del contorno hay que añadir el algoritmo Compute Contour geometry Motion detection, reconoce la cantidad de movimiento y localiza el punto medio de la masa, siempre está activo aunque ningún algoritmo haya sido seleccionado Haar Finder, para reconocimiento de partes del cuerpo humano, el algoritmo Compute Haar Finder debe estar seleccionado Optical Flow, dirección del movimiento representado vectorialmente, debe estar seleccionado el algoritmo Compute Optical Flow Trigger Areas, son nueve áreas de activación ajustables en tamaño y posición desde el módulo Computer vision. Se debe activar el algoritmo Compute Trigger Areas Análisis detallado de la interface El monitor de entrada de la señal video, Color input, permite reducir el área a trackear, este crop se ajusta arrastrando con el ratón los puntos resaltados de los vértices. Los demás monitores muestran solo la zona seleccionada. El crop se resetea con Reset Quad Warping. USE CAMERA/VIDEOFILE. Activa/desactiva la posibilidad de trabajar con un archivo de video pregrabado (video file) o con la imagen capturada por la cámara en directo. 182

6 9. TRACKING VIDEO El monitor Balanced Tracking muestra el resultado de todos los algoritmos de tracking seleccionados y ajustados con los sliders, menús y botones del bloque derecho. Capture Background, al clicar el botón se captura un frame de la imagen video que debe corresponder con el fondo. Esta imagen se toma como referencia para comparar los cambios que se producen entre el valor de sus píxeles y el de los frames de la imagen a trackear, aplicando el algoritmo Background Subtraction. Es el primer nivel para el cálculo de Tracking, y siempre está activo. Según las condiciones de iluminación, puede mejorarse la imagen activando Use Contrast Stretch: incrementa el rango de los valores más intensos de la imagen en escala de grises. El resultado de Background subtraction se ve en el monitor inferior. GENERAL SETTINGS Flip Source Image voltea la imagen-video que proviene de la cámara, su ajuste depe de las condiciones de exhibición: Off: la imagen se percibe sin ningún cambio Horizontal: se selecciona cuando los movimientos ante la imagen responden al efecto de estar frente a un espejo. Vertical: imagen video cabeza abajo. Horizontal + Vertical: voltea en los dos sentidos. Source Blur: desenfoque de la imagen de entrada de video. Contrast: contraste. Brightness: brillo. BACKGROUND SUBTRACTION SETTINGS Subtraction Technique, seleccionar entre: Color ABS: color absoluto B&W ABS: blanco y negro absoluto Lighter than. Cuando la figura a trackear es más clara que el fondo. Darken than. Cuando La figura a trackear es más oscura que el fondo. 183

7 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA Subtraction Threshold, ajusta el umbral de detección. Cuanto menor es el valor más sensible. Si se trabaja con Tracking Color se pone el valor máximo para anular los datos de substracción del fondo Blur, desenfoca la imagen procesada. Erode, reduce las superficies detectadas. Dilate, expande las superficies detectadas OSC DATA SETTINGS Smoothing factor: ajusta el rango de suavizado. USE COLOR TRACKING Color Tracking es un algoritmo de reconocimiento del color. Requiere condiciones de iluminación estables y la elección de un color de seguimiento muy diferenciado del contexto. Use Color Tracking, activa/desactiva su uso y los resultados se ven en el monitor inferior. Como se ha mencionado antes, cuando se trabaja con COLOR TRACKING debe subirse al máximo el valor del slider Subtraction Threshold para anular los datos del BACKGROUND SUBTRACTION. COLOR TRACKING SETTINGS La configuración de este bloque solo se ajusta si está activado Use Color Tracking. El Tracking Color transforma el espacio de color RGB al sistema HSV, porque asigna los valores del tono del color de una forma más estable. HSV identifica cada tono con un número que va de 0ª a 360ª según su posición en el círculo cromático, pero en GAmuza el rango va de 0.0 a 1.0, quedando su equivalencia tal como muestra la imagen. 184

8 9. TRACKING VIDEO Las opciones de ajuste son: Hue, selecciona el tono a trackear según la escala de valores de GAmuza entre 0.0 a 1.0. La franja de color sirve de orientación. Hue Range, amplía el rango del tono seleccionado. Saturation, asigna el nivel de saturación del tono (hue) seleccionado. El valor 0.0 es igual a blanco, 1.0 es el tono puro, depio del nivel de luminosidad (value). Saturation Range, amplia el rango de saturación seleccionado. Value, regula el nivel de luminosidad (value) del tono. El valor 0.0 es igual a negro, 1.0 es igual al tono puro, depio del valor de saturación. Value Range, amplía el rango de luminosidad seleccionado. HSV Blur, filtro de desenfoque de la imagen en HSV. Erode, reduce las superficies detectadas. Dilate, expande las superficies detectadas. BLOB TRACKING SETTINGS Los blob son las zonas indepientes que el tracking detecta según los algoritmos seleccionados, sus opciones de configuración son: Min Blob, tamaño mínimo de los blobs en píxeles. Max Blob, tamaño máximo. Contour Detail, el detalle del contorno se puede ajusta en: Raw, todo el perímetro tal cual es Smooth, suavizado Simple, adaptado a formas geométricas simples CONTOUR SMOOTH FACTOR, si se ha seleccionado smooth, ajusta el nivel de suavizado CONTOUR SIMPLE TOLERANCE, si se ha seleccionado simple, ajusta el rango de vértices que articulan el contorno. 185

9 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA MOTION DETECTION SETTINGS El algoritmo para detección de movimiento está siempre activo. El monitor MOTION DETECTION muestra el cálculo de la cantidad de movimiento que se registra en la imagen y señala la posición media de ese movimiento. Los ajustes para su configuración son: Motion Threshold, regula la sensibilidad del sistema para activar la detección, si es poco sensible se debe ampliar el umbral (Threshold) Motion Noise Compensation, compensa el ruido de la señal de imagen video Motion Trigger Low Limit, nivel más bajo para activar la detección de movimiento Motion Trigger Range Limit, limita los niveles de movimiento, como si bajara la sensibilidad de detección. BALANCED TRACKING SETTINGS Vuelve a ajustar, en conjunto, los valores dados en cada sección. Balanced Tracking Blur, ajusta nivel de desenfoque global Erode, reduce las superficies detectadas Dilate, expande las superficies detectadas COMPUTING ALGORITHM SELECTOR En este bloque se seleccionan otros algoritmos específicos que se pueden aplicar, además de los mencionados hasta ahora. Compute Contour Finder, para procesar el contorno de las zonas detectadas. Sus valores se ajustan con Blob Tracking Settings. Compute Contour geometry, para procesar el contorno de las zonas detectadas con formas geométricas. Compute Optical Flow, calcula el flujo óptico del movimiento y lo describe con vectores que indican la dirección e intensidad. Compute Haar Finder, activa el algoritmo para detectar partes del cuerpo humano. Hay distintos algoritmos posibles. Por defecto, está seleccionado frontalface_alt (Ver página 201). 186

10 9. TRACKING VIDEO Compute Trigger Areas. Activa la posibilidad de utilizar 9 zonas circulares que tienen asignado un ID. Su posición y tamaño pueden ajustarse con el ratón; con ellas se pueden determinar las áreas en las que debe responder el tracking utilizando funciones específicas de GAmuza (ver página 229) Si hay varias cámaras conectadas al ordenador, se pueden abrir distintas interfaces del panel para cada una de ellas que pueden ajustarse indepientemente, por eso en las funciones de programación hay que señalar el id de la cámara Blob detection El reconocimiento de blobs se realiza por métodos matemáticos que pueden detectar en la imagen zonas que tienen determinadas características constantes, o que varían dentro de un rango de valores predeterminado (tolerancia), tales como el nivel de luminosidad o color, en comparación con las áreas que les rodean, de manera que el sistema los considera similares entre sí. En GAmuza hay dos técnicas para la detección de blobs: Background subtraction y Color Tracking. En el primero, sustracción del fondo, el sistema guarda una imagen tomada del fondo antes de que los objetos o personas a detectar entren en el campo visual de la cámara, para ir después comparando los cambios que se producen en el valor de cada uno de los píxeles de los frames de video, de modo que si detecta un cambio significativo en una región de la imagen, respecto del modelo de fondo, representa ese área delimitando la zona o el perímetro. El panel Computer vision tiene un botón para capturar el fondo situado bajo del monitor Balanced Tracking. Para trabajar con la técnica COLOR TRACKING, se debe activar el botón Use Color Tracking y subir al máximo el valor del slider Subtraction Threshold en el módulo Computer vision, para anular los datos de BACKGROUND SUBTRACTION. El área a detectar debe tener un color muy diferente al resto de colores que entren en el campo visual de la cámara y mantener un nivel de iluminación lo más uniforme posible. El Color Tracking utiliza el espacio de color HSV, porque asigna los valores del tono del 187

11 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA color de una forma más estable, ver en la página 182 los parámetros de color para seleccionar sus ajustes en la interface del panel. La clase de GAmuza gacameratracking() tiene una serie de métodos para trabajar con blobs que se comunican con el panel de computer vision, recogio en tiempo real el ajuste que hagamos en su menú, por ejemplo, mediante los sliders del menú BLOB TRACKING SETTINGS podemos desestimar los blobs menores o mayores a un determinado tamaño, en BACKGROUND SUBTRACTION SETTINGS podemos seleccionar si los blobs buscados son más claros o más oscuros que el fondo, también se puede reducir o ampliar la dimensión de los blobs detectados, etc. Pasamos a describir cada uno de los métodos y sus parámetros, para analizarlos en conjunto posteriormente a través de algunos ejemplos. Recordad que para que funcionen debe estar seleccionado, al menos, el algoritmo Compute Contour Finder: Con el método getnumblobs(), se obtiene el número de blobs que detecta una cámara específica en cada frame de GAmuza. getblobx(blobid) y getbloby(blobid), devuelven la coordenada x e y, respectivamente, de un determinado blob detectado desde una cámara específica. GAmuza identifica los blobs por orden de aparición, el blob con id 0 será el que entró primero en el encuadre de la cámara y mantrá ese id hasta que salga. Si dos áreas inicialmente identificadas con dos id se juntan, se convierten en un solo blob y el id de todos los blobs restantes puede cambiar. El parámetro de estas funciones es: id del blob. getblobw(blobid) y getblobh(blobid), devuelven la anchura y altura, en píxeles, de un determinado blob detectado desde una cámara específica. getblobcontoursize(blobid), devuelve la posición de todos los puntos del contorno de un blob detectado por una cámara específica. getblobcpointx(blobid,x) y getblobcpointy(blobid,y), devuelven las coordenadas x e y, respectivamente, de un punto determinado del contorno. getblobgeometrysize(blobid), devuelve las líneas geométricas que devienen del contorno de un blob desde una cámara específica. Para que funcione debe estar seleccionado el algoritmo Compute Contour geometry. getblobglinex1(blobid,x1), getblobgliney1(blobid,y1), getblobglinex2(blobid,x2) y getblobgliney2(blobid,y2), devuelven las coordenadas x1, y1, x2, y2 de una línea determinada del contorno geométrico de un blob. Para que funcione debe estar seleccionado el algoritmo Compute Contour geometry. El siguiente ejemplo básico muestra cómo utilizar los datos obtenidos por los métodos getnumblobs(), getblobx(), getbloby(), getblobw() y getblobh() desde el algoritmo Compute Contour Finder para detección de blobs y remarcarlos con formas rectangulares. 188

12 9. TRACKING VIDEO /* GAmuza 043 E ComputerVision - Blobs creado por n3m3da */ campanel = gacameratracking() // asocia variable global a la clase de GAmuza drawgui = true // booleano para activar/desactivar el panel camid = 0 // id de la cámara runningblobs = 0 // variable para el nº de blobs activos en cada frame cam = oftexture() // textura para mostrar imagen de la cámara capturewidth = 320 // anchura y altura frame captura video captureheight = 240 function setup() // para guardar el archivo de configuración XML campanel:setguisettingsfile(gadatapath("camtrackingsettings.xml")) campanel:setup(camid,capturewidth,captureheight) cam:allocate(capturewidth,captureheight,gl_rgb) function update() cam = campanel:getcameratexturemod() // la textura actualiza los frames de video runningblobs = campanel:getnumblobs() // devuelve el nº de blobs detectados campanel:update() // actualiza los datos del panel function draw() gabackground(0.0,0.8) ofsetcolor(255) scaleh = OUTPUT_H //para dibujar imagen cámara a pantalla completa scalew = scaleh* capturewidth/captureheight cam:draw(output_w/2 - scalew/2, 0, scalew,scaleh) ofsetlinewidth(3) // inicio dibujo de blobs, grosor líneas ofnofill() // no rellenar ofsetcolor(31,165,210) // color líneas rectángulos ofpushmatrix() // activa la opción escalar ofscale(output_w,output_h,1.0) // para escalar la imagen a pantalla completa for j=0, runningblobs-1 do // para reconocer todos los blobs x = campanel:getblobx(j) // coordenada X de cada blob y = campanel:getbloby(j) // coordenada X w = campanel:getblobw(j) // anchura de cada blob h = campanel:getblobh(j) // altura ofrect(x,y,w,h) // dibuja rectángulos con esos datos ofpopmatrix() // desactiva la opción escalar ofsetcolor(255) 189

13 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA if drawgui then campanel:draw() // muestra el panel si drawgui está activo function keyreleased() if gakey() == string.byte('g') then drawgui = not drawgui // con la tecla g se muestra/oculta el panel function mousedragged() // para ajustar las opciones del panel con el ratón campanel:mousedragged(gamousex(),gamousey()) function mousepressed() campanel:mousepressed(gamousex(),gamousey()) function mousereleased() campanel:mousereleased(gamousex(),gamousey()) Analizaremos las diferencias que aporta este código, respecto al visto anteriormente para cargar el panel de tracking video. La variable global runningblobs va a gestionar el número de blobs que detecta el sistema, como es un dato que puede cambiar según lo que acontezca delante de la cámara, en el bloque update() se iguala el valor de esa variable al que devuelve el método getnumblobs(), así en cada frame se actualiza su valor al número de blobs detectados. En el bloque draw(), se vincula la variable cam con el método :draw() de la clase, cuyos parámetros señalan las coordenadas x,y, y la anchura y altura de la imagen, en este caso, pantalla completa. Si no queremos que la ventana de salida muestre la imagen de la cámara, no se pone este método. Por ejemplo, si comentamos la siguiente línea de código del bloque draw(): // cam:draw(output_w/2 -scalew/2, 0, scalew,scaleh), para desactivar su acción, se seguirán vio los rectángulos superpuestos a los blob sin visualizar la imagen de la cámara. Después, la función ofscale() tiene como parámetros el incremento en los ejes X, Y y Z, los valores utilizados son pantalla completa para X e Y, y 1 para Z porque no se está trabajando en 3D. Después una estructura for asigna valores a unas variables vinculadas con las funciones getblobx(), getbloby(), getblobw() y getblobh() tantas veces en cada frame como número de blobs se hayan detectado, menos 1, porque el primero tiene un id 0, y asigna los valores obtenidos por esas funciones a los 190

14 9. TRACKING VIDEO parámetros de tantos rectángulos como blobs detectados, los parámetros son: coordenadas x, y, anchura y altura de cada blob. En el siguiente ejemplo, sin que se muestre la imagen de la cámara,vamos a analizar el uso del método getblobcontoursize() relacionado con las funciones de detección de los puntos del contorno, y el método getblobgeometrysize() relacionada con las de detección de las líneas de geometría, pare ello tiene que estar activado el algoritmo Compute Contour geometry. /* GAmuza 043 ejemplos E ComputerVision - contorno y geometría creado por n3m3da */ campanel = gacameratracking() // asocia variable global a la clase de GAmuza drawgui = true // booleano para activar/desactivar el panel camid = 0 // id de la cámara runningblobs = 0 // nº de blobs activos en cada frame cam = oftexture() // textura para mostrar imagen de la cámara capturewidth = 320 // anchura y altura frame captura video captureheight = 240 function setup() // para guardar el archivo de configuración XML campanel:setguisettingsfile(gadatapath("camtrackingsettings.xml")) campanel:setup(camid,capturewidth,captureheight) // inicializa el panel cam:allocate(capturewidth,captureheight, GL_RGB) // inicializa textura 191

15 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA function update() cam = campanel:getcameratexturemod() // la textura actualiza los frames de video runningblobs = campanel:getnumblobs() //devuelve el nº de blobs detectados campanel:update() //actualiza los datos del panel function draw() gabackground(0.0,1.0) scaleh = OUTPUT_H // para escalar imagen video a pantalla completa scalew = scaleh* capturewidth / captureheight ofpushmatrix() oftranslate(output_w/2 - scalew/2,0,0) ofscale(scalew/capturewidth,scaleh/captureheight,1.0) for j=0, runningblobs-1 do // recorre todos los blobs ofsetlinewidth(1) ofsetcolor(255) offill() ofbeginshape() // inicia dibujo contorno de cada blob detectado // recorre todos los puntos del contorno for i=0, campanel:getblobcontoursize(j)-1 do x = campanel:getblobcpointx(j,i) // coordenadas X de cada punto y = campanel:getblobcpointy(j,i) // coordenadas Y ofvertex(x,y) // dibuja el contorno ofendshape(false) // finaliza el dibujo sin cerrar las formas ofsetlinewidth(3) // atributos del dibujo de la geometría ofsetcolor(9,245,160) ofnofill() // recorre todos los puntos de la geometría for z=0, campanel:getblobgeometrysize(j)-1 do x1 = campanel:getblobglinex1(j,z) // coordenadas X 1er punto de la línea y1 = campanel:getblobgliney1(j,z) // coordenadas Y 1er punto x2 = campanel:getblobglinex2(j,z) // coordenadas X 2º punto y2 = campanel:getblobgliney2(j,z) // coordenadas Y 2º punto ofline(x1,y1,x2,y2) //dibuja las líneas geométricas de cada blob ofcircle(x1,y1,3) //dibuja círculos en cada extremo de las líneas ofcircle(x2,y2,3) ofpopmatrix() // cierra la opción escalar 192 ofsetcolor(255)

16 9. TRACKING VIDEO if drawgui then campanel:draw() // muestra el panel si drawgui está activo function keyreleased() if gakey() == string.byte('g') then drawgui = not drawgui // con la tecla g se muestra/oculta el panel function mousedragged() // para ajustar las opciones del panel con el ratón campanel:mousedragged(gamousex(),gamousey()) function mousepressed() campanel:mousepressed(gamousex(),gamousey()) function mousereleased() campanel:mousereleased(gamousex(),gamousey()) En este ejemplo, vemos que en el bloque del update() el valor de la variable global runningblobs está de nuevo vinculado al que devuelve el método getnumblobs(), para saber el número de blobs que se detectan en cada frame. En el bloque draw(), las funciones ofpushmatrix() y ofpopmatrix() establecen el inicio y fin del código afectado por ofscale() que, como en el ejemplo anterior, escala los valores obtenidos de la cámara a pantalla completa. Después, para dibujar el contorno de los blobs establece un doble for, el primero se repite en cada frame tantas veces como blobs se hayan detectado, obtenio el valor de la variable runningblobs-1, mientras que el segundo for se repite tantas veces como número de puntos tenga el contorno de cada blob, obtenido por el valor de la función getblobcontoursize(j), cuyo parámetro es el id del blob, que se lo asigna el primer for. Para realizar el contorno utiliza el código de dibujo de formas irregulares por vértices ofvertex(x,y) que precisa tener antes y después, las funciones ofbeginshape() y ofendshape(false) respectivamente. El valor de las coordenadas de los distintos vértices lo obtiene de las funciones getblobcpointx(j,i) y getblobcpointy(j,i) cuyos parámetros son el id del blob, que se obtiene del primer for y el id del punto que se obtiene del segundo for. 193

17 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA El código siguiente del bloque draw() inicia el dibujo de la geometría de cada blob, con un tercer for que se repetirá tantas veces como líneas tenga esa geometría, ese valor se obtiene de la función getblobgeometrysize(j) cuyo parámetro, id del blob, viene dado por el primer for (runningblobs-1). Los parámetros de las líneas se obtienen de las cuatro funciones que nos dan las coordenadas de los puntos de inicio y fin de cada una de ellas, getblobglinex1(j,z), getblobgliney1(j,z), getblobglinex2(j,z), getblobgliney2(j,z), cuyo segundo parámetro es el id de la línea que es asignado por este tercer for, con estos datos se dibujan también pequeños círculos en los extremos de las líneas para visualizar mejor las articulaciones y aproximarlo a la representación que tiene GAmuza en el panel Computer vision. El siguiente ejemplo vinculado con la detección blobs utiliza Color tracking, y está planteado para la detección de un sólo blob, una forma de color diferenciado que el espectador mueve delate de la cámara para modificar el volumen y velocidad de reproducción (pitch) de un archivo de audio. Para ajustar el reconocimiento del color, en el bloque color tracking settings del panel computer vision, el color seleccionado es hue: 0,28, Saturation: 0.75 y Value: 0.45, y el slider Subtraction Threshold se ha desplazado a su máximo valor para anular la aparición de otros blobs detectados por BACKGROUND SUBTRACTION. En el bloque de algoritmos, debe mantenerse seleccionado Compute Contour Finder para la detección del blob. /* GAmuza 043 E ComputerVision - Color tracking creado por mj */ //Variables tracking campanel = gacameratracking() drawgui = true capturewidth = 320 captureheight = 240 cam = oftexture() // Variables sonido mysound = ofsoundplayer() posx = OUTPUT_W/2 posy = OUTPUT_H/2 posxvol= 0.0 posyspeed= 0.0 function setup() // inicializa panel de tracking campanel:setguisettingsfile(gadatapath("camtrackingsettings.xml")) campanel:setup(0,capturewidth,captureheight) cam:allocate(capturewidth,captureheight,gl_rgb) 194

18 9. TRACKING VIDEO //sonido mysound:loadsound(gaimportfile("hypno00.wav"),true) mysound:setloop(true) mysound:play() function update() cam = campanel:getcameratexturemod() // la textura actualiza los frames de video campanel:update() // actualiza los datos del panel ofsoundupdate() // actualiza sonido function draw() gabackground(0.0,1.0) posx = OUTPUT_W * campanel:getblobx(0) //otro modo de escalar a pantalla completa posy = OUTPUT_H * campanel:getbloby(0) // solo se busca posición del blob 0 ofsetcolor(0,255,0) // color verde ofcircle(posx, posy, 50) // dibuja círculo en la posición del blob posxvol= ofmap(posx, 0, OUTPUT_W, 0.1, 1.0, true) // mapea el valor de posición posyspeed= ofmap(posy, 0, OUTPUT_H, 0.1, 2.0, true) // al del volumen y speed mysound:setvolume(posxvol) // volumen según posición X del blob mysound:setspeed(posyspeed) // velocidad según posición Y del blob ofsetcolor(255) if drawgui then campanel:draw() // muestra panel si drawgui está activo function keyreleased() if gakey() == string.byte('g') then drawgui = not drawgui // con tecla g se muestra/oculta el panel function mousedragged() // para ajustar las opciones del panel con el ratón campanel:mousedragged(gamousex(),gamousey()) function mousepressed() campanel:mousepressed(gamousex(),gamousey()) function mousereleased() campanel:mousereleased(gamousex(),gamousey()) 195

19 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA Los bloques setup() y update() contienen código destinado a la reproducción del sonido, e inicialización y actualización del panel tracking video, pero nada para la detección de blobs porque no se requiere saber el número de blobs, ni actualizar ese valor, dado que solo se debe reconocer uno. En el bloque draw(), sólo hay que escalar dos coordenadas, se simplifica multiplicando el valor de la coordenada que devuelven las funciones getblobx(0) y getbloby(0) por el ancho y alto de la ventana de salida, el parámetro de estas funciones es el id del único blob buscado, el 0. El volumen del archivo de audio se regula mapeando los valores de la posición X entre 0.1 y 1.0; de forma similar, la velocidad de reproducción se mapea respecto a la posición Y, entre 0.1 y 2.0. Y en función de los movimientos que la forma de ese color detectado realice ante la cámara de vídeo, el sonido se va modulando al acelerar o ralentizar la velocidad de reproducción y variar la intensidad de volumen. 196

20 9. TRACKING VIDEO Motion Otro tipo de datos que obtiene la clase gacameratracking() de GAmuza es la cantidad de movimiento y localización media de la masa de píxeles que reflejan ese movimiento. Para este tipo de datos no es necesario activar ningún algoritmo en el panel computer vision. Los métodos vinculados a Motion son: getmotionq(), getmotionx() y getmotiony(), y la sensibilidad del sistema para los datos que devuelven se regula en la interface del panel con los sliders del grupo MOTION DETECTION SETTINGS. El método getmotionq(), devuelve la cantidad de movimiento que se produce ante la cámara. Su valor refleja la cantidad de píxeles que se han modificado en cada frame respecto a la imagen de fondo que tiene almacenada, realmente ese valor oscila entre 0 y el ancho por alto de la imagen capturada, si bien GAmuza lo escala entre 0.0 y 1.0. Los métodos getmotionx() y getmotiony(), devuelven el valor de las coordenadas x e y, respectivamente, del punto medio de la masa de movimiento, el desplazamiento de la representación de ese punto puede indicar hacia donde se traslada mayoritariamente el conjunto de píxeles que se han movido en el frame de la imagen video, respecto al modelo de fondo que ha guardado el sistema. El siguiente ejemplo muestra la utilización del método gamotionq() en un proyecto básico de imágenes interactivas. Según la cantidad de movimiento registrada por la cámara de video, el sistema selecciona y reproduce un número mayor o menor de archivos de imagen que se despliegan por la pantalla siguio una retícula cuadrangular. Para trabajar con la base de datos de imágenes se utiliza la clase de openframeworks ofdirectory() que gestiona el directorio de los archivos guardados en una carpeta llamada imag, situada dentro de la carpeta data del script. /* GAmuza 043 E Interactividad motion tracking creado por mj */ // variables panel tracking video campanel = gacameratracking() drawgui = true capturewidth =

21 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA captureheight = 240 dir= ofdirectory() numimagenes = 0 imagescount = 0 imagenbase = ofimage() imagenes = {} motion = {} motionscaler = // variables imágenes y movimiento // tabla archivos de imagen // tabla valores de movimiento //ajustar según lecturas de movimiento en cada caso function setup() //inicializa panel tracking campanel:setguisettingsfile(gadatapath("camtrackingsettings.xml")) campanel:setup(0,capturewidth,captureheight) motion[0]={} //inicializa tabla movimiento motion[0].q = 0 // valores cantidad de movimiento motion[0].factor = 0 // factor a aplicar para el número de imágenes imagenbase:loadimage(gaimportfile("mano0.png")) // carga imagen base dir:listdir(gaimportfile("imag/")) // carga directorio de imágenes numimagenes = dir:size() // calcula nº archivos if dir:size()> 0 then for i=0,numimagenes-1 do // inicializa la tabla de archivos de imagen imagenes[i] = ofimage() // asigna la clase a cada objeto de la tabla imagenes[i]:(dir:getpath(i)) //carga todas las imágenes function update() campanel:update() // actuaiza los datos del panel motion[0].q = campanel:getmotionq() // detecta cantidad de movimiento motion[0].factor= math.floor(ofmap(motion[0].q,0.0,motionscaler,0,numimagenes,true)) // escala la cantidad de movimiento al número de imágenes //galog(string.format("motion:%f",motion[0].q)) //descomentar galog para ver en la consola el valor de movimiento máximo = motionscaler function draw() gabackground(1.0,1.0) ofsetcolor(255) ancho = imagenbase:getwidth()/4 // calcula el ancho de la imagen base alto = imagenbase:getheight()/4 // calcula el alto de la imagen base cols = math.floor(output_w/ancho) // número de columnas de imágenes c=0 // para hacer una retícula 2D con un solo for 198

22 9. TRACKING VIDEO r=0 for i=0, numimagenes-1 do if i < motion[0].factor then imagenes[i]:draw(c*ancho,r*alto,ancho,alto) c += 1 if c == cols then c= 0 r +=1 // si las imágenes llegan al ancho de pantalla // se ubican en una fila inferior ofsetcolor(0) ofdrawbitmapstring(tostring(motion[0].factor),20,20) //dibuja en pantalla valor actual de numimagenes ofsetcolor(255) if drawgui then campanel:draw() // muestra el panel si drawgui está activo function keyreleased() if gakey() == string.byte('g') then drawgui = not drawgui // con la tecla g se muestra/oculta el panel function mousedragged() // para ajustar las opciones del panel con el ratón campanel:mousedragged(gamousex(),gamousey()) function mousepressed() campanel:mousepressed(gamousex(),gamousey()) function mousereleased() campanel:mousereleased(gamousex(),gamousey()) 199

23 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA El ejemplo plantea que cuanto mayor sea el movimiento que se registra delante de la cámara, mayor será el número de imágenes reproducidas. Sabemos que los valores del método getmotionq() oscilan ente 0.0 y 1.0, pero ese valor máximo depe de las condiciones de presentación del proyecto por lo que para ajustarlo se utiliza el siguiente código en el bloque update() para monitorizar los valores: galog(string.format("motion: %f", motion[0].q)) La consola del IDE los muestra, y el mayor de esos valores sirve para delimitar cuál va a ser el de la variable motionscaler. Para gestionar los archivos de imagen, se vincula la variable global dir a la clase de openframeworks ofdirectory(), se declara una tabla de imágenes y otra para los datos de la cantidad de movimiento. En el bloque setup(), después de inicializar el panel de tracking, se crea una nueva tabla en motion[0] con dos elementos: motion[0].q albergará los datos de lectura del movimiento y motion[0].factor se utilizará para mapear el número de imágenes en función del valor de movimiento. Dado que tablas solo guardarán un valor que va cambiando, su index es 0 e inicialmente se les asigna un valor 0 que se actualizará en el bloque update(). La siguiente línea de código con la variable imagenbase es para cargar la imagen que se toma como referencia. Después, viene el código dirigido a la gestión de los archivos de imagen, aplicándole a la variable dir el método listdir() cuyo parámetro es la función de GAmuza gaimportfile() que indica la carpeta en la que están almacenados. A la variable global numimagenes se le asigna el valor que devuelve el método size() de la clase ofdirectory(), así se obtiene el número de imágenes guardadas en el directorio antes indicado. Y mediante un for que se repetirá tantas veces como imágenes hayan, se le asignan a todas la clase ofimage(), y se cargan utilizando los métodos loadimage de la clase ofimage() y getpath de la clase ofdirectory(). En el bloque update(), se le asigna a la tabla motion[0].q el valor que devuelve el método getmotionq() y para el valor de motion[0].factor se establece el siguiente cálculo: la función math.floor() devuelve un número entero redondeando hacia abajo, si el resultado de los datos que tiene entre paréntesis fuera 0.5, devuelve 0, y con la función ofmap(), los valores de la cantidad de movimiento que vayan entre 0.0 y lo que se le asignó a la variable motionscaler se mapean entre 0 y el número de imágenes almacenadas, devolvio así este factor el número de imágenes que van a mostrarse en función de la cantidad de movimiento. En el bloque draw(), un for se repite tantas veces como el valor que motion[0]. factor ha asignado a numimagenes en el update(). La línea de código ofdrawbitmapstring(tostring(motion[0].factor),20,20), muestra en el borde superior izquierdo de la ventana de salida cuál es ese valor. 200

24 9. TRACKING VIDEO Haar La clase gacameratracking() tiene una serie de métodos para el reconocimiento de partes del cuerpo humano que vienen preconfigurados por archivos Haar cascade de OpenCV. Por defecto, tiene cargado el archivo "haarcascade_frontalface_alt.xml". Si se quiere reconocer otra parte del cuerpo o utilizar otra configuración para la detección de rostros frontales hay que cargar el archivo con el método sethaarfile(gaimportfile("archivohaar.xml")) y guardar previamente ese archivo Haar en la carpeta data. Debe estar activo el algoritmo compute haar finder en el panel. Otros métodos vinculados a este tipo de tracking son: getnumhaars(), gethaarx(), gethaary(), gethaarw(), gethaarh(), getnumhaars(), devuelve el número de Haar detectados en cada frame. gethaarx(haarid) y gethaary(haarid), devuelven las coordenadas X e X, respectivamente, del haar especificado en su parámetro. gethaarw(haarid) y gethaarh(haarid), devuelven la anchura y altura, respectivamente, del haar Ejemplo: especificado en su parámetro. /* GAmuza 043 E ComputerVision - Haar creado por n3m3da */ // variables panel tracking video campanel = gacameratracking() drawgui = true capturewidth = 320 captureheight = 240 runninghaars = 0 function setup() //inicializa panel tracking campanel:setguisettingsfile(gadatapath("camtrackingsettings.xml")) campanel:setup(0,capturewidth,captureheight) 201

25 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA function update() campanel:update() runninghaars = campanel:getnumhaars() // nº de haar activos function draw() gabackground(0.0,1.0) ofsetcolor(255,0,0) offill() for i=0, runninghaars do posx = OUTPUT_W * campanel:gethaarx(i) // escala X de haars a ancho pantalla posy = OUTPUT_H * campanel:gethaary(i) // escala Y ancho = campanel:gethaarw(i) * OUTPUT_W //escala ancho haars a ancho pantalla alto = campanel:gethaarh(i) * OUTPUT_H // escala alto ofrect(posx, posy, ancho, alto) // dibuja rectángulos en cada haar ofsetcolor(255) if drawgui then campanel:draw() // muestra el panel si drawgui está activo function keyreleased() if gakey() == string.byte('g') then drawgui = not drawgui // con la tecla g se muestra/oculta el panel function mousedragged() // para ajustar las opciones del panel con el ratón campanel:mousedragged(gamousex(),gamousey()) function mousepressed() campanel:mousepressed(gamousex(),gamousey()) function mousereleased() campanel:mousereleased(gamousex(),gamousey()) 202

26 9. TRACKING VIDEO Optical Flow GAmuza establece una rejilla a partir de la captura de la cámara de video, vinculada a las constantes OPTICAL_FLOW_GRID_X, número de columnas de la rejilla y OPTICAL_FLOW_GRID_Y, número de filas de la rejilla, para representar vectorialmente la dirección del movimiento que se produce en cada una de las posiciones que marca esa rejilla. Los métodos vinculados a este tipo de tracking son: getopticalflowx(index) y getopticalflowy(device,index), devuelven las coordenadas x e y, respectivamente, de una determinada posición en la rejilla. Su parámetro es el index de la posición en la rejilla. getopticalflowvx(index) y getopticalflowvy(device), devuelven la velocidad de movimiento de las coordenadas x e y, respectivamente, de una determinada posición en la rejilla del optical flow. Su parámetro es el index de la posición en la rejilla. En el panel Computer Vision debe estar activo el algoritmo Compute Optical Flow /* GAmuza 043 E ComputerVision - Optical Flow creado por n3m3da */ // variables panel tracking video campanel = gacameratracking() camid = 0 cam = oftexture() drawgui = true capturewidth = 320 captureheight = 240 opticalflowcols = math.ceil(capturewidth/optical_flow_cols_step) opticalflowrows = math.ceil(captureheight/optical_flow_rows_step) function setup() //inicializa panel tracking campanel:setguisettingsfile(gadatapath("camtrackingsettings.xml")) campanel:setup(camid,capturewidth,captureheight) cam:allocate(capturewidth,captureheight,gl_rgb) 203

27 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA function update() cam = campanel:getcameratexturemod() campanel:update() function draw() gabackground(0.0,1.0) ofsetcolor(255) scaleh = OUTPUT_H // dibuja imagen video a pantalla completa scalew = scaleh* capturewidth / captureheight cam:draw(output_w/2 - scalew/2,0,scalew,scaleh) ofsetcolor(31,165,210) // dibuja representación de optical flow ofsetlinewidth(3) ofpushmatrix() oftranslate(output_w/2 - scalew/2, 0, 0) ofscale(scalew/capturewidth,scaleh/captureheight,1) for i=0, opticalflowcols*opticalflowrows-1 do x = campanel:getopticalflowx(i) y = campanel:getopticalflowy(i) vx = campanel:getopticalflowvx(i) vy = campanel:getopticalflowvy(i) ofline(x, y, x + vx, y + vy) ofpopmatrix() ofsetcolor(255) if drawgui then campanel:draw() // muestra el panel si drawgui está activo function keyreleased() if gakey() == string.byte('g') then drawgui = not drawgui // con la tecla g se muestra/oculta el panel 204 function mousedragged() //para ajustar opciones del panel con el ratón campanel:mousedragged(gamousex(),gamousey()) function mousepressed() campanel:mousepressed(gamousex(),gamousey()) function mousereleased() campanel:mousereleased(gamousex(),gamousey())

28 9. TRACKING VIDEO Trigger Areas Desde el panel de Camera Tracking, en la imagen que captura la cámara se pueden activar nueve áreas circulares, ajustables en tamaño y posición para que las acciones programadas para el tracking sólo se apliquen si el punto central del blob entra en el área especificada. Clicando en el centro de un área y arrastrando el ratón se puede desplazar su posición. Clicando en cualquier otra zona del área y arrastrando el ratón, se puede ampliar o reducir su tamaño. /* GAmuza 043 E ComputerVision - triggerareas uso opción trigger area con panel Camera Tracking. creado por n3m3da */ campanel = gacameratracking() camid = 0 cam = oftexture() drawgui = true capturewidth = 320 captureheight = 240 function setup() gawave(ga_brown,1) // inicializa un oscilador con ruido marrón // inicializa panel tracking campanel:setguisettingsfile(gadatapath("camtrackingsettings.xml")) campanel:setup(camid,capturewidth,captureheight) cam:allocate(capturewidth,captureheight,gl_rgb) function update() cam = campanel:getcameratexturemod() campanel:update() // activa el volumen del ruido marrón si el trigger area 0 está activada if campanel:gettrigger(0) then gawavevolume(0,0.8) else gawavevolume(0,0.0) 205

29 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA function draw() gabackground(0.0,0.8) // dibuja la imagen capturada por la cámara ofsetcolor(255) scaleh = OUTPUT_H scalew = scaleh* capturewidth / captureheight cam:draw(output_w/2 - scalew/2,0,scalew,scaleh) ofsetcolor(255) if drawgui then campanel:draw() // muestra el panel si drawgui está activo function keyreleased() if gakey() == string.byte('g') then drawgui = not drawgui // con la tecla g se muestra/oculta el panel function mousedragged() // para ajustar las opciones del panel con el ratón campanel:mousedragged(gamousex(),gamousey()) function mousepressed() campanel:mousepressed(gamousex(),gamousey()) function mousereleased() campanel:mousereleased(gamousex(),gamousey()) 206

30 9. TRACKING VIDEO 207

31 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA Panel Tracking por sensor Kinect 208

32 9. TRACKING VIDEO 9.2. Panel Tracking: por sensor kinect A continuación se describe la interface del panel de Tracking para el sensor kinect y los métodos de la clase de GAmuza gakinecttracking(), deteniéndonos especialmente en las diferencias que hay respecto al tracking por cámara de video. Al igual que en el capítulo anterior, se explica la interface a partir del código que genera su carga. /* GAmuza 0428 ejemplos E Panel Tracking kinect creado por n3m3da */ kinectpanel = gakinecttracking() drawgui = true kinectdevid = 0 kinectimage = oftexture() function setup() kinectpanel:setguisettingsfile(gadatapath("kinecttrackingsettings.xml")) // parámetros setup: id,ir,videoimage,led MODE kinectpanel:setup(kinectdevid,true,false,1) function update() kinectimage = kinectpanel:getcameratexture() kinectpanel:update() function draw() gabackground(0.1,1.0) // muestra la imagen desde el dispositivo escalada a pantalla completa ofsetcolor(255) scaleh = OUTPUT_H scalew = scaleh* 640 / 480 kinectimage:draw(output_w/2 - scalew/2,0, scalew,scaleh) ofsetcolor(255) if drawgui then kinectpanel:draw() // muestra el panel si drawgui está activo 209

33 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA function keyreleased() if gakey() == string.byte('g') then drawgui = not drawgui // con la tecla g se muestra/oculta el panel // para ajustar las opciones del panel con el ratón function mousedragged() kinectpanel:mousedragged(gamousex(),gamousey()) function mousepressed() kinectpanel:mousepressed(gamousex(),gamousey()) function mousereleased() kinectpanel:mousereleased(gamousex(),gamousey()) function exit() kinectpanel:close() // siempre hay que cerrar el dispositivo Al igual que para el tracking con cámara de video, se inicia asociando una variable a la clase de GAmuza que gestiona, en este caso, al sensor Kinect, gakinecttracking(), se establece un swich booleano para mostrar u ocultar el panel en la ventana de salida; y la variable kinectimage se vincula a la clase de openframeworks oftexture() para acoger la imagen que viene de la Kinect. La interface del panel del sensor Kinect también está regulada por un archivo.xml que se guarda en la carpeta data junto al archivo del script utilizando el método setguisettingsfile() cuando se salvan los ajustes del panel, y se inicializa con el método setup(int,bool,bool,int), cuyos parámetros son: el ID del sensor, el uso o no de infrarrojos, el uso o no de color en la imagen y el último parámetro int es Led Mode cuyos valores posibles son: 0 -> LED_OFF, 1 -> LED_GREEN, 2 -> LED_RED, 3 -> LED_YELLOW, 4 -> LED_BLINK_GREEN y 6 -> LED_BLINK_YELLOW_RED. En el bloque del update(), se asigna la imagen obtenida por el sensor Kinect a la textura: kinectimage = kinectpanel:getcameratexture(); y se actualiza la información del panel con el método update. En el bloque del draw(), se puede dibujar la imagen capturada por el sensor y dibujar o no el panel en la ventana de salida. El resto de bloques de código funcionan igual que en el panel de tracking con cámara de video. 210

34 9. TRACKING VIDEO Descripción panel Las diferencias fundamentales entre el sensor Kinect y una cámara de video en su utilización para tracking reside en la capacidad para detectar profundidad y el mecanismo de inclinación motorizado. DEPTH IMAGE El sensor de profundidad combina infrarrojos con un sensor CMOS monocromo lo que le permite a Kinect ver/calcular el espacio en 3D sin que las condiciones de luz ambiental influyan; el rango de detección de profundidad va 70 cm a 6 metros y en el panel puede ajustarse con los sliders: NEAR TRESTHOLD: determina el plano de los elementos más próximos, como mínimo desde 70 cm del sensor FAR TRESHOLD: hasta qué plano de profundidad se quiere detectar, como máximo 6 m SENSOR KINECT HARDWARE El mecanismo de inclinación es un acelerómetro para determinar la orientaciónde la Kinect. La interface del panel refleja estos datos en los 3 monitores de la columna derecha y en los scripts se pueden conocer con los métodos: getaccelx(), getaccely() y getaccelz() que devuelven un valor float ente 0.0 y 1.0 Los otros componentes de la interface actúan de forma similar a los panel de tracking para cámaras de video. DEPTH RANGE MASK: monitor donde se muestra el resultado de los algoritmos aplicados. 211

35 LIVE CREATIVE CODING. INTRODUCCIÓN A LA PROGRAMACIÓN CREATIVA CON GAMUZA GENERAL SETINGS SENSOR KINECT BLUR: grado de desenfoque de la señal de entrada ERODE: reducir el área de las superficies detectadas DILATE: ampliar el área de las superficies detectadas MOTION DETECTION SETTINGS. Regula la detección de movimiento según niveles de profundidad. MOTION TRESHOLD: regula la sensibiliad del sistema para activar la detección, si es poco sensible se debe ampliar el umbral (Threshold) MOTION TRIGGER LOW LIMIT: nivel más bajo para activar la detección de movimiento MOTION TRIGGER RANGE LIMIT: limite del rango para la detección de movimiento. BLOB TRACKING SETTINGS MIN BLOB: tamaño mínimo de los blobs MAX BLOB: tamaño máximo de los blobs CONTOUR DETAIL: menú con tres opciones, raw, smooth o simple CONTOUR SMOOTH FACTOR, si se ha seleccionado smooth, ajusta el nivel de suavizado CONTOUR SIMPLE TOLERANCE, si se ha seleccionado simple, ajusta el rango de vértices que articulan el contorno. COMPUTING ALGORITHM SELECTOR COMPUTE CONTOUR FINDER, para procesar el contorno de los blobs detectados. COMPUTE CONTOUR GEOMETRY. Determina formas geométricas a partir de los contornos. Al activarlo se activa automáticamente el anterior si no lo estaba. COMPUTE OPTICAL FLOW. Calcula el flujo óptico del movimiento y lo describe con vectores que indican la dirección e intensidad. COMPUTE TRIGGER AREAS. Activa la posibilidad de utilizar 8 zonas circulares, como en el módulo Computer Vision. 212