Kinect y Processing / Parte1

La idea de estas publicaciones es dejar un testimonio respecto a cómo he comenzado a aprender a utilizar el sensor Kinect usando Processing como entorno de programación. Este proyecto lo desarrollo en Linux con el sistema operativo Ubuntu 12.04.1 y Processing 2.0b8

Primero que todo me gustaría recomendar e insitir en la recomendación de que usen el libro Make Things See para aprender a usar kinect con processing, es muy didactico, explica todo paso por paso y es muy práctico. Les recomiendo que lo compren. De hecho para comenzar esta publicación adentrándonos un poco en qué es y como funciona la cámara Kinect, dejaré la traducción de un pequeño fragmento del primer capítulo de este libro: “¿Qué es la kinect?” donde precisamente responde las primeras preguntas que nos hacemos.

¿Qué hace la Kinect?

La Kinect es una depth camera. Las cámaras normales captan la luz que se refleja en los objetos en frente de ellas. Convierten esta luz en una imagen que se parece a lo que nosotros vemos con nuestros propios ojos. La Kinect, por otro lado, registra la distancia de los objetos que están ubicados en frente de ella. Usa una luz infraroja para crear una imagen (una imagen de profundidad o depth image en inglés) que no captura como se ve el objeto, sino donde está en el espacio. En la siguiente sección de esta introducción, explicaré como la Kinect realmente funciona. Describiré qué hardware se usa para captar esta imagen de profundidad y explicaré alguna de sus limitaciones. Pero primero me gustaría explicar porqué realmente querríamos una imagen de profundidad. Que podemos hacer con una imagen de profundidad que no podemos hacer con una imagen a color convencional?

Primero que todo, una imagen de profundad es mucho más fácil de “entender” para un computador que una imagen a color convencional. Cualquier programa que esté tratando de entender una imagen comienza por sus pixeles y trata de encontrar y reconocer en ellos a las personas y objetos representados por ellos. Si tu eres un programa de computador y estás buscando pixeles de color, es muy dificil diferenciar objetos y personas. Gran parte del color de los pixeles está determinado por la luz que había en la habitación en el momento que la imagen fue capturada, los cambios en la apertura y color de la cámara, etc. Cómo podrías siquiera saber donde comienza un objeto y termina otro, ni mucho menos qué objeto es cuál y si hay alguna persona presente? En una imagen de profundidad, por otro lado, el color de un pixel te dice cuán lejos está esa parte de la cámara. Dado que estos valores se corresponden directamente con la ubicación de los objetos en el espacio, son mucho más útiles a la hora de determinar donde un objeto comienza, donde otro termina, y si hay alguna persona cerca. Además, debido al modo en que la Kinect crea su imagen de profundidad no es sensible a las condiciones de luz de la habitación al momento de captura de la imagen. La Kinect captará la misma imagen de profundidad tanto en una habitación con mucha luz como en una de un tono más oscuro. Esto hace a las imágenes con profundidad más fiables e incluso más fáciles de entender para un computador.

Exploraremos este aspecto de las imágenes con profundidad mucho más minuciósamente en el capitulo 2.

Una imagen con profundidad también contiene información tridimencional precisa acerca de lo que sea que esté al frente. A diferencia de las cámaras convencionales, que capturan como lucen las cosas, una cámara de profundad (depth camera) captura como son las cosas. El resultado es que nosotros podemos usar la información de una depth camera como la Kinect para reconstruir un modelo 3D de lo que sea que la cámara vea. Nosotros podemos luego manipular este modelo, visualizarlo de nuevos angulos interactivamente, combiarlo con otros modelos 3D pre-existentes, e incluso usarlo como parte de un proceso de fabricación digital para producir nuevos objetos físicos. Nada de esto puede ser hecho con una cámara a color convencional.

Comenzaremos a explorar estas posibilidades en el Capítulo 3 para luego continuar con ello en el Capítulo 5 cuando investigemos el escaneado para fabricación.

