Leap Motion (II): principio de funcionamiento

¿Recordáis que en la entrada anterior vimos las partes de las que consta el sensor Leap Motion? Pues hoy nos toca analizar su funcionamiento. ¡Allá vamos!

Una de las razones por las que hemos elegido Leap Motion como sensor para nuestro traductor de lengua de signos es porque, para identificar correctamente los gestos, necesitamos obtener la máxima información posible de la configuración y del movimiento realizado por las manos. Tener información tridimensional es imprescindible para nuestro proyecto.

Existen diferentes técnicas para obtener parámetros de profundidad mediante un sistema de visión (por ejemplo, Kinect obtiene imágenes a color e imágenes de profundidad proyectando un mallado de puntos de los que analiza la distancia a partir de la distorsión del mallado). Con esta información se pueden obtener variables suficientes para poder determinar un gesto realizado. Nosotros vamos a centrarnos en el funcionamiento de Leap Motion; como siempre, ¡paso a paso!

Cómo funciona el controlador Leap Motion

El dispositivo ilumina la zona de cobertura mediante una luz infrarroja emitida a través de sus tres LEDs, con una longitud de onda de 850 nm. Esta zona de cobertura está limitada por el ángulo de visión de los sensores (esto también lo vimos en la entrada anterior) y por la corriente máxima que puede entregar la conexión USB.

IMG 1-Blog de ShowLeap-Leap Motion-Principio de funcionamientoCuando un objeto —en nuestro caso, las manos— es iluminado, se produce una reflexión de luz que llega al dispositivo e incide sobre las lentes de las dos cámaras. Estas lentes, de tipo biconvexas, concentran los rayos en el sensor de cada cámara; y los datos recogidos por los sensores se almacenan en una matriz (imagen digitalizada) en la memoria del controlador USB, en donde se realizan los ajustes de resolución adecuados mediante el microcontrolador del dispositivo.

Una vez ajustada la resolución, los datos de los sensores se envían directamente al driver instalado en el ordenador. Estos datos representan un valor de intensidad luminosa por cada píxel de la imagen capturada y se guardan en un buffer. El valor de intensidad luminosa se cuantifica a 8 bits para generar una imagen RAW en escala de grises —por tanto, hay un total de 256 posibles valores de luminosidad. Y nos falta otro dato: cada imagen tiene un tamaño de 640 x 120 px, con lo que en total hay 76.800 píxeles por imagen. ¿Y aún así es rápido el dispositivo? Pues si, porque las imágenes no son tratadas en el propio dispositivo; ¡este solo recoge y envía datos! 😉

Una vez que las imágenes de las dos cámaras llegan al driver son analizadas para identificar las manos y los dedos a partir de un modelo matemático de caracterización anatómico. Además, se obtiene la profundidad mediante un algoritmo que os explicamos  a continuación. Primero, mirad esto:

IMG 2-Blog de ShowLeap-Leap Motion-Principio de funcionamiento

Estas son las dos imágenes que llegan al driver del Leap Motion (se puede acceder a ellas a partir de la versión 2.1 de la API).

Pero antes de aplicar el algoritmo de identificación y el de profundidad hay que tener en cuenta que las lentes del dispositivo producen una distorsión en la imagen óptica , deformando el objeto observado. Vayamos por partes: ¿sabes que existen diferentes tipos de distorsión, dependiendo del tipo de lente que se use?

IMG 3-Blog de ShowLeap-Leap Motion-Principio de funcionamiento

Pues en Leap Motion se produce lo que conocemos como distorsión compleja: una mezcla entre la distorsión barril y la distorsión cojín.

IMG 4-Blog de ShowLeap-Leap Motion-Principio de funcionamiento

Para mejorar esta distorsión, Leap Motion tiene una opción de calibrado mediante la cual se obtiene un mapa de mallado de puntos de calibrado que se superpone a la imagen captada por cada sensor.

