9 mar 2011

El viaje en 3D



Visualización interactiva del prototipo 3D relativo al proyecto "El viaje de una vida".
El modulo de visualización está realizado en Pure Data y Open CV (computer vision).
Aquí pongo los diferentes patch que forman el modulo, con un breve resumen de lo que hace cada uno de ello.



 I - Patch que carga y visualiza en la ventana GEM el modelo 3D de la maqueta en formato .obj,
     mediante el objeto "model".
     En la parte de arriba el objeto en cuestion recibe los valores (mediante los objetos "r" = recive)que
     salen de la detección de la cara por parte de la camara. Los primeros dos valores que se refieren
     a la posición X y Y de la cara detectada se envian al objeto "rotateXYZ" por la primera y la
     segunda entrada, que controlar respectivamente la X y la Y de la ratación del modelo3D. En ese
     caso entonces hay que invertir las posiciones ya que la X de la rotación del 3D corresponde a la Y
     la detección de la cara y así de forma igual funciona la Y.
     El tercer valor que se refiere al tamaño de la cara detectada, (o sea al acercamiento a la camara por
     parte del usuario), se envia al objeto "scale", para que acercando la cara a la camara el modelo3D   ç
     aumenta de escala.
     Antes de ser recibidos por el objeto "rotate", los valores relativos a las coordenadas Y de la cara
     pasan por un filtro, exactamente el objeto "line" lo que hace es diminuir la velocidad en la que
     cambian estos valores. De esta forma el objeto 3D se inclina hacia arriba y hacia abajo de forma
     mas fluida y mas lenta.




















II - "pd gemwin" es un subpatch necesario para crear la ventana GEM de visualización. Está contenido en el patch relativo a la carga y visualización del objeto3D.















III - El objeto "pix_video" colocado al cominzo de ese patch sirve para capturar el video de una
       camara.
       Mediante el objeto "pix_opencv_haarcascade" de OpenCV este patch es capaz de detectar la
       presencia y posición de una cara humana delante de la camara. Para que consiga hacer eso
       al objeto hay que cargarle un file en binario relativo a las estadisticas de detección, hecho
       mediante la comparación de 4000 imagenes de caras en diferentes posiciónes.
       Una vez sacadas las coordenadas de las caras (en ese caso funciona solo con una cara) mediante
       el  objeto "route", y desempaquetada la información mediante el objeto "unpack", se enviar los
       valores de las coordenadas XYZ de la cara al patch de carga y visualización del objeto 3D
       mediante el objeto "s" (send).
       Antes de ser enviados, los valores se escalan mediante el objeto "autoscale" y se saca la media de
       los ultimos 20 frames mediante el objeto "mean_n", objetos siguen en los puntos IV y V.













IV - El objeto "autoscale" sirve para que los valores sacados por un objeto se conviertan en otra escala,
       de manera que el objeto que recibe estos valores puede comprenderlos segun su escala. Se le
       añade por esto, el valor minimo y el maxim, o sea el rango de los valores que saca la nueva escala.
      Así en el caso de la imagen abajo, relativa a las coordenadas X de la cara, el autoscale va desde
      -200 hasta 200, para que al mover la cara a derecha y a izquierda de la pantalla, las coordenadas se
      trasformen para visualizar la maqueta a 360 grados, o sea mas de 180 grados por cada lado.















V - El objeto "mean_n" posicionado antes de que las coordenadas de la cara vayan al objeto 3D, lo que
      hace es sacar la media, en ese caso de los ultimos 20 frames del video. De esta forma se evita que
      el movimiento del 3D se pare de golpe cuando hay errores en la detección de la cara.
      Se le dice al programa, antes de enviar los valores, de sacar la media de los ultimos 20 frames de la
      captura de la camara, y luego enviar el valor. Esto significa que tambien si hay un pequeño fallo en
      la detección, se elimina porque el valor enviado se refiere a la media de los utlimos 20 frames.