Y finalmente, debido a que las imágenes con profundidad son mucho más fáciles de procesar que las imagenes en color convencionales, podemos correr algunos procesos realmente innovadores con ellas. Específicamente, podemos usarlas para detectar y seguir a personas, incluso localizar sus articulaciones y partes del cuerpo. En muchos sentidos esta es la capacidad más fascinante de la Kinect. De hecho, Microsoft desarrollo la Kinect específicamente por las oportunidades que esta habilidad de detección del cuerpo ofrece a los videojuegos (más acerca de esto luego en “¿Quién hizo la Kinect?” en la página 6). El seguimiento individual de las partes del cuerpo crea increíbles posibilidades para nuestras própias aplicaciones interactivas. Afortunadamente, tenemos acceso al software que puede llevar a cabo este procesamiento y simplemente entregarnos la localización de los usarios. No tenemos que analizar la imagen con profundidad nosotros mismos para obtener esta información, ya que es sencillamente abordable gracias a la idoneidad de la imagen con profundidad para ser procesada.

Trabajaremos en extenso con información de seguimiento al usuario en el Capítulo 4.

¿Qué hay dentro y cómo funciona?

Si sacas la cubierta plástica negra de la Kinect ¿que encuentras? ¿Cuales son los componentes de harware que hacen funcionar a la Kinect y como trabajan conjuntamente para darle a la Kinect sus habilidades? Hechemos un vistazo. La figura 1-1 muestra una fotografía de una Kinect que ha sido liberada de su carcaza.

La primera cosa que siempre noto cuando miro la Kinect al natrual es su extraordinario parecido a varios simpáticos robots de películas. Desde Johnny 5 de Corto Circuito hasta WALL-E de Pixar, por décadas los diseñadores de películas han estado creando robots de aspectos humanos usando cámaras por ojos. Parece apropiado de algún modo (o quizás fue sencillamente inevitable) que la Kinect, el primer periférico de computador en traer las capacidades de vanguardía de la visión por computadora a nuestras casas terminara luciendo muy parecido a uno de estos robots.

A diferencia de estos robots de película, sin embargo, la Kinect parece en realidad tener tres ojos: Los dos en el centro y uno apartado a un lado. Aquel “tercer ojo” es el secreto de como la Kinect funciona. Como la mayoría de los “ojos” robot, las dos protuberancias en el centro de la Kinect son cámaras, pero el tercer ojo de la Kinect esrealmente un proyector infrarojo. La luz infraroja tiene una lonigtud de onda más extensa que la de la luz visible, de modo que no podemos verla con nuestro ojo desnudo. La luz infraroja es completamente inofensiva, nosotros estamos constantemente expuestos todos los días a ella en forma de luz solar.

El proyector infrarojo de la Kinect, dirigue una grilla de puntos infrarojos sobre todo lo que se encuentra en frente de ella. Estos puntos son normalmente invisibles para nosotros, pero es posible tomar una fotografía de ellos usando una cámara IR. La Figura 1-2 muestra un ejemplo de cómo se ven los puntos proyectados por la Kinect.

De hecho capturé esta imagen usando la misma Kinect. Una de las dos cámaras que señalé antes (uno de los dos “ojos” de la Kinect) es una cámara IR. Es un sensor especialmente diseñado para capturar luz infraroja. En la Figura 1-1, en la imagen de la Kinect desnuda sin su carcaza expterior, la cámara IR es aquella de la derecha. Si miras de cerca, puedes ver que el lente de esta cámara tiene un brillo verdoso iridiscente comparado con la cámara estándar de luz visible a su lado.

Entonces, la Kinect puede ver la grilla de puntos infrarojos que se están proyectando en los objetos frente a ella. Pero ¿cómo transforma esta imagen en información acerca de la distancia de aquellos objetos? En la fábrica donde fue hecha, cada Kinect es calibrada para saber exáctamente donde cada uno de los puntos proyectados aparecen cuando se proyectan sobre una pared plana a una distancia conocida. Mira nuevamente la imagen de la proyección IR. Notas cómo los puntos sobre la libreta que estoy sosteniendo en frente a la pared parecen empujados hacia adelante y cambiados de posicion? Cualquier objeto que esté más cercano que la calibración de distancia de la Kinect empujará estos puntos fuera de su posición en una dirección y cualquier objeto que esté más lejos los empujará fuera de posición en la otra dirección. De este modo la Kinect esta calibrada para saber la posición original de todos estos puntos, puede usar sus desplasamientos para resolver la distancia del objeto en esa parte de la escena. En cada parte de la imagen que la Kinect captura con su cámara IR, cada punto estará un poco fuera de posición en relación a donde la Kinect esperaba verlo. El resultado es que la Kinect puede convertir esta imagen IR de grilla de puntos en información de profundidad que captura las distancias de cada cosa que puede ver.