IMG 5-Blog de ShowLeap-Leap Motion-Principio de funcionamiento

Por lo tanto, cada buffer de datos de imagen que se envía al driver va acompañado de otro buffer que contiene los datos de distorsión. Estos datos son una rejilla de 64 x 64 puntos con dos valores de 32 bits cada uno. Cada uno de estos puntos representa un rayo proyectado en la cámara. El valor de un punto del mallado define la luminosidad de un píxel en la imagen y se pueden obtener los datos de luminosidad de todos los píxeles mediante interpolación.

Así pues, se puede obtener el valor de brillo para cualquier rayo proyectado. Los valores de la cuadrícula que caen fuera del rango [0…1] no corresponden a un valor de datos de la imagen y, por tanto, debemos ignorar estos puntos. Vamos a tratar de que se entienda mejor con un ejemplo:

IMG 6-Blog de ShowLeap-Leap Motion-Principio de funcionamiento

La imagen nos muestra una reconstrucción de los datos de una imagen con la distorsión corregida. El valor de brillo de cada píxel de la imagen se originó a partir de un rayo de luz que entró en la cámara desde una dirección específica. La imagen se reconstruye mediante el cálculo de las pistas horizontales y verticales representados por cada píxel y se puede encontrar el valor de brillo verdadero de los datos de la imagen utilizando el mapa de calibración. Las partes rojas de la imagen representan las áreas dentro de la prestación para la que ningún valor de brillo está disponible (el campo de visión real es de menos de 150 grados).

Una vez que han llegado las imágenes, las hemos corregido debidamente y el driver ha identificado las manos y los dedos, podemos determinar la posición de estas en el sistema de coordenadas cartesianas de Leap Motion a través de técnicas de visión estereoscópica. Porque, como ya hemos visto, Leap Motion es un sistema de captación de imágenes basado en la visión binocular y por ello podemos obtener distancias.

Básicamente, un sistema estereoscópico funciona del siguiente modo: gracias a la separación de las dos cámaras en el eje X se obtienen dos imágenes con pequeñas diferencias (disparidad).

IMG 7-Blog de ShowLeap-Leap Motion-Principio de funcionamiento

Como se puede observar en la imagen anterior, las dos cámaras —representadas por Oi y Od— están en el mismo plano Z, sobre la línea base. Si trazamos una línea epipolar entre las dos imágenes Ii e Id, dado que Oi y Od están en el mismo plano Z y las dos cámaras tienen la misma distancia focal, podemos ver la proyección del punto P en las dos imágenes. Por tanto, se puede obtener un valor de disparidad para cada par de puntos emparejados Pi(xi,yi) y Pd(xd,yd) dado por d = XI-XD.

IMG 8-Blog de ShowLeap-Leap Motion-Principio de funcionamiento

Considerando igual la distancia focal f en las dos cámaras y conociendo la distancia entre cámaras b:

IMG 9-Blog de ShowLeap-Leap Motion-Principio de funcionamiento

Como vemos, a partir del sistema anterior podemos obtener las coordenadas del punto P.

Y ahora sin tantos tecnicismos… ¿Cómo funciona Leap Motion? 🙂

Para terminar este post te nombramos los pasos básicos que realiza Leap Motion para entregar variables descriptivas de una configuración de mano y de un gesto:

  1. Obtiene las imágenes desde los sensores de las cámaras del dispositivo.
  2. Aplica una corrección de la distorsión que producen los sensores.
  3. Aplica un modelo para determinar la configuración de cada mano y ejecuta un algoritmo de visión estereoscópica entre cada par de imágenes para obtener la posición en el plano tridimensional.

 

Créditos del post
Imágenes:
- Página oficial de Leap Motion
- TFM «Técnicas de visión estereoscópica para determinar la estructura tridimensional de la escena». Autor: Martín Montalvo Martínez / Director: Gonzalo Pajares Martinsanz

 

Una respuesta a “Leap Motion (II): principio de funcionamiento”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *