Trabajo Final de Carrera - iri.upc.edu · 7 Resumen de Trabajo Final de Carrera...
Transcript of Trabajo Final de Carrera - iri.upc.edu · 7 Resumen de Trabajo Final de Carrera...
Trabajo Final de Carrera
Estudio de viabilidad para el
reconocimiento de los gestos de la mano
mediante una cámara de tiempo de vuelo
Mohamad-Salajh Marrawi Moarrawi
Ingeniería Técnica de Telecomunicación, esp. Sistemas de
Telecomunicación
Director: Guillem Alenyà Ribas
Avalador: Jordi Surinyac Albareda
Vic, septiembre de 2011
5
INDICE
RESUMEN
ABSTRACT
MOTIVACIÓN
Capítulo 1 INTRODUCCIÓN
Capítulo 2 OBJETIVOS
PARTE I. ESTUDIO PREVIO
Capítulo 3 ESTADO DEL ARTE
3.1 Dificultades y soluciones
3.2 Revisión de las técnicas actuales
Capítulo 4 LA CÁMARA DE TIEMPO DE VUELO SWISSRANGER™ SR-3000
4.1 Discusión tecnológica
4.2 Aplicaciones
Capítulo 5 MODELADO DE LA MANO
5.1 Modelo cinemático
5.2 Modelo cilíndrico
Capítulo 6 EL ALGORITMO ICP
6.1 Etapa de correspondencia
6.2 Etapa de registro
6.2.1 Asignación de un error métrico
6.2.2 Minimización del error métrico
6.3 Etapa de actualización
PARTE II. DESARROLLO
Capítulo 7 DESCRIPCIÓN DE LA IMPLEMENTACIÓN
7.1 Herramientas informáticas empleadas
7.2 Adquisición de datos
7.3 Reducción de puntos
7.4 Segmentación interactiva de puntos
7.5 ICP
7.6 Validación de los datos extraídos
7.7 Reproducción de los datos resultantes
6
PARTE III. RESULTADOS, CONCLUSIONES Y TRABAJO FUTURO
Capítulo 8 RESULTADOS EXPERIMENTALES
8.1 Experimento 1
8.2 Experimento 2
8.3 Experimento 3
8.4 Experimento 4
Capítulo 9 CONCLUSIONES Y TRABAJO FUTURO
PARTE IV. BIBLIOGRAFÍA
ANEXOS
A.1. Resultados numéricos de extracción de datos
A.2. Código de las etapas del algoritmo
A.3. Colección de vídeos de extracción de datos
A.4. Colección de vídeos de validación de datos
A.5. Colección de vídeos de reproducción de datos
7
Resumen de Trabajo Final de Carrera E.T.Telecomunicaciones, esp. Sistemas de Telecomunicación
Título: Estudio de viabilidad para el reconocimiento de los gestos de la mano mediante una cámara de tiempo de vuelo Palabras clave: SwissRanger 3000, profundidad, DOF, nube de puntos, filtrado, muestreo, ICP, matriz homogénea, Open Inventor Autor: Mohamad-Salajh Marrawi Moarrawi Director: Guillem Alenyà Ribas Avalador: Jordi Surinyac Albareda Fecha: septiembre de 2011
Resumen
Hoy en día, la variedad existente de sistemas en fase de investigación, que han sido o
podrían ser aplicados en la detección de manos y el reconocimiento de gestos, ha sido posible
gracias a las nuevas técnicas basadas en la estimación de la postura de la mano, en el que
tradicionalmente se han usado la extracción del color y del aspecto.
Partiendo de las imágenes capturadas por la cámara de tiempo de vuelo
SwissRanger™ SR-3000 (cámara que captura imágenes con una intensidad inversamente
proporcional a la profundidad de los objetos presentes en la escena) se propone realizar una
segmentación de puntos que servirán para definir morfológicamente la silueta de la mano y la
extracción de características para medir las variaciones de movimiento de hacer un gesto en
particular.
El sistema propuesto consiste en un algoritmo implementado en Matlab subdividido
en varias etapas: adquisición de una secuencia de imágenes captadas con la cámara; reducción
de los puntos no deseados; segmentación de la nube de puntos de forma interactiva; y
finalmente, emparejamiento de imágenes consecutivas de la secuencia. El resultado que se
obtiene de este algoritmo, son los parámetros que indican el desplazamiento de una imagen
hacia la siguiente.
Una vez concluidas las etapas citadas en el párrafo anterior, se propone usar un
método de visualización de los resultados del algoritmo, mediante las librerías gráficas 3D
Open Inventor, que proporcionan métodos para representar el modelo geométrico de mano
que se propone, aplicar los desplazamientos obtenidos previamente, y facilidades para
cambiar el punto de vista del observador.
8
Final Degree Project Abstract Technical Telecommunications Engineering
Title: Feasibilty study for hand gesture recognition with a time-of-flight camera Keywords: SwissRanger 3000, depth, DOF, dot cloud, filtering, sampling, ICP, homogeneus matrix, Open Inventor. Author: Mohamad-Salajh Marrawi Moarrawi Director: Guillem Alenyà Ribas Supervisor: Jordi Surinyac Albareda Date: September 2011
Abstract
Today, of the variety of systems under investigation, which have been or could have
been applied in the detection and hand gesture recognition have been possible thanks to new
techniques based on the hand posture estimation, which traditionally have used for the
extraction of color and appearance.
Based on images acquired by the Time-of-Flight camera SwissRanger™ SR-3000 a
camera that acquires images with an intensity inversely proportional to the depth of the
objects in the scene the system performs point segmentation wich helps to define the
morphological shape of the hand and feature extraction to measure the variations of a
particular movement.
The proposed system consists of an algorithm implemented in Matlab that is divided
into several stages: acquisition of image sequences from the camera; reduction of unwanted
points; interactive segmentation of the point clouds; and matching consecutive images in the
sequence. The results obtained from this algorithm are the parameters that indicate the
displacement of one image to the next.
After completing the steps mentioned in the previous paragraph, the results are
displayed using the Open Inventor 3D graphics libraries, which provides methods for
representation of the geometric hand model proposed by applying the changes previously
found and facilitating changes to the observer's viewpoint.
9
MOTIVACIÓN
Desde que era pequeño, había una pregunta que atormentaba mi curiosa cabeza:
¿cómo sería posible comunicar una persona sordomuda con una persona ciega? Esta pregunta
fue cobrando cada vez más fuerza hasta que culminó en el momento de desarrollar el trabajo
final de carrera.
La oportunidad de poner a prueba este reto me vino de la mano del Dr. Guillem
Alenyà, miembro del Instituto de Robótica e Informática Industrial de Barcelona que me
ofreció la oportunidad de desarrollar este trabajo gracias a la cámara de profundidad SR-3000
disponible en el laboratorio de percepción y manipulación.
Las cámaras ToF son una tecnología nueva y muy en boga. La aplicación más inmediata
va dirigida en el ámbito de los videojuegos y la interactividad con el ordenador. Se utilizan hoy
en día en aparatos de adquisición de imágenes, como escáneres o cámaras. De esta forma, es
posible adquirir imágenes y secuencias en 3D. Es una técnica bastante sencilla de aplicar y, por
tanto, económicamente asequible a la hora de fabricar aparatos de obtención de profundidad
de escenarios o cuerpos.
El desarrollo de este proyecto se inspira fundamentalmente en la documentación
sobre las aportaciones de algunos autores en el campo de la detección de manos y el
reconocimiento de gestos, así como sus principales ejemplos, en la que algunos de ellos usan
cámaras 3D, y otros usan la combinación de estas con otros sensores 2D para paliar algunas
carencias.
Dentro de este contexto, el reto está en aprender de estos avances y ver hasta dónde
soy capaz de llegar a la hora de confeccionar este proyecto, para que sus mejoras algún día
puedan llegar a hacerse realidad gracias a esta nueva tecología.
10
Capítulo 1
INTRODUCCIÓN
Este proyecto se plantea como un sistema en la que su entrada es una secuencia de
imágenes 3D captadas con la cámara SR-3000, que representan el movimiento de hacer un
sencillo gesto manual, como por ejemplo, la secuencia de flexionar y extender un dedo, y la
salida de este sistema, es la animación de realizar el mismo gesto pero visualizada mediante
un modelo virtual de mano en 3D. El esquema global de este sistema se presenta en la Figura
1.1.
Figura 1.1: Esquema del sistema.
Dado el caracter visual de los gestos que queremos captar, es indispensable que este
sistema cuente como entrada con un sistema hardware de captura de imágenes. Para ello se
utiliza un sensor de profundidad capaz de captar la información 3D de los objetos que queden
dentro de su campo de visión, en forma de nubes de puntos. El desarrollo de un sistema
software relativo al tratamiento de la información captada, que es el objetivo de la
implementación de este sistema, proporcionará los parámetros relativos al movimiento de
hacer el gesto. Finalmente, ya que es difícil evaluar cualitativamente estos últimos datos
adquiridos, se propone aplicarlos a un modelo virtual de mano mediante librerías gráficas 3D
Open Inventor, y así visualizar en 3D el mismo movimiento de cada uno de los gestos de la
mano captados con la cámara.
En el capítulo 2, se plantean los objetivos particulares de este trabajo, que consisten
en validar los métodos y herramientas para la implementación de este sistema.
En el siguiente capítulo se explica en el estado del arte, por un lado, las dificultades y
soluciones a la hora de usar la visión artificial como una solución alternativa de interacción
hombre computadora de no contacto, y por otro, las aportaciones de algunos autores en el
campo de la detección de manos y el reconocimiento de gestos, así como sus principales
ejemplos.
A partir de aquí comienzan los capítulos de estudio previo del trabajo como criterios
de partida suficientes para implementar la parte de desarrollo.
Adquisición de puntos
Reducción de puntos
Segmentación interactiva de
puntosICP
Reproducción 3D
11
El capítulo 4 presenta la cámara de tiempo de vuelo SwissRanger™ SR-3000 como un
dispositivo de entrada de imágenes en 3D para el sistema planteado, que por un lado nos da la
ventaja de funcionar en tiempo real, pero con el handicap de operar a baja resolución y la
adición de ruido. El resultado de las imágenes que proporciona son nubes de puntos 3D o
datos en forma de coordenadas X, Y, Z.
En el siguiente capítulo, se describe el modelo cinemático de la mano y también se
plantea un modelo virtual de mano en 3D modelado con cilindros, así como sus grados de
libertad y sus restricciones con el que se pretende representar la salida del sistema.
En el capítulo 6, se explica el principio de funcionamiento del código ICP, como una de
las etapas más importantes del sistema planteado. Esta etapa permite encajar dos imágenes
consecutivas y que están parcialmente superpuestas, por ejemplo, desde la secuencia de
imágenes captada con la SR-3000 para realizar el gesto. Para ello, primero se busca la
correspondencia entre los puntos de dos imágenes consecutivas, y luego se va minimizando
iterativamente la distancia de separación entre ambas, hasta conseguir su alineación. El
resultado es una matriz homogénea, o bien, un vector de posición y orientación, que indica el
desplazamiento de una imagen a su consecutiva.
Aquí finaliza la parte de estudio previo y comienza el capítulo 7, correspondiente a la
parte de desarrollo, en donde se explica la implementación de las etapas del sistema diseñado.
Para ello, se procede a realizar una serie de experimentos, en el que cada uno representa el
movimiento de hacer un gesto manual sencillo, a partir de una secuencia de imágenes 3D
tomadas con la cámara. Cada una de las imágenes de su respectiva secuencia, pasa
independientemente por una cadena de procesos de un algoritmo programado en Matlab,
empezando por la adquisición de la secuencia de imágenes, que son guardadas como
estructuras de datos independientes. Seguidamente, se aplica una reducción de los puntos
totales de cada nube, por un lado para acelerar la velocidad del algoritmo, y por otro, para
eliminar los puntos generados por la cámara como ruidosos. A continuación, se aplica la
segmentación interactiva (sólo en los dos últimos experimentos) de los puntos que son objeto
de estudio del experimento. Finalmente, se aplica la etapa de ICP para emparejar la primera
imagen con la segunda, la segunda con la tercera, y así sucesivamente hasta llegar a la última
imagen de la secuencia.
Con los datos resultantes de la última etapa del algoritmo, por un lado se visualiza el
movimiento de hacer el gesto en forma de nubes con menos densidad de puntos y, por otro
lado, se obtienen las transformaciones que indican el desplazamiento de cada imagen a su
consecutiva. Finalmente, se aplican estos parámetros obtenidos al modelo cilíndrico de mano
propuesto en el capítulo 5, para reproducir el mismo movimiento de hacer el gesto que se ha
captado previamente en forma de nubes de puntos, y ver si la comparación es plausible.
Aquí finaliza la parte de desarrollo y comienzan los capítulos de resultados,
conclusiones y trabajo futuro, donde se presentan y explican los resultados experimentales
producto de las fases del algoritmo, las conclusiones y cómo podría llegar a mejorar el
proyecto a partir de sus limitaciones.
12
Capítulo 2
OBJETIVOS
Este trabajo final de carrera tiene una parte teórica, perteneciente a la parte de estudio previo,
y un trabajo de desarrollo, relativo a la descripción de la implementación.
Los objetivos de la parte teórica se dividen en dos partes:
Evaluar si la cámara de tiempo de vuelo es una alternativa válida para la detección de
las manos como dispositivo de extracción de información 3D.
Comprobar si los resultados obtenidos de aplicar el algoritmo que se propondrá para
el procesamiento de los datos 3D son válidos para poder ser aplicados en futuras
mejoras para el reconocimiento de los gestos manuales.
Del mismo modo, los objetivos de la parte práctica:
La implementación de un código de demostración en Matlab que pone en
correspondencia dos imágenes consecutivas parcialmente superpuestas a partir de
una secuencia de nubes de puntos captadas con la cámara.
Reproducción de la secuencia de movimiento con un modelo geométrico de mano
implementado mediante librerías gráficas 3D, a partir de las transformaciones
obtenidas con las nubes de puntos.
13
PARTE I
Estudio previo
14
Capítulo 3
ESTADO DEL ARTE
El eje vertebral de esta sección se encamina a mostrar el empleo directo de la mano
como un dispositivo de entrada para proporcionar una HCI (Human Computer Interaction o
Interacción Hombre Computadora) natural de no contacto.
Actualmente, los dispositivos más eficaces para medir el movimiento de la mano son
unos dispositivos de detección electromecánicos o magnéticos equipados en la mano [1], es
decir, unos guantes con sensores para medir sus parámetros cinemáticos, tales como la
posición de la mano y/o los ángulos de las articulaciones de los dedos. Los datos generados por
estos dispositivos pueden ser procesados fácilmente ya que se extrae el movimiento articulado
de la mano, por ejemplo, la ubicación de las yemas de los dedos, la dirección de señalización, o
la fuerza generada en un dedo. Así, se importa toda su funcionalidad para ser interpretada por
la aplicación en un entorno de interacción HC, tal y como se muestra en la Figura 3.1.
Figura 3.1: Guante con sensores conectado a un simulador de mano mecánica usado para el
procedimiento de adquisición de datos.
15
Sin embargo, estos dispositivos tienen varias desventajas, como su precio, que
dificultan la facilidad y la naturalidad del movimiento de la mano con la que el usuario puede
actuar recíprocamente con el entorno controlado por computadora, y que requieren una
calibración compleja y procedimientos de montaje para ser capaces de obtener medidas
exactas. A pesar de estos problemas, estos dispositivos de entrada proporcionan el conjunto
de mediciones más completo en tiempo real, como aplicación independiente.
En cambio, la visión artificial tiene el potencial para proporcionar una interacción
mucho más natural, sin limitaciones y de no contacto. Por consiguiente, han habido esfuerzos
considerables en investigación para usar la mano como un dispositivo de entrada para
recuperar su postura 3D y la de los dedos tal y como lo hacen los dispositivos basados en
guantes pero de manera no invasiva. Sin embargo, como la mano es un objeto flexible, su
proyección causa una gran variedad de formas con muchas autooclusiones, haciéndolo un
problema computacionalmente intenso, ya que los sistemas basados en visión artificial no
tienen mucho en común con los basados en guantes. Sin embargo, hay varias buenas razones
para abordar este problema. La más importante, la estimación de su postura completa es
obligatoria para aplicaciones de entornos virtuales avanzados, como por ejemplo, sistemas de
aprendizaje de habilidades.
A pesar de que existen prototipos de sistema en tiempo real, como un motor de
reconocimiento de gestos, y varias documentaciones sobre el modelado de la mano, la
estimación de su postura y el reconocimiento de gestos, ninguna de estas revisiones aborda el
problema de la estimación del movimiento completo en detalle, ya que todavía hay una
necesidad en extraer señales continuas de movimiento en 3D que conduzcan a elementos de
interfaz dinámicos virtuales como por ejemplo la autocopia virtual de la mano.
16
3.1 DIFICULTADES Y SOLUCIONES
En este apartado, primero citamos algunas dificultades considerables asociadas con el
problema de la estimación de la postura de la mano mediante la visión artificial, y
posteriormente, hablamos de las restricciones aplicadas sobre el usuario o el entorno para
paliar algunas de ellas.
Las dificultades principales encontradas en el diseño de sistemas de estimación de la postura
de la mano incluyen:
Problema dimensional alto: La mano es un objeto articulado con más de 20 DOF (Degrees of Freedom o grados de libertad). Aunque el movimiento natural de la mano no tenga 20 DOF debido a las interdependencias entre los dedos, los estudios han mostrado que no es posible usar menos de seis dimensiones. Junto con la posición y la orientación de la mano por sí sola, todavía existe un gran número de parámetros para ser calculados.
Autooclusiones: Ya que la mano es un objeto articulado, su proyección causa una gran variedad de formas con muchas autooclusiones, haciendo difícil de segmentar las diferentes partes de la mano y extraer rasgos de alto nivel.
Velocidad de procesamiento: Incluso para una secuencia de una sola imagen, un sistema de visión artificial en tiempo real tiene que procesar una enorme cantidad de datos. Con la tecnología de hardware actual, algunos algoritmos existentes requieren un hardware dedicado, caro, y posiblemente con capacidades de procesamiento paralelos para funcionar en tiempo real.
Entornos no controlados: Para un empleo extendido, en muchos sistemas de IHC se esperaría funcionar en escenarios no restringidos y con una amplia gama de condiciones de alumbrado. Por otra parte, aún localizando un objeto rígido en un fondo arbitrario casi siempre es un tema desafiante en la visión artificial.
Movimiento rápido de la mano: La mano tiene capacidades de movimiento muy rápidas con una velocidad que alcanza hasta los 5 m/s para la traslación y 300°/s para la rotación de la muñeca. Actualmente, las cámaras comerciales generalmente pueden admitir tasas de imagen a 30-60Hz. Además, para muchos algoritmos es bastante difícil alcanzar una velocidad de tracking a 30Hz. De hecho, la combinación del movimiento de la mano a alta velocidad con bajos índices de muestreo, introduce dificultades suplementarias para algoritmos de tracking (p. ej., las imágenes en frames consecutivos se hacen cada vez más y más incorrelacionadas con la velocidad creciente del movimiento de la mano).
17
Ya que es difícil de satisfacer simultáneamente todos los aspectos citados más arriba,
algunos estudios sobre la estimación de la postura de la mano aplican restricciones contra el
usuario o el ambiente. Por ejemplo, por lo general se asume que el fondo es uniforme o
estático y que la mano es el único objeto de piel coloreada. Sin embargo, tales restricciones no
pueden ser aplicables en muchos sistemas en la vida real. Aunque, a menudo sea aceptable
pedir a los usuarios evitar movimientos rápidos de la mano, hay algunas aplicaciones que no
pueden tolerar una baja velocidad de tracking.
La solución a los dos primeros desafíos catalogados más arriba requiere la restricción
del movimiento de la mano, que es más difícil de justificar. Un motivo para restringir la postura
es para reducir al mínimo las oclusiones. La restricción más común está en imponer que la
palma de la mano es paralela al plano de imagen. El motivo es para evitar rotaciones fuera de
plano que hacen que los dedos se oculten los unos a los otros. En sistemas de una sola cámara,
tal restricción conduce a la interacción planteada.
Las restricciones de postura también pueden ser aplicadas para reducir la dimensión
del problema explotando estilos de interacción que combinan primitivas de movimiento con
bajo DOF para desempeñar tareas complejas. En este caso, se hace posible abordar el
problema de la estimación de la postura con algoritmos dedicados, orientados a objeto,
basados en el aspecto. Algoritmos de estimación de postura con total DOF pueden ser
adaptados a estos interfaces simplemente fijando algunos DOF, alcanzando de ese modo una
velocidad de procesamiento más rápida. Sin embargo, la existencia de muchas aplicaciones y
estilos de interacción que confían en el movimiento de la mano sin restricciones también
debería ser considerada.
18
3.2 REVISIÓN DE LAS TÉCNICAS ACTUALES
En este apartado se revisan algunas aportaciones de varios autores en el campo de la
detección de manos y el reconocimiento de gestos en el marco de la visión artificial, en las que
se destaca la extracción del color, del aspecto y de la profundidad.
En [2], usan una cámara de tiempo de vuelo PMD para la segmentaión de la mano y un
algoritmo para la clasificación de los gestos mediante una proyección de la misma sobre los
ejes X e Y, teniendo en cuenta puntos significativos, como el más a la derecha y el más alto. La
Figura 3.2 muestra un ejemplo donde se ve dicha proyección, además de la corrección que
realizan para evitar la aparición del antebrazo, asumiendo para ello una longitud media de la
mano. A pesar de que la cámara de profundidad opere a baja resolución y que el algoritmo
confunda algunos gestos que sean muy similares a otros, es una tecnología válida para que el
sistema sea capaz de reconocer un vocabulario de 12 gestos en tiempo real con una tasa de
acierto del 94.61%.
Figura 3.2: Proyección de los ejes X e Y en una mano segmentada.
Otra forma para reconocer los gestos de la mano la encontramos en [3], donde
presentan un sistema para interpretar la Lengua de Signos Polaca (LSP) mediante el
reconocimiento de patrones. Para ello, usan una solución basada en la detección de puntos
característicos de la mano para detectar el contorno a partir de los segmentos, luego etiquetan
los vértices del polígono según su orientación y posteriormente, los unen mediante diagramas
en árbol. Esta aproximación puede verse en la Figura 3.3. En los resultados experimentales
obtienen una tasa de acierto del 94.3%, aunque el sistema puede confundir algunos signos
estructuralmente muy parecidos.
19
Figura 3.3: Detección del contorno e indexación de los nodos.
En [4] presentan un método para interpretar la Lengua de Signos Japonesa (LSJ), donde
identifican por separado las manos, la cara, la ropa y la posición de los codos mediante la
extracción de sus respectivos colores. Si en el plano de imagen las manos quedan superpuestas
al rostro, o bien, una mano queda superpuesta a otra mano, utilizan el Modelo Oculto de
Márkov (HMM o Hidden Markov Model), para determinar los parámetros que han quedado
ocultos a partir de los parámetros observables en la imagen anterior. Este resultado se aprecia
en la Figura 3.4. Por otro lado, obtienen la silueta de la mano como una función de la distancia
del contorno a la base, y la orientación de la muñeca la determinan a partir de la posición de
los codos, como podemos ver en la Figura 3.5. El sistema puede reconocer 65 palabras de la
LSJ con imágenes reales tomadas desde una cámara fija y bajo un fondo de escena complejo.
20
Figura 3.4: Ejemplo de los resultados de extraer las regiones pertenecientes al color de la
piel. La región de búsqueda de las manos son cuadriláteras, mientras que el centro de la
cara, de las manos y las posiciones de los codos son cruces.
Figura 3.5: Extracción de características de la mano.
En [5] se presenta un sistema que reconoce los gestos de la mano a 2-3 Hz, donde
encajan un modelo realístico de mano a una nube de puntos captada con una cámara de
profundidad SR2000, como podemos apreciar en la Figura 3.6. Para ajustar el modelo de mano
a la nube de puntos, primero reducen el ruido generado por la cámara con la función median
filter y posteriormente, segmentan el brazo y la mano del fondo de la escena definiendo un
rango de profundidad. Finalmente emplean un algoritmo que minimiza iterativamente las
distancias entre los puntos extraídos de la cámara y los puntos de la superficie del modelo. A
21
pesar de que el sistema no trabaja en tiempo real y tampoco es capaz de abordar el problema
de las autooclusiones, es capaz de reconocer 7 DOF: 3 para la rotación, 3 para la traslación y 1
para escalado, sin la necesidad de tener un fondo de escena determinado, incluso para un
fondo con el mismo color de la piel.
Figura 3.6: Movimiento de un modelo realístico de mano ajustado a una nube de puntos.
En [6] usan un modelo de mano basado en una geometría proyectiva de cuádricas, tal
y como se muestra en la Figura 3.7, para generar los contornos, que luego son comparados con
las imágenes de entrada, obteniendo buenos resultados a la hora de abordar el problema de
las autooclusiones. Luego, emplean un algoritmo que minimiza el error geométrico de los
contornos extraídos de las imágenes de entrada. A pesar de que el sistema no trabaja en
tiempo real y de que las imágenes se extraigan bajo un fondo oscuro, es capaz de reconocer 27
DOF: 6 para la posición global de la mano, 4 para la posición de cada dedo, y 5 para la posición
del pulgar, mediante 2 cámaras que captan imágenes en escala de grises. En la Figura 3.8 se
muestra un ejemplo de como una mano se mueve haciendo el gesto de apuntar como una
pistola, y el sistema hace el tracking dando la mejor estimación según el modelo de cuádricas.
En ella se observa una estimación presisa de la posición y la orientación 3D del modelo y
también se observa una configuración precisa del pulgar.
22
Figura 3.7: Modelo de mano de 27 DOF basado en cuádricas para tratar las autooclusiones.
Figura 3.8: Ejemplo del tracking de una mano apuntando. Proyección de la mano desde las
cámaras 1 y 2 respectivamente (arriba y centro) y su correspondiente pose en 3D (abajo).
23
En [7] aplican a un modelo de mano una combinación de modelos de fuerzas, para los
bordes, el flujo óptico y el sombreado, tal y como se muestra en la Figura 3.9. Combinando el
flujo óptico y el flujo del sombreado, hacen el tracking del movimiento articulado cuando hay
zonas sombreadas y, combinando el flujo óptico con los contornos, corrigen los errores
causados por el brillo. Luego calculan las fuerzas 2D de los contornos, del flujo óptico y del
sombreado y las aplican al modelo para convertirlas a fuerzas 3D que permitan conducir el
modelo de mano. De este modo consiguen un tracking del movimiento articulado de la mano a
partir de una sóla cámara, obteniendo un resultado exitoso bajo oclusiones severas. El
resultado se muestra en la Figura 3.10.
Figura 3.9: Fuerzas aplicadas al modelo de mano. De izquierda a derecha: contorno, flujo
óptico y sombreado.
Figura 3.10: Resultados de un tracking bajo una considerable cantidad de oclusiones y
rotaciones fuera de plano.
24
Capítulo 4
LA CÁMARA DE TIEMPO DE VUELO SWISSRANGER™ SR-3000
En este capítulo se presenta la cámara SwissRanger™ SR-3000 como dispoitivo de
entrada para el sistema representado en el capítulo 1. Esta cámara funciona por medio de una
tecnología innovadora que puede ser el futuro de muchas aplicaciones informáticas conocida
como ToF (Time-of-Flight o tiempo de vuelo) y que representa una forma de captar el medio
de forma tridimensional a través de LEDs instalados en la cámara, como se indica en [28].
La SR-3000 (Figura 4.1) es la penúltima generación de cámaras ToF del fabricante
MESA Imaging AG1 y consiste en un sistema óptico de imágenes que ofrece imágenes en escala
de grises (intensidad) y datos en 3D (información de profundidad) en tiempo real, al estilo de
la estereovisión y los escáneres láser, pero más económica y adaptable gracias a su reducido
tamaño y bajo consumo energético. Un ejemplo de las imágenes generadas se muestra en la
Figura 4.2 y en la Figura 4.3.
Figura 4.1: Cámara SR-3000 de Mesa Imaging.
1 http://www.mesa-imaging.ch/
25
Figura 4.2: Imagen en escala de grises.
Figura 4.3: Imagen en nube de puntos.
26
Basado en el principio de funcionamiento del tiempo de vuelo, los LEDs de la cámara
emiten un haz de luz en forma de onda sinusoidal periódica, en el espectro infrarrojo para que
sea posible distinguirlo de la luz de fondo y modulada en intensidad. Esta señal incide sobre los
objetos en la escena y vuelve rebotada a la cámara, que habrá experimentado un retardo
dependiendo de la distancia a la que se encuentren los objetos en forma de señal reflejada,
donde el tiempo exacto de llegada es calculado independientemente por cada pixel de la
matriz del sensor.
Cada píxel de la cámara puede desmodular esta señal, y a través de su fase se detecta
la distancia, es decir, con el tiempo transcurrido entre la emisión y la recepción de este
impulso, se detecta la distancia comparando las fases de la luz emitida y reflejada, y la cámara
genera una imagen en escala de grises que nos da la información de profundidad.
Todos estos píxeles captan individualmente la intensidad, la amplitud y la fase del
impulso infrarrojo. Si tenemos los valores intrínsecos de la cámara (distancia focal,
distorsiones, etc.) es posible calcular estas coordenadas 3D. De esta forma obtenemos un
conjunto de puntos clave formando un mapa de rangos de profundidad y otra de intensidades
para cada píxel de la matriz.
Esta cámara de MESA es capaz de crear imágenes 3D en tiempo real, con un frame
rate de 25 imágenes por segundo, con una resolución de 176 x 144 = 25344 pixeles, y un
campo de visión de 47.5° x 39.6°. La SR-3000 tiene unas dimensiones reducidas de 5.0 x 6.7 x
4.23 cm³ e incluye prestaciones tales como la supresión de iluminación de fondo, y definir el
usuario los parámetros del tiempo de integración y del frame rate. Con la configuración por
defecto, esta cámara trabaja con una frecuencia de modulación estándar a 20MHz lo que da
un rango de distancia sin ambigüedad de 7.5 metros:
La SR-3000 ofrece una variedad de imágenes para cualquier aplicación. Este dispositivo
se conecta fácilmente a cualquier ordenador por puerto USB 2.0, permitiendo así el cálculo de
mapas de profundidad en tiempo real en forma de nubes de puntos. Este dispositivo está
especialmente diseñado para trabajar bajo unas condiciones de luz en espacios cerrados, y se
acompaña con un software completo de visualización en plataforma Windows.
27
4.1 DISCUSIÓN TECNOLÓGICA
Según el fabricante, la precisión de la captura en profundidad es del 1%, es decir, para
imágenes captadas con esta cámara a menos de 1 metro, el error en la profundidad es de
±1cm, que dependerá de la reflectividad de los objetos. Medir cualitativamente el error en la
profundidad es un motivo de estudio interesante, ya que permitiría saber cuál es la distancia
ideal para tomar imágenes respecto a la cámara.
A continuación se muestra en la Tabla 4.1 el resumen estadístico de un experimento
en la que se han captado 50 imágenes consecutivas de la palma de la mano, desde los 30 cm
hasta los 100 cm respecto a la cámara, en intervalos de 5 cm. A cada intervalo de distancia,
cada una de estas 50 imágenes ha pasado por un proceso de reducción de puntos hasta
obtener una cantidad de puntos que definan la silueta morfológica de la mano fotografiada en
anchura, en altura y en profundidad. El objetivo del experimento realizado es para saber por
un lado, cómo se verá la mano a diferentes distancias calculando la densidad de puntos
captados, y por otro lado, para discutir la exactitud de la profundidad detectada mediante su
media aritmética y su desviación estándar.
En ella se aprecia que a distancias menores de 35 cm no es aconsejable tomar
muestras, ya que la cámara se satura añadiendo puntos no deseados tal y como se aprecia en
la nube de puntos correspondiente a la distancia de 30 cm, mientras que a medida que se van
tomando muestras a distancias de más de 50 cm se aprecia que las imágenes se van
degradando resultado de perder cada vez más puntos de sus respectivas nubes. También se
aprecia que la exactitud de la profundidad se desvía en más o menos unos 5 cm de más a
medida que se aumenta la distancia. También se observa que tomar imágenes en el rango de
35 cm a 50 cm es la distancia óptima de la mano repecto a la cámara, ya que en ese intervalo
la media aritmética de la profundidad se aproxima más a la real, tiene menos grado de
dispersión, y la cantidad de puntos son significativos para definir la silueta morfológica de una
mano.
Finalmente, se concluye por un lado, que tomar imágenes con una gran cantidad de
puntos captados no es deseable porque gran parte de ellos serían innecesarios debido al ruido
que añade la cámara, y por otro lado, que un número pequeño de puntos tampoco es desable,
porque si se omiten los puntos mínimos necesarios a la hora de definir la silueta del objeto en
la escena, las imágenes se degradan dando como resultado datos poco consistentes.
28
NÚMERO DE IMÁGENES
DISTANCIA DE LA
MANO RESPECTO EL SENSOR
DE LA CÁMARA (en cm)
MEDIA
ARITMÉTICA DEL NÚMERO DE PUNTOS
RESULTANTES DESPUÉS DE
FILTRAR*
MEDIA
ARITMÉTICA DE LA
PROFUNDIDAD Z
(en cm)
DESVIACIÓN TÍPICA DE LA
PROFUNDIDAD Z
(en cm)
NUBE DE PUNTOS 3D
RESULTANTES DESPUÉS DE
FILTRAR*
VISTA EN X-Y
NUBE DE PUNTOS 3D
RESULTANTES DESPUÉS DE FILTRAR*
VISTA EN X-Z
NUBE DE PUNTOS 3D
RESULTANTES DESPUÉS DE FILTRAR*
VISTA EN Y-Z
IMAGEN 2D EN COLOR
50
30
7605.0
33.44
0.88
50
35
5473.9
36.45
0.87
50
40
4153.6
41.05
1.01
50
45
3155.9
47.29
1.01
29
50
50
2545.2
53.69
1.23
50
55
2212.7
59.99
1.37
50
60
1736.7
65.64
1.13
50
65
1411.8
71.94
1.01
50
70
1297.4
76.16
1.33
50
75
1015.2
80.67
0.79
30
50
80
946.14
85.36
1.13
50
85
815.12
90.67
1.23
50
90
754.74
94.89
1.38
50
95
647.46
100.84
1.36
50
100
595.86
102.56
1.66
Tabla 4.1: Número de puntos resultantes, media aritmética y desviación estándar para una secuencia de 50 imágenes tomadas en intervalos de 5 cm.
*El filtrado se realiza definiendo los límites superiores e inferiores en X, en Y y en Z de una Bounding Box que envuelve la nube de puntos pertenecientes a la
silueta de la mano.
31
4.2 APLICACIONES
Esta tecnología permite vislumbrar una nueva época en la HCI (Human-Computer
Interaction o interacción entre humano y computadora) de no contacto. Hoy en día, con el
desarrollo y el éxito de las cámaras 3D, se están creando y aplicando nuevos sistemas para
explotar al máximo esta tecnología, a menudo en combinación con otros sensores, como los
sensores laser o las cámaras en color para contrarestar la baja resolución de las cámaras ToF.
Entre las aplicaciones más destacadas según el escenario de aplicación, figuran los videojuegos
interactivos, la navegación en robots móviles, el reconocimiento de gestos, la biometría y la
automoción.
El sector del automóvil es una de las industrias que están liderando la manera de
desarrollar las cámaras ToF. Entre sus aplicaciones están la seguridad de los ocupantes del
vehículo y la de los peatones. En [8] si la cámara detecta peatones que están a una distancia
determinada del vehículo, este activa un mecanismo de parada automática como sistema anti-
choque, o bien sirve como ayuda para estacionar el vehículo. Por otro lado, mediante un
sistema de monitorización de los ocupantes del vehículo, se determina si se activa o desactiva
el despliegue del airbag. Un ejemplo de esta aplicación se muestra en la Figura 4.4.
Figura 4.4: Visualización de los objetos a un rango de distancia de la cámara de abordo.
Otro ejemplo de aplicación en la industria del automóvil y que podria ser útil a una
gran cantidad de usuarios también la encontramos mencionada en [8], donde una cámara ToF
PMD se utiliza en el interior de un coche para controlar distintas aplicaciones mediante el
reconocimiento de gestos, tal y como muestra la Figura 4.5.
En la navegación con robots móviles, las cámaras ToF son útiles debido a que su campo
de visión es vertical, mientras que el área de detección en los sensores láser es horizontal. Esta
asociación permite esquivar obstáculos complejos, como por ejemplo una mesa, y de este
modo el sistema es útil como aplicación para sistemas de guía y vigilancia en áreas urbanas.
Esta aplicación se da en [9] y se muestra en la Figura 4.6, donde Yuan et al. integran los datos
obtenidos del laser proyectando las nubes de puntos de una cámara ToF al plano laser.
32
Figura 4.5: Reconocimiento gestual mediante un sistema de visión ToF PMD para automóvil.
Figura 4.6: Imágenes obtenidas de un sensor laser LSM y de una cámara TOF SR-3000
montados sobre un robot BIRON.
33
Dentro de la industria del ocio y el entretenimiento, en particular las empresas
punteras en el campo de los videojuegos, están aprovechando este tipo de cámaras para crear
un mercado cada vez más en auge. Un ejemplo de aplicación empresarial está en las cámaras
con capacidad de captar el movimiento de la persona a través de un sensor que envía impulsos
infrarrojos para detectar los puntos clave y reconocer las partes importantes del cuerpo. Con
esto es posible crear un personaje ficticio que imite los movimientos que el usuario haga
delante del televisor. Compañías punteras en este mercado, como Nintendo, Sony o Microsoft,
han presentado estos nuevos modos de interacción con sus videoconsolas: Nintendo con su
consola Wii1, Sony con su PlayStation-Eye2 y Microsoft con su Kinect3. Un ejemplo de
videojuego se muestra en la Figura 4.7, en el que científicos de la Universidad Carlos III de
Madrid, lo manejan simplemente con el movimiento de las manos, como si se estuvieran
agarrando un volante virtual con la que capturan en 3D los movimientos del usuario para
después poder transmitirlos a un ordenador, que los procesa y transmite al coche del juego.
Figura 4.7: Infografía sobre el funcionamiento de la cámara de tiempo de vuelo en un
videojuego de conducción.
1 http://es.wii.com/ 2 http://es.playstation.com/psmove/ 3 http://www.xbox.com/es-ES/kinect/
34
La Biometría es la ciencia que estudia la identificación y verificación de rasgos o
características físicas e intransferibles de las personas, como por ejemplo la huella digital. Las
cámaras ToF pueden ayudar en esta área capturando la estructura facial en tres dimensiones
de los individuos, para posteriormente ser verificados en un sistema. En [10] un ejemplo en la
biometría es el reconocimiento facial o podal tal y como se muestra en la Figura 4.8, donde el
mapa de profundidad es codificado en intensidad y cuantificado con la barra de color. Con la
combinación de una imagen en escala de grises y la información 3D que proporcionan las
cámaras ToF, se incrementa significativamente la robustez en la detección. En el escaneo de la
planta del pie, se aprovecha la información conjunta para desarrollar plantillas ortopédicas.
Figura 4.8: Adquisición 3D de un pie y un rostro mediante una cámara ToF.
Como último ejemplo de aplicación destacada, en [11] Knoop et al. hablan sobre un
método de tracking para la captura del movimiento humano en tiempo real, llamado algoritmo
de fusión VooDoo1. Este método se basa en un modelo 3D de un cuerpo humano que utiliza la
información de profundidad de la cámara de tiempo de vuelo en combinación con una cámara
stereo 2D. De manera similar a las cámaras de las videoconsolas antes mencionadas, ellos se
basan en un modelo de cuerpo humano en 3D, formado por cilindros, que imita los
movimientos que el usuario haga delante de las cámaras. Estos cilindros representan a la
cabeza, el tronco y las extremidades y están empalmados con diferentes modelos de
articulaciones por medio de bandas elásticas y que determinan sus restricciones. La idea
principal es que la nube de puntos que proporciona la cámara ToF y los cilindros que forman el
modelo están cerca, de manera que encuentran una transformación, que ajusta los cilindros a
los puntos de la nube, tal y como se muestra en la Figura 4.9.
1 http://wwwiaim.ira.uka.de/users/loesch/har/
35
Figura 4.9: Las líneas indican la proximidad entre los puntos y los cilindros. Este aspecto ha
motivado a que el sistema reciba el nombre de VooDoo.
Gracias al cabezal stereo 2D extraen el color de la piel de las manos y del rostro. Esta
característica puesta en correspondencia con las imágenes en 3D proporcionan los resultados
esperados tal y como se muestra en la Figura 4.10.
Figura 4.10: Experimentos tomados con diferentes sensores. La extracción del color de la piel
se observa mediante las líneas verdes. Si se ponen en correspondencia con las imágenes en
3D se obtienen los resultados de la fusión.
En definitiva, los puntos fuertes de estas cámaras es que trabajan con un alto frame
rate, se pueden aplicar a dispositivos móviles para la obtención de mapas 3D, y se pueden
combinar con otros sensores para paliar su baja resolución. En cambio, sus desventajas son
que añade ruido en la profundidad, y hay que aplicar métodos de calibración para corregir la
inexactitud de estas imágenes de profundidad.
36
Capítulo 5
MODELADO DE LA MANO
En este capítulo, primero se describe la estructura ósea de una mano humana.
Conociendo su estructura, se puede parametrizar su movimiento mediante su modelo
cinemático, y posteriormente, aplicarlo a un modelo de mano en 3D que será la salida del
sistema definido en el capítulo 1.
5.1 MODELO CINEMÁTICO
El modelo cinemático representa el movimiento del esqueleto de la mano. Los huesos
de la mano forman un sistema de cuerpos rígidos, unidos por articulaciones con uno o varios
grados de libertad y consta de 27 huesos, 8 de los cuales están localizados en la muñeca. Los
otros 19 constituyen la palma y los dedos como se muestra en la Figura 5.1. Las articulaciones
entre los huesos son denominados según su posición en la mano, como metacarpo falanges
(MCP), es decir, la unión de los dedos a la palma o los nudillos; inter falanges (IP), es decir, las
articulaciones de los segmentos de los dedos; y carpo metacarpo (CMC), es decir, la unión de
los huesos metacarpos, los de la palma a la muñeca.
Figura 5.1: Modelo esquelético de la mano.
37
Las nueve articulaciones IP pueden ser descritas con exactitud teniendo sólo 1 DOF, la
flexión/extensión. Excluyendo la articulación MCP del pulgar, las otras cuatro articulaciones
MCP son descritas como articulaciones con 2 DOF: abducción/adducción en el plano definido
por la palma, y la flexión/extensión. El CMC del índice y dedo medio son estáticos mientras el
CMC del meñique y el dedo anular tienen limitados la capacidad de movimiento que refleja el
plegado de palma o la encorvadura, lo que a menudo es descartada dando lugar a una palma
rígida. El TM que es la principal fuente de flexibilidad del pulgar, y el MCP de este, se
consideran articulaciones con 2 DOF: la abducción/adducción y la oposición.
Un modelo de 27 DOF que fue presentado en [12] y que ha sido usado en muchos
estudios se muestra en la Figura 5.2. Este modelo cinemático es la opción más natural para
parametrizar el movimiento de la mano. Las articulaciones CMC se suponen fijas, que siendo
bastante irrealistas modelan la palma como un cuerpo rígido, y los dedos, son modelados
como cadenas de cinemática planas sucesivas conectadas a la palma en puntos de anclaje
localizadas en las articulaciones MCP. Sin embargo, en algunos estudios biomecánicos se
muestran algunos ejemplos de las variaciones del modelo cinemático. Por ejemplo en [13],[14]
añaden un movimiento de giro suplementario a las uniones MCP, en [15] introducen 1 DOF
flexión/extensión a las articulaciones CMC, y en [16] usan una articulación esférica para el TM.
Figura 5.2: Modelo cinemático de la mano.
Los sistemas de estimación de la postura de la mano con grados de libertad totales, a
priori cuentan con información sobre la postura de la mano o las restricciones del movimiento,
para así reducir el espacio de búsqueda en la estimación de la postura. Una tentativa que
puede ayudar a plantear algoritmos de estimación de la postura consiste en restringir las
dependencias de los ángulos de las articulaciones, como por ejemplo la relación
entre los ángulos PIP y DIP que ayudan a disminuir los DOF en 4.
38
5.2 MODELO CILÍNDRICO
Ahora que ya se ha parametrizado el movimiento de la mano es necesario definir su
aspecto para poder generar formas en configuraciones arbitrarias. Hay que destacar por un
lado, que en los sistemas de estimación de la postura de la mano que cuentan con modelos de
formas, si la precisión es una exigencia para la aplicación, estos modelos tienen que pasar por
un procedimiento de calibración para calcular medidas específicas del usuario. Por ejemplo en
[17], usan las posiciones de las yemas de los dedos adquiridas mediante una cámara stereo y
unos marcadores LED para calibrar un cyberglove que sirve para teleoperar un modelo
mecánico de mano. Por otro lado, en muchos estudios con visión artificial el modelo de mano
tiene que estar emparejado con la imagen de entrada para poder obtener comparaciones. Este
problema ha motivado el diseño de modelos improvisados mediante primitivas geométricas
simples como cilindros, esferas o elipsoides conectados a cada articulación del esqueleto de la
mano.
En este apartado usaremos un modelo cilíndrico inspirado en el trabajo de Knoop et al.
[11] donde el modelo de articulación está basado en el concepto de empalmar los cilindros
que forman un modelo de cuerpo humano 3D mediante unas bandas elásticas. Cada tipo de
articulación define sus restricciones o sus grados de libertad y se modelan como
correspondencias artificiales en ambas partes de los cilindros. De este modo queda definido el
movimiento dentro del modelo. Ellos describen tres tipos de modelos de articulaciones para
hacer el tracking, tal y como se muestra en la Figura 5.3:
Articulaciones Universales: tienen 3 DOF totales, como por ejemplo el hombro humano. Las articulaciones universales están modeladas mediante una correspondencia punto a punto (una banda elástica).
Articulaciones Bisagra: tienen 1 DOF real y los otros están casi fijados, como por ejemplo el codo o la rodilla. Las articulaciones bisagra están modeladas por un conjunto de correspondencias que están distribuidas a lo largo de una línea recta.
Articulaciones Elípticas: tienen todos los DOF altamente restringidos. Un ejemplo en el cuerpo humano es el cuello: el movimiento es posible en los 3 DOF, pero muy limitado en rango. Las articulaciones elípticas están modeladas por un conjunto de correspondencias distribuidas a lo largo de la elipse.
Figura 5.3: Diferentes tipos de modelos de articulaciones. De izquierda a derecha: articulación universal, articulación bisagra y articulación elíptica.
39
A la hora de establecer los modelos de articulación para cada una de las articulaciones del modelo de mano, se decide usar el modelo de articulación bisagra sobre las articulaciones IP, DIP y PIP, ya que este modelo de articulación se ajusta a los grados de libertad reales de estas articulaciones. De este modo nos aseguramos de que las falanges unidas por este modelo de articulación no rotan sobre sí mismas y tampoco se flexionan y extienden en sentido inverso. Para el pulgar, se decide restringir la articulación MCP, y para la TM se decide usar un modelo de articulación esférica con 3 DOF tal y como sugieren en [18],[19]. Para las articulaciones MCP de las otras falanges también se decide usar este modelo de articulación esférica. El resultado de muestra en la Figura 5.4.
Figura 5.4: Modelos de articulaciones aplicados a un modelo cilíndrico de mano.
40
Capítulo 6
EL ALGORITMO ICP
El algoritmo ICP de Besl y McKay citado en [20], originalmente denominado Iterative Closest Point, aunque Iterative Corresponding Point quizás sea el término más correcto para esta abreviatura, es un método para emparejar dos imágenes parcialmente superpuestas, calculando la transformación rígida de una imagen respecto a otra imagen de referencia. Considerando una imagen como una nube de puntos 3D captada con la SR-3000, ICP pondrá en correspondencia una nube de puntos S con una nube de puntos de referencia S’. Este proceso se aprecia en la Figura 6.1. Un requisito previo muy importante sobre este algoritmo, es que las imágenes que se quieren emparejar han de estar parcialmente superpuestas, es decir, la separación entre las dos imágenes ha de ser muy pequeña, ya que sino, no hará una buena alineación.
Figura 6.1: Los puntos de S’ (en azul) se emparejan con los puntos más próximos de S (en
rojo). Los puntos de S se desplazan hacia S’ minimizando las distancias entre parejas de
puntos y el proceso se repite hasta llegar finalmente a la convergencia.
El algoritmo ICP se resume a grosso modo en tres etapas. Primero comienza con la etapa de correspondencia, en la que a partir de cada uno de los puntos de S’, se encuentran los puntos de S más próximos a S’, dando lugar a parejas de puntos. A continuación, en la etapa de registro, primero se calcula el error métrico entre las parejas de puntos halladas en la etapa anterior, y luego, se minimiza ese error mediante una transformación estimada. Finalmente, en la etapa de actualización, se desplaza la nube de puntos de S hacia la nube S’ una distancia óptima según la transformación estimada. Este proceso se repite iterativamente hasta conseguir la convergencia entre las dos nubes de puntos, o bien, hasta llegar a un número máximo de iteraciones.
Un ejemplo de aplicación de este algoritmo se da en la robótica móvil. En [21] Valencia et al. usan el algoritmo ICP de Besl y McKay para una aplicación de guía y vigilancia en la que obtienen mapas 3D de áreas urbanas para peatones mediante un robot que proporciona información 3D por laser. Desde la introducción de ICP por Besl y McKay, muchas variaciones han sido introducidas sobre el concepto básico de ICP. A lo largo de este capítulo clasificaremos algunas de esas variaciones según a cuál de las 3 etapas del algoritmo afecten.
41
6.1 ETAPA DE CORRESPONDENCIA
Por un lado, hay que destacar que el algoritmo ICP original calculaba las correspondencias entre S’ y S asumiendo que el número de puntos totales de ambas nubes era el mismo, con lo cual, para cada punto de S’ había una sola correspondencia en S. Hay que mencionar que este no sería el caso de una aplicación real, ya que el número de puntos de una imagen 3D puede ser diferente a la otra imagen que queremos alinear. Por otro lado, hay que destacar que esta es la etapa que más tiempo consume de todo el algoritmo. Para acelerar la búsqueda de correspondencias, no es suficiente sólo con encontrar para cada punto de S’ el punto más próximo en S, sino que se trata de encontrar el punto compatible más próximo, usando algunos criterios de compatibilidad. De este modo, el algoritmo conseguirá una mayor estabilidad y una convergencia más rápida. Una estrategia para acelerar la búsqueda de correspondencias, como alternativa a la búsqueda por fuerza bruta (proceso por regla general muy lento), Nütcher et al. usa los kd-trees como una estructura de datos espacial, mediante una librería de objetos llamada Approximate Nearest Neighbour 1 (ANN) para encontrar los vecinos más próximos. Otra estrategia se da en [22], donde Turk y Levoy aplican un muestreo uniforme para reducir el número de puntos de una nube antes de buscar parejas en correspondencia, reduciéndose así el tiempo de búsqueda. También recomiendan rechazar todas las parejas de puntos que se encuentran en los cantos de una imagen, tal y como se aprecia en la Figura 6.2. Esta estrategia evita casos de emparejamientos erróneos mientras la superposición entre imágenes no esté completa.
Figura 6.2: (a) Cuando se quieren alinear dos nubes de puntos que no están completamente superpuestas (como en la mayoría de los casos reales), si se ponen en correspondencia los puntos que se encuentran en los bordes puede ocasionar un error en la alineación. (b) Rechazando los puntos de los bordes se eliminan muchas correspondencias incorrectas.
Otra estrategia para acelerar la búsqueda de correspondencias se da en [23], donde
Pulli propone limitar el ángulo entre las componentes normales de las parejas de puntos en
correspondencia, en concreto, que el ángulo entre el vector normal de un plano definido por
varios puntos vecinos de la nube S y el vector normal de un plano definido por varios puntos
vecinos de la nube S’, tiene que estar dentro de los 45° el uno del otro. De este modo se
acelera la convergencia entre imágenes.
1 http://www.cs.umd.edu/~mount/ANN/
42
6.2 ETAPA DE REGISTRO
El registro 3D es el proceso de alinear dos imágenes tomadas desde dos sistemas de
coordenadas diferentes, y en nuestro caso, las imágenes tomadas están referenciadas desde el
sistema de coordenadas local de la cámara ToF. Para alinear la nube de puntos S de la primera
imagen, con la nube de puntos S’ de la siguiente, que será la de referencia, primero habrá que
medir apropiadamente la proximidad entre los puntos de S que se han puesto en
correspondencia con los puntos de S’, llamado error métrico, y una vez calculado, se aplica la
minimización de este error a partir de la matriz de transformación estimada.
6.2.1 ASIGNACIÓN DE UN ERROR MÉTRICO
Para medir la proximidad entre parejas de puntos en correspondencia se puede establecer una asociación punto a punto y/o una asociación punto a plano.
En la asociación punto a punto, la distancia entre y
se puede calcular mediante la distancia Euclídea, como la raíz
cuadrada de la suma de las distancias de las parejas de puntos en correspondencia al cuadrado, o error métrico:
donde i es el subíndice que indica un punto en particular de su respectiva nube, y d es el
número máximo de puntos de cada nube.
Una variante de Chen y Medioni [24] propone usar distancias punto a plano en lugar de punto a punto (Figura 6.3). De este modo, se conseguirá minimizar iterativamente la distancia desde un punto de S hasta el plano que contiene el otro punto en S’ consiguiendo así, que esta métrica sea menos susceptible a mínimos locales que la métrica propuesta por Besl y McKey.
Figura 6.3: En superficies irregulares habrá una convergencia más rápida con una asociación punto a plano que con una asociación punto a punto, debido a que las parejas de puntos en las zonas planas resisten al deslizamiento creando un efecto muelle.
43
Para calcular el error métrico en la asociación punto a plano, se trata de encontrar el punto más próximo a un punto contenido en un plano. Para ello, en [25] Andrade-Cetto y Villamizar calculan el plano más próximo a encontrando primero la media de puntos vecinos de una nube y entonces, el plano que interpola la nube de puntos, quedaría representado por un punto central junto al vector unitario normal , tal y como se muestra en la Figura 6.4.
Figura 6.4: El plano que interpola la nube de puntos se representa por un punto central y un vector normal . Una vez se ha definido el plano, encuentran luego la distancia mínima entre el plano y el punto definiendo la distancia como:
Para decidir bajo qué criterio se usa una métrica u otra, en [26] Teniente y Andrade-
Cetto usan una aproximación híbrida jerárquica. Para ello, primero calculan el plano más
próximo al punto que se quiere poner en correspondencia mediante la librería ANN, que halla
unos puntos vecinos de la nube de referencia que forman el plano. Una vez el plano está
definido, se obtiene la distancia entre el plano y los n puntos adyacentes que lo describen,
como una medida de error denominada error del plano tangencial, tal y como se aprecia en la
la Figura 6.5. Si este error es mayor a un umbral definido por el usuario, usan la métrica punto
a punto propuesta por [27] Biota et al., mientras que si el error es menor al valor de este
umbral, entonces usan la métrica punto a plano propuesta por Chen y Medioni.
Figura 6.5: Error de ajuste entre un plano y los n puntos adyacentes que lo describen.
44
6.2.2 MINIMIZACIÓN DEL ERROR MÉTRICO
Una vez se ha medido el error métrico, se procede a minimizarlo hasta conseguir la
convergencia. Biota et al. resuelve este problema calculando el desplazamiento relativo entre
S y S’ mediante un vector que representa la
transformación, es decir, la traslación y rotación de la nube S hasta la nube S’. La expresión
que minimiza la distancia entre ambas nubes es la siguiente:
La transformación entre S y S’ también se puede expresar en forma matricial mediante
una matriz homogénea H, sabiendo que y, de este modo, también
determinaremos la rotación y la traslación que realiza la nube de puntos S para estar en
correspondencia con S’.
La matriz de transformación homogénea H se define como una matriz de 4x4 que en general consistente de cuatro submatrices de la forma:
En robótica la submatriz , que representa una transformación de perspectiva, es nula; la submatriz , que representa un escalado global, es la unidad:
la matriz de rotación mide el ángulo de giro de cada eje coordenado y se puede descomponer en 3 submatrices:
resultando,
y el vector indica la traslación
de la nube S hasta S’.
Esta matriz H representa, por tanto, a una nube de puntos S perteneciente a un sistema XYZ que ha sido rotado y trasladado hasta la nube de puntos S’ perteneciente al sistema de referencia IJK, tal y como se aprecia en la Figura 6.6.
45
Figura 6.6: La nube de puntos de S relativa al sistema XYZ ha sido transformada hasta la nube de puntos S’ del sistema IJK.
Así pues, la matriz H equivale a rotar y trasladar la nube S del sistema XYZ (primera imagen) para alinearse con la nube S’ referenciada al sistema IJK (segunda imagen):
donde Xi, Xj, Xk es el vector unitario del eje X en el sistema IJK, Ii, Ij, Ik es el vector unitario del eje Y en el sistema IJK, Zi, Zj, Zk es el vector unitario del eje Z en el sistema IJK. Obsérvese que la expresión anterior puede reescribirse de la siguiente manera descomponiendo la matriz homogénea:
De esta manera, en cada iteración del algoritmo, se irá minimizando el error métrico entre S y S’ mediante la matriz homogénea, hasta conseguir la alineación de las dos nubes de puntos.
46
6.3. ETAPA DE ACTUALIZACIÓN
Una vez se ha estimado la matriz homogénea de transformación que minimiza el error
métrico entre parejas de puntos, primero, se actualiza la nube de puntos de S con la
transformación estimada, es decir, se desplaza toda la nube de S con la rotación y traslación de
la matriz homogénea estimada, y finalmente, se actualizan las correspondencias de las parejas
de puntos. A continuación, se calcula el error métrico posterior entre las parejas de puntos de
S (ya actualizada) con los de S’.
El criterio de convergencia se determina estableciendo un número máximo de
iteraciones, o bien, hasta que la diferencia entre el error previo y el error posterior entre
parejas de puntos sea menor al valor de un umbral definido previamente. En caso de que no se
cumpliera el criterio, se vuelven a repetir las etapas de correspondencia y de registro tantas
iteraciones se hayan definido hasta alinear la nube de puntos S con la nube de puntos S’.
Si la nube de puntos de S actualizada se corresponde con la de S’, significa que la
diferencia de errores es mayor o igual al valor del umbral definido inicialmente, o bien, que se
ha llegado al número máximo de iteraciones. De este modo, nos aseguramos de que el
algoritmo llega a su fin sin entrar en un bucle infinito.
Por lo tanto, podemos decir que el algoritmo ICP en cada iteración, va desplazando la
nube de puntos S hacia la nube de puntos S’, mientras se vaya minimizando el error métrico de
cada una de las parejas de puntos en correspondencia. Este proceso queda representado en
diagrama de flujo de la Figura 6.7.
47
Figura 6.7: Diagrama de flujo del algoritmo ICP.
48
PARTE II Desarrollo
49
Capítulo 7
DESCRIPCIÓN DE LA IMPLEMENTACIÓN
Este capítulo se corresponde a la parte de desarrollo del sistema planteado en el
capítulo 1, donde se explica detalladamente las fases de su diseño, tal y como se muestra en la
Figura 7.1. Para ello, se procede a realizar una serie de experimentos, en el que cada uno
consiste en procesar una secuencia de imágenes capturadas con la cámara ToF, que
representan el movimiento de hacer un sencillo gesto de la mano para comprobar su grado de
libertad. Cada una de las imágenes de su respectiva secuencia pasa independientemente por
una cadena de procesos de un algoritmo implementado en Matlab, empezando por la
adquisición de los datos 3D, y seguida por la reducción de puntos, la segmentación interactiva
y finalmente, ICP. Con los datos resultantes de aplicar la etapa de ICP, se obtienen las
transformaciones o pequeñas variaciones de movimiento de cada uno de los gestos, en forma
de matrices homogéneas, o bien, en forma de ángulos de rotación y vectores de traslación.
Finalmente, con estos últimos datos adquiridos, se aplican a la figura geométrica en forma de
mano modelada con cilindros propuesta en el capítulo 5 mediante librerías gráficas 3D Open
Inventor, para reproducir en 3D los datos resultantes de aplicar ICP. De esta manera,
compareremos la animación de hacer cada uno de los gestos capturados con la cámara ToF
con la reproducción en 3D, y así, validaremos el sistema viendo si la comparación es plausible.
Figura 7.1: Fases del diseño del sistema.
Adquisición de puntos
Reducción de puntos
Segmentación interactiva de
puntosICP
Reproducción 3D
50
7.1. HERRAMIENTAS INFORMÁTICAS EMPLEADAS
La adquisición de las imágenes que proporciona la cámara SR-3000 se ha realizado
mediante el programa visualizador SR_3D_View que proporciona el fabicante. Para ejecutar
este visualizador previamente se ha instalado el driver SwissrangerSetup1.0.12.577.exe bajo
plataforma Windows Vista.
Para implementar el algoritmo se ha usado el programa MATLAB (abreviatura de
MATrix LABoratory) versión 7.6.0.324 (R2008a) en plataforma Windows Vista, un software
matemático que ofrece un entorno de desarrollo integrado (IDE) con un lenguaje de
programación propio (lenguaje M). Es un programa de gran utilidad ya que permite manipular
las matrices y representar los datos y funciones de las etapas de reducción de puntos,
segmentación interactiva e ICP.
Finalmente, para la reproducción de los datos en 3D se ha usado KDevelop versión
3.5.3, un entorno de desarrollo integrado para sistemas LINUX orientado al uso bajo el entorno
gráfico KDE, aunque también con otros entornos como GNOME. KDevelop es un programa
compuesto por un conjunto de herramientas para un programador y cuenta con un editor de
código, depurador y constructor de interfaz gráfica GUI. No cuenta con un compilador propio,
por lo que depende de gcc para producir código binario. Este programa se ha instalado bajo
plataforma Ubuntu 8.04.
Para poder visualizar correctamente los datos en 3D, es requisito previo:
Tener instalada la librería Qt31. Ésta se utiliza para crear la interfaz gráfica de interacción del usuario.
Tener instalada la librería Open Inventor2. Ésta se utiliza para representar la escena de forma tridimensional.
Tener instalada la librería SoQt2. Ésta permite utilizar simultáneamente y en un mismo programa interfaces de Open Inventor y Qt.
1 http://qt.nokia.com/downloads 2 http://www.coin3d.org/lib/plonesoftwarecenter_view
51
7.2. ADQUISICIÓN DE DATOS 3D
Con el programa visualizador SR_3D_View que proporciona el fabricante de la cámara,
se extraen previamente las nubes de puntos a través de la opción Export point cloud. Cada
nube de puntos viene en forma de un archivo .ASCII en la que aparece listada 3 columnas con
números reales, pertenecientes a los ejes X, Y y Z de cada píxel. Cada píxel, por tanto tendrá
asociado 3 números de cada fila que representan la posición de un punto
en el espacio. En la Figura 7.2 se muestra un fragmento de archivo ASCII exportado por la
cámara.
Figura 7.2: Coordenadas X, Y, Z de cada píxel.
Una vez capturadas las imágenes se programa en Matlab la primera etapa del sistema,
en la que primero se inicializan los directorios necesarios para el funcionamiento del
programa, seguidamente se cargan los archivos ASCII y cada uno se guarda en una estructura
de datos N(i).data donde cada estructura será una matriz de puntos de dimensión 25344 x 3.
Finalmente se representan gráficamente estas matrices de píxeles en forma de puntos 3D tal y
como se aprecia en la la Figura 7.3. El código de esta etapa figura en el anexo A2.
Figura 7.3: Visualización de una nube de puntos capturada con la cámara SR-3000.
52
7.3. REDUCCIÓN DE PUNTOS
Cuando las imágenes 3D tienen una gran densidad de puntos, reducir el número de
puntos totales antes de aplicar ICP, ayuda a reducir el tiempo de búsqueda de puntos vecinos,
y por tanto, es una estrategia para decrementar el tiempo de ejecución del sistema. En esta
etapa del sistema se aplican dos estrategias demostradas en [22] para excluir los puntos no
deseados de la Figura 7.3. Por un lado, a modo de filtro grande, se limita la distancia de los ejes
X, Y y Z para obtener los puntos pertenecientes sólo a la mano, tal y como se aprecia en la
Figura 7.4, y por otro, a modo de filtro fino, se aplica un muestreo uniforme de puntos para
eliminar los outliers. El código de esta etapa figura en el anexo A2.
Figura 7.4: Caja que limita los puntos que se desean extraer.
53
Limitar la distancia en los ejes:
Para extraer los puntos que nos interesan de la silueta de la mano y eliminar los no
deseados, se definen manualmente los valores máximos y mínimos de los ejes X, Y y Z que
envuelven a la densidad de puntos que se desean mantener (sólo de la mano), en anchura,
altura y profundidad. De este modo, los puntos pertenecientes al antebrazo o cualquier punto
de la imagen que quede fuera de los límites de la caja se eliminarán automáticamente. El
proceso se repite iterativamente 25344 veces, desde el primer hasta el último punto de la
matriz de píxeles y el resultado final se muestra en la Figura 7.5.
Figura 7.5: Resultado de 3497 puntos después de aplicar los limites en los ejes X, Y y Z.
54
Muestreo uniforme y eliminación de outliers:
En esta misma etapa se aplica un muestreo uniforme a los puntos de la Figura 7.5 para reducir su número, mediante la función ‘uSamp’. Por otro lado, la función ‘mFilt’, ayuda a reducir los outliers, puntos considerados como ruido que la cámara ToF haya añadido debido a un alta reflectividad del objeto, especialmente en su contorno, pero preservando la naturaleza geométrica de su superficie. Si el número de outliers es grande, estos serán los causantes de un error sistemático en la transformación estimada, y la convergencia tenderá hacia un mínimo local dando lugar a una mala superposición, ya que ICP es susceptible a este ruido. Hay que recordar que el algoritmo ICP original consideraba que los datos no tenían outliers. Después de aplicar el muestreo, en la Figura 7.6 se aprecia como algunos puntos interdigitales han desaparecido, manteniéndose sólo aquellos puntos cuya distancia media a sus vecinos sea menor al valor de ‘mFilt’.
Figura 7.6: Resultado de 2342 puntos despúes de aplicar el muestreo y la eliminación de outliers.
55
7.4. SEGMENTACIÓN INTERACTIVA
ICP parte con la consideración de que sólo es aplicable a cuerpos rígidos. Ya que la
mano es un objeto articulado con más de 20 DOF es necesario particionar la nube de puntos
que forman la mano en varios cuerpos rígidos para así poder medir el movimiento completo
de la mano. Este método es conocido como Divide & Conquer, y al igual que el diseño
descendente en la programación, se trata de dividir un problema general en varios
particulares. Por ejemplo, para medir las variaciones de hacer el movimiento de
flexión/extensión del dedo índice, primero es necesario segmentar el dedo definiendo por
separado los puntos pertenecientes a cada una de las tres falanges, y asignando a cada una de
ellas una estructura de datos pointClouds(i).cil=struct('cil1', [], 'cil2', [], 'cil3', []), donde cil1 es la
primera falange; cil2, la segunda; y cil3, la tercera respectivamente.
Para delimitar los puntos pertenecientes a cada falange, se aplica el mismo método de
limitar la distancia de los ejes, definiendo manualmente los valores máximos y mínimos en los
ejes X, Y y Z que envuelven a la densidad de puntos pertenecientes a cada falange en este
caso, a diferencia de la mano entera que sólo sería una única estructura de datos. En la Figura
7.7 se muestra una secuencia de 6 imágenes con el dedo índice segmentado en 3 estructuras
de datos, haciendo el movimiento de flexión/extensión. El código de esta etapa figura en el
anexo A2.
Imagen 1
Imagen 2
Imagen 3
Imagen 4
Imagen 5
Imagen 6
Figura 7.7: Los puntos coloreados en negro pertenecen a cil1 o primera falange, los rojos a
cil2 o segunda falange, y los azules a cil3 o tercera falange.
-0.05 0 0.05-0.02
-0.01
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.083D Clouds map
-0.05 0 0.05-0.02
-0.01
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.083D Clouds map
-0.05 0 0.05-0.02
-0.01
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.083D Clouds map
-0.05 0 0.05-0.02
-0.01
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.083D Clouds map
-0.05 0 0.05-0.02
-0.01
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.083D Clouds map
-0.05 0 0.05-0.02
-0.01
0
0.01
0.02
0.03
0.04
0.05
0.06
0.07
0.083D Clouds map
56
7.5. ICP
Ahora que se ha segmentado cada imagen en 3 estructuras de datos, se procede a
medir las variaciones de movimiento de cada una de ellas, superponíendolas mediante el
algoritmo ICP. Para ello, primero se establecen cil1, cil2 y cil 3 de la imagen 1 como las nuevas
(new), y cil1, cil2 y cil3 de la imagen 2 como las de referencia (ref); luego cil1, cil2 y cil3 de la
imagen 2 como las nuevas (new), y cil1, cil2 y cil3 de la imagen 3 como las de referencia… y así
sucesivamente. A continuación, se calcula el vector normal asociado a cada punto del plano
definido por el número de puntos vecinos de ambas estructuras. Luego, se establece el
número máximo de iteraciones ‘maxIter’ y un umbral ‘errorThreshold’ como los criterios
iniciales para salir del bucle.
Ahora comienza el proceso ICP iterativamente:
[1] Correspondencia punto a punto:
Se establecen parejas de puntos entre cil1.ref.data y cil1.new.data, cil2.ref.data y
cil2.new.data, cil3.ref.data y cil3.new.data mediante la librería ANN. El criterio de
selección de correspondencias depende de la distancia entre puntos y de un ángulo
máximo entre las componentes normales. De este modo, nos aseguramos que cada punto
sólo tendrá una única correspondencia aun en el caso de que la distancia a otro punto sea
la misma. Para ello primero se ordenan las parejas de puntos de mayor a menor distancia.
Luego se descartan las correspondencias que estén a una distancia ‘maxDist’ mayor que la
definida por el usuario. Finalmente, se compara el vector normal de un punto de S’ con el
vector normal del otro punto de S. Si el ángulo entre ambos vectores está dentro de un
rango ‘maxAngle’, se establece la correspondencia y en caso contrario, se descarta.
[2] Cálculo del error de ajuste entre las correspondencias:
A continuación se calcula la distancia de separación entre parejas de puntos en
correspondencia. Este será el error métrico previo a la minimización.
[3] Estimación de la matriz de transformación óptima para minimizar el error de ajuste:
Se calcula la matriz H óptima que minimiza el error de ajuste previo entre parejas de
puntos en correspondencia. El resultado es una matriz homogénea Estimated_HRt.HRt de
4x4 y/o el vector q de desplazamiento Estimated_HRt.xyzRxRyRz de 1x6.
[4] Actualización de la nube de puntos new con la nueva transformación rígida estimada:
Mediante la función ‘applyHRt2data’ los puntos de new se desplazan hacia los puntos de
ref con la matriz de transformación estimada.
[5] Nueva correspondencia de puntos y cálculo posterior del error de ajuste:
Se actualizan las correspondencias de parejas de puntos y se vuelve a calcular el error de
ajuste posterior.
[6] Criterio de convergencia:
Si la diferencia entre el error de ajuste previo con el error de ajuste posterior es menor al
umbral (errorThreshold) definido, se cumple el criterio de convergencia y se sale del bucle,
sino, se repite todo el proceso de nuevo tantas iteraciones se hayan establecido o mientras
que la diferencia entre los errores sea mayor al ErrorThreshold.
57
7.6. VALIDACIÓN DE LOS DATOS EXTRAÍDOS
Antes de aplicar las matrices homogéneas al modelo de mano 3D, es necesario comprobar que las transformaciones sean correctas. De este modo, evitaremos ver una reproducción 3D que no se corresponda con la secuencia de puntos extraída. Para ello multilplicamos los puntos de new (primera nube de puntos) por la transformación de esta, es decir, la variación de movimiento de la primera nube con respecto a la nube ref (siguiente nube de puntos), dando como resultado ref2. Seguidamente, mostramos por pantalla ref (la segunda imagen) en color rojo y la imagen ref2 (la primera imagen transformada hacia la segunda) en azul. Si vemos que los puntos azules están prácticamente superpuestos a los puntos en rojo, podemos concluir que ICP realiza bien las transformaciones, y por lo tanto, validar el experimento de extracción de datos para luego aplicar las transformaciones extraídas al modelo de mano en 3D. A continuación se muestra el código para la validación de los datos extraídos:
Para la segunda y tercera falange se aplicaría el mismo código reemplazando cil1 por cil2 y cil3,
respectivamente.
A continuación se muestran en la Figura 7.9, Figura 7.10 y Figura 7.11 el resultado de
superponer los puntos de ref2 con los puntos de ref, para cada una de las falanges
respectivamente. La visualización de esta etapa figura en el anexo A4.
% 1ª falange for j=1:size(cil1,2) ref2 = []; for i=1:size(cil1(j).new.data,2) ref2.data(:,i) = Indice1(j).HRt*[ cil1(j).new.data(:,i) ; 1 ] end figure; axis equal;hold on; %Pinta la nube de puntos de referencia en rojo plot3(cil1(j).ref.data(1,:),cil1(j).ref.data(2,:),cil1(j).ref.data(3,:),'r*'); %Pinta la nube de puntos tranformadas en azul plot3(ref2.data(1,:),ref2.data(2,:),ref2.data(3,:),'b*'); axis([-0.05,0.0,-0.02,0.02]); hold off; end
58
Figura 7.9: Resultado de superponer ref2 con ref para la primera falange.
Transformación 1
Transformación 2
Transformación 3
Transformación 4
Transformación 5
Figura 7.10: Resultado de superponer ref2 con ref para la segunda falange.
Transformación 1
Transformación 2
Transformación 3
Transformación 4
Transformación 5
Figura 7.11: Resultado de superponer ref2 con ref para la tercera falange.
Transformación 1
Transformación 2
Transformación 3
Transformación 4
Transformación 5
59
7.7. REPRODUCCIÓN DE LOS DATOS RESULTANTES
Finalmente, ya que es difícil evaluar cualitativamente la posición y orientación de cada
una de las transformaciones resultantes en la etapa de ICP, se propone aplicarlos al modelo
cilíndrico de mano propuesto en el capítulo 5. De este modo veremos una animación que se
corresponderá con su correspondiente secuencia de imágenes capturadas con la cámara TOF.
El modelo cilíndrico de mano se ha programado en C++ mediante unas clases ya
predefinidas de la libreía Open Inventor1 bajo el entorno de programación KDevelop, y
teniendo previamente instaladas las librerías Coin, Qt3 y SoQt.
La interfaz principal de Qt3 consiste en una ventana estándar Examiner Viewer que
permite ver la escena en un espacio tridimensional y es un visualizador de Open Inventor que
tiene ciertas funcionalidades adicionales. Esta interfaz se muestra en la Figura 7.12.
Examiner Viewer permite al usuario:
Rotar la escena: El cursor que aparece por defecto es el de rotación. Se puede rotar la escena simplemente manteniendo pulsado el botón izquierdo del ratón, en cualquier punto de la ventana y arrastrándolo.
Zoom: Se puede hacer zoom rotando la rueda del ratón.
Desplazarse por la escena (panning): Para desplazarse por la escena, se debe mantener pulsada la rueda del ratón mientras éste se mueve.
Centrar la vista: Se puede centrar la vista en un punto concreto de una malla pulsando s, lo que cambiará el cursor del ratón a una cruz, y seleccionando el punto sobre el que se quiere centrar la vista. Centrar la vista en un punto permite que todas las rotaciones de la escena se hagan entorno a ese punto. Además, se podrá aumentar con más zoom la escena entorno al punto seleccionado.
Cambiar el estilo de visualización: La ventana Examiner Viewer permite visualizar la geometría de formas diferentes. Para ello, se debe pulsar el botón derecho del ratón en un punto cualquiera de la escena. Aparecerá un menú contextual en el que se pueden seleccionar diferentes estilos de visualización y animación, entre otras opciones.
1 http://doc.coin3d.org/Coin-3/annotated.html
60
Figura 7.12: Ventana de visualización tridimensional Examiner Viewer de la librería
Coin3D/Open Inventor.
Hay que destacar que el modelo de articulaciones con bandas elásticas no ha sido
aplicado, ya que no es necesario definir las restricciones a la hora de representar la
reproducción 3D. Tan solo aplicando la posición y la orientación de cada transformación al
modelo de mano, es suficiente para visualizar la misma animación observada en los vídeos de
extracción de datos.
Para desarrollar el modelo de mano en 3D y visualizar su animación se ha seguido una
jerarquía en árbol, donde la palma es la ráiz y los dedos son los hijos, y se han utilizado las
siguientes clases:
SoQt: Crea una plataforma cruzada y permite que la escena gráfica de Coin sea renderizada
en la GUI de Qt.
SoQtExaminerViewer: Es un tipo de visor que permite desplazarse por la escena, rotar o
hacer zoom con el ratón o el teclado.
SoBaseColor: Necesario para establecer el color del material.
61
SoCylinder: Inserta un cilindro en la escena y permite renderizarlo.
SoCube: Inserta un cubo en la escena y permite renderizarlo.
SoSphere: Inserta una esfera en la escena y permite renderizarla.
SoSeparator: Mantiene los atributos de los nodos hijos y los aisla de las traslaciones de
otras partes de la escena.
SoTranslation: Especifica traslaciones en X, o en Y, o en Z.
SoRotationXYZ: Especifica rotaciones en X, o en Y, o en Z.
SoTimerSensor: Permite que una tarea se ejecute en un intervalo de tiempo determinado.
Por ejemplo, que las rotaciones y traslaciones de la mano entera o de algunos dedos se
apliquen cada dos segundos.
Finalmente, hay que destacar que a la hora de aplicar las rotaciones, la librería Coin los
pide en ángulos de Euler para cada eje de rotación en particular, y por tanto, la visualización de
la rotación conjunta es el resultado de aplicar las tres rotaciones separadamente según el
orden elegido por el usuario. El código de esta etapa figura en el anexo A2 y su visualización en
el anexo A5.
62
PARTE III Resultados, conclusiones
y trabajo futuro
63
Capítulo 8
RESULTADOS EXPERIMENTALES
A partir de la información de profundidad que se ha extraído de la cámara ToF y
mediante un algoritmo implementado en Matlab, se muestran los resultados de los puntos
extraídos después de aplicar las etapas de adquisición, reducción, segmentación de puntos e
ICP a 4 experimentos. El resultado final de aplicar el algoritmo, son diferentes secuencias de
nubes de puntos que representan una mano realizando diferentes gestos, y unas matrices
homogéneas que indican la traslación Tx, Ty, Tz y los ángulos de giro Rx, Ry, Rz de los puntos
de una nube hacia la siguiente. De este modo, comprobamos empíricamente los DOF de cada
articulación.
Las variables globales que se han aplicado a cada uno de los experimentos que
representan a cada gesto, son, el número de puntos vecinos que definen un plano, NNN = 9; el
ángulo máximo que admite las componentes normales de cada plano, maxAngle = 45°; el
número máximo de iteraciones que realiza el algoritmo para poner en correspondencia una
nube de puntos con la siguiente, maxIter = 1000; y finalmente, el umbral para que el algoritmo
salga del bucle, errorThreshold = 0.000001.
Finalmente, se aplican las matrices homogéneas de cada experimento al modelo
cilíndrico de mano descrito en el apartado 7.7, para reproducir así la misma animación
obtenida con los puntos extraídos de la cámara y ver si la comparación es plausible.
Previamente a aplicar las matrices al modelo virtual de mano, se comprueba que las
transformaciones sean correctas, mediante la validación de los datos extraídos.
En el Anexo A1 se adjuntan los resultados numéricos de la extracción de datos en cada
experimento tras finalizar el algoritmo; en el Anexo A2 se adjunta el código de las etapas del
algoritmo; en el Anexo A3 se adjuntan unas colecciones de vídeos que representan la
secuencia de las nubes de puntos resultantes de cada experimento tras finalizar el algoritmo;
en el Anexo A4, la colección de vídeos de la validación de los datos extraídos en cada
experimento, y su reproducción 3D en el Anexo A5.
64
8.1. EXPERIMENTO 1
En este experimento, se toman 14 imágenes con la SR-3000 que muestran cómo la mano se inclina hacia adelante y hacia atrás. A lo largo de la secuencia, se aprecia un alargamiento y una acortación de la mano a medida que se va inclinando en ambos sentidos debido al efecto proyectivo. Una cámara en 2D no sabría interpretar esta semejanza en la proyección, y por tanto, este experimento tiene la finalidad de obtener ventaja de los datos de profundidad que proporciona la cámara TOF para solucionar esta incerteza. Posteriormente, se obtienen las pequeñas variaciones de movimiento (transformaciones) a partir de una estructura de datos RotMaVert.data considerando toda la nube de puntos que forman la mano, como un único objeto rígido. El tiempo total de ejecución del algoritmo para este experimento es de 102.73 segundos y los resultados numéricos de las transformaciones de este experimento se muestran en el anexo A1, y su visualización en los anexos A3 y A5. A continuación se detallan los ajustes de la cámara y de las variables locales para este
experimento:
Ajustes de los parámetros de la cámara:
Distancia mínima de la mano respecto a la cámara (cm)
Integration Time
Amplitude Threshold
Display Settings
Visualization
32 Auto 1215 Perspective Point list; Color
Ajuste de los parámetros en MATLAB:
Número de imágen
Reducción de puntos por encima de los ejes X,Y, Z
Reducción de puntos por debajo de los ejes X, Y, Z
uSamp mFilt
1 [-0.1 -0.10 0.4298] [0.15 0.1 0.5] 0.04 0
2 [-0.1 -0.099 0.3] [0.15 0.1 0.5] 0.04 0
3 [-0.1 -0.10 0.3783] [0.15 0.1 0.5] 0.04 0
4 [-0.1 -0.10 0.3574] [0.15 0.1 0.5] 0.04 0
5 [-0.1 -0.104 0.3] [0.15 0.1 0.5] 0.04 0
6 [-0.1 -0.1065 0.3] [0.15 0.1 0.5] 0.04 0
7 [-0.1 -0.104 0.3375] [0.15 0.1 0.5] 0.04 0
8 [-0.1 -0.099 0.15] [0.15 0.1 0.5] 0.04 0
9 [-0.1 -0.0985 0.35] [0.15 0.1 0.5] 0.04 0
10 [-0.1 -0.0985 0.40] [0.15 0.1 0.5] 0.04 0
11 [-0.1 -0.08858 0.38] [0.15 0.1 0.5] 0.04 0
12 [-0.1 -0.08664 0.36] [0.15 0.1 0.5] 0.04 0
13 [-0.1 -0.091 0.34] [0.15 0.1 0.5] 0.04 0
14 [-0.1 -0.08847 0.32] [0.15 0.1 0.5] 0.04 0
65
En la Figura 8.1 se aprecia en una secuencia de imágenes clave, que el movimiento dominante de la mano es la rotación en el eje X. En la columna izquierda aparecen las nubes de puntos resultantes de aplicar el algoritmo, y en la columna derecha, las imágenes resulantes de reproducir las transformaciones obtenidas del algoritmo, al modelo geométrico de mano en 3D. El estado inicial de este gesto (imagen 1) comienza con los dedos estirados y separados, y la mano en posición vertical y paralela al plano de imagen de la cámara. Luego la mano se va inclinando hacia adelante, en el sentido positivo de rotación en el eje X, según la regla de la mano derecha, hasta llegar al valor máximo de su inclinación (imagen 6). Desde ahí, la mano comienza a inclinarse hacia atrás, en el sentido negativo de rotación según la misma regla, pasando por su estado inicial (imagen 10) y continuando con su inclinación hasta llegar a su valor minimo (imagen 14). A pesar de que se ha procurado mantener la palma de la mano lo más paralela posible al sensor de la cámara, se aprecian unas rotaciones en los ejes Y y Z prácticamente negligibles mientras se ha ido inclinando la palma hacia adelante y hacia atrás.
Imagen 1 Transformación 0 (Estado inicial)
Imagen 6 Transformación 5
66
Imagen 10 Transformación 9
Imagen 14 Transformación 13
Figura 8.1: Visualización del movimiento de la mano hacia adelante y hacia atrás. En la
columna izquierda se ven las nubes de puntos codificadas por colores en función de la
distancia de la mano al sensor de la cámara. En la columna derecha, aparecen las imágenes
transformadas de una mano modelada con librerías gráficas en 3D.
67
8.2. EXPERIMENTO 2
En este experimento, se toman 15 imágenes con la SR-3000 que muestran como la
mano da una vuelta prácticamente completa y, se demuestra que es posible representar los 6
DOF de la muñeca, tal y como aparece en la Figura 8.2. Las 14 transformaciones se aplican a
partir de una estructura de datos RotMuneca.data considerando que la nube de puntos
pertenecientes a toda la mano es un objeto rígido. El tiempo total de ejecución del algoritmo
para este experimento es de 148.41 segundos y los resultados numéricos de las
transformaciones de este experimento se muestran en el anexo A1, y su visualización en los
anexos A3 y A5.
Figura 8.2: Representación de 6 DOF para la muñeca.
A continuación se detallan los ajustes de la cámara y de las variables locales para este
experimento:
Ajustes de los parámetros de la cámara:
Distancia mínima de la mano respecto a la cámara (cm)
Integration Time
Amplitude Threshold
Display Settings
Visualization
30 Auto 1023 Perspective Point list; Color
Ajuste de los parámetros en MATLAB:
Número de imágen
Reducción de puntos por encima de los ejes X, Y, Z
Reducción de puntos por debajo de los ejes X, Y, Z
uSamp mFilt
1 [0.17 0.085 0.54] [-0.1 -0.108 0.30] 0.003 1
2 [0.17 0.085 0.523] [-0.1 -0.108 0.30] 0.003 1
3 [0.17 0.085 0.5048] [-0.11 -0.1076 0.30] 0.003 1
4 [0.17 0.085 0.477] [-0.12 -0.107 0.30] 0.003 1
5 [0.17 0.085 0.46] [-0.1 -0.105 0.30] 0.003 1
6 [0.17 0.085 0.44] [-0.1 -0.09857 0.36] 0.003 1
7 [0.17 0.085 0.43] [-0.1 -0.098 0.33] 0.003 1
8 [0.17 0.085 0.415] [-0.1 -0.098 0.33] 0.003 1
68
9 [0.17 0.085 0.413] [-0.1 -0.095 0.305] 0.003 1
10 [-0.1 -0.0985 0.40] [-0.1 -0.08498 0.305] 0.003 1
11 [0.17 0.085 0.425] [-0.1 -0.080 0.30] 0.003 1
12 [0.17 0.085 0.43] [-0.1 -0.07711 0.30] 0.003 1
13 [0.17 0.085 0.451] [-0.1 -0.074 0.30] 0.003 1
14 [0.17 0.085 0.495] [-0.1 -0.074 0.30] 0.003 1
15 [0.17 0.085 0.511] [-0.1 -0.062 0.30] 0.003 1
En la Figura 8.3 se aprecia en una secuencia de imágenes clave, que el movimiento dominante de la mano es la rotación de la muñeca de la mano en los ejes X, Y y Z. En la columna izquierda aparecen las nubes de puntos resultantes de aplicar el algoritmo, y en la columna derecha, las imágenes resulantes de reproducir las transformaciones obtenidas del algoritmo, al modelo geométrico de mano en 3D. El estado inicial de este gesto (imagen 1) comienza con los dedos estirados y separados, y la mano posicionada en el “noroeste” (rotada positivamente según la regla de la mano derecha en el eje Z, y negativamente en los ejes X e Y). Luego la mano se va inclinando hacial el “oeste” rotando positivamente en los ejes X y Z , hasta llegar al valor máximo de su giro (imagen 5). Desde ahí, la mano comienza a girar a la derecha y un poco hacia adelante, es decir, en el sentido negativo de rotación del eje Z según la regla de la mano derecha, y un poco en el sentido positivo del eje Y, pasando por la imagen 10, hasta apuntar al “este”. Finalmente, continúa el giro con la rotación negativa en el eje X hasta llegar al final de la vuelta (imagen 15).
69
Imagen 1 Transformación 0 (Estado inicial)
Imagen 5 Transformación 4
Imagen 8 Transformación 7
70
Imagen 10 Transformación 9
Imagen 13 Transformación 12
Imagen 15 Transformación 14
Figura 8.3: Visualización del movimiento de la mano dando una vuelta casi completa. En la
columna izquierda se ven las nubes de puntos codificadas por colores en función de la
distancia de la mano al sensor de la cámara. En la columna derecha, aparecen las imágenes
transformadas de una mano modelada con librerías gráficas en 3D.
71
8.3. EXPERIMENTO 3
En este experimento, se toman 26 imágenes con la SR-3000 que muestran el
movimiento de abducción/adducción y la oposición del pulgar. Las 25 transformaciones se
aplican a partir de una estructura de datos Pulgar.data obtenida con los puntos pertenecientes
sólo al pulgar de la mano, y se demuestra que es posible representar 2 DOF de la articulación
carpo meta carpo (CMC) y 2 DOF de la trapecio meta carpo (TM): 1 DOF para la
abducción/adducción y 1 DOF para la oposición, tal y como aparece en la Figura 8.4. El tiempo
total de ejecución del algoritmo para este experimento es de 34.32 segundos y los resultados
numéricos de las transformaciones de este experimento se muestran en el anexo A1, y su
visualización en los anexos A3 y A5.
Figura 8.4: Representación de 2 DOF para las articulaciones CMC y TM.
A continuación se detallan los ajustes de la cámara y de las variables locales para este
experimento:
Ajustes de los parámetros de la cámara:
Distancia mínima de la mano respecto a la cámara (cm)
Integration Time
Amplitude Threshold
Display Settings
Visualization
38 Auto 975 Perspective Point list; Color
Ajuste de los parámetros en MATLAB:
Número de imágenes
Reducción de puntos por encima de los ejes X, Y, Z
Reducción de puntos por debajo de los ejes X, Y, Z
uSamp mFilt
26 [0.09 0.09 0.5] [-0.14 -0.09 0.35] 0.00 1
72
En la Figura 8.5 se aprecia en una secuencia de imágenes clave, que el movimiento dominante de la mano es la rotación del pulgar en los ejes Y y Z. En la columna izquierda aparecen las nubes de puntos resultantes de aplicar el algoritmo, y en la columna derecha, las imágenes resulantes de reproducir las transformaciones obtenidas del algoritmo, al modelo geométrico de mano en 3D. El estado inicial de este gesto (imagen 1) comienza con el pulgar pegado a la mano, y el resto de la mano estática y en posición vertical y paralela al plano de imagen de la cámara. Luego el pulgar se va inclinando hacia la derecha, es decir, rota en el sentido positivo del eje Z, hasta llegar al valor máximo de su inclinación (imagen 8). Luego, desde la imagen 9, el pulgar comienza a inclinarse hacia la izquierda, es decir, rota negativamente en el eje Y, pasando por la imagen 13, hasta llegar a su valor mínimo (imagen 17). A partir de la imagen 18, el pulgar vuelve a hacer el mismo recorrido pero en sentido inverso, rotando positivamente en el eje Y hasta su valor máximo (imagen 23), y finalmente, regrasando a su estado inicial (Imagen 26).
Imagen 1 Transformación 0 (Estado inicial)
Imagen 8 Transformación 7
73
Imagen 9 Transformación 8
Imagen 13 Transformación 12
Imagen 17 Transformación 16
74
Imagen 18 Transformación 17
Imagen 23 Transformación 22
Imagen 26 Transformación 25
Figura 8.5: Visualización de los movimientos de abducción/adducción y oposición del pulgar.
En la columna izquierda se ven las nubes de puntos codificadas por colores en función de la
distancia de la mano al sensor de la cámara. En la columna derecha, aparecen las imágenes
transformadas de una mano modelada con librerías gráficas en 3D.
75
8.4. EXPERIMENTO 4
En este experimento, se toman 16 imágenes con la SR-3000 que muestran el
movimiento de abducción y addución del dedo medio e índice. Las transformaciones de los
dedos medio e índice se aplican a partir de dos estructuras de datos diferenciadas
Falange1.data y Falange2.data obtenidas con los puntos pertenecientes a los dedos medio e
índice respectivamente, y se demuestra que es posible representar 1 DOF de la articulación
metacarpofalange (MCP): la abducción y la adducción para los dedos índice y medio, tal y
como aparece en la Figura 8.6. El tiempo total de ejecución del algoritmo para este
experimento es de 42.21 segundos y los resultados numéricos de las transformaciones de este
experimento se muestran en el anexo A1, y su visualización en los anexos A3 y A5.
Figura 8.6: Representación de 1 DOF para la articulación MCP.
A continuación se detallan los ajustes de la cámara y de las variables locales para este
experimento:
Ajustes de los parámetros de la cámara:
Distancia mínima de la mano respecto a la cámara (cm)
Integration Time
Amplitude Threshold
Display Settings
Visualization
31 Auto 1500 Perspective Point list; Color
Ajuste de los parámetros en MATLAB:
Número de imágenes
Reducción de puntos por encima de los ejes X, Y, Z
Reducción de puntos por debajo de los ejes X, Y, Z
uSamp mFilt
16 [0.1 0.09 0.5] [-0.1 -0.08 0.3] 0.003 0
76
En la Figura 8.7 se aprecia en una secuencia de imágenes clave, que el movimiento dominante de la mano es la rotación de los dedos medio e índice en el eje Z. En la columna izquierda aparecen las nubes de puntos resultantes de aplicar el algoritmo, y en la columna derecha, las imágenes resulantes de reproducir las transformaciones obtenidas del algoritmo, al modelo geométrico de mano en 3D. El estado inicial de este gesto (imagen 1) comienza con los dedos índice y medio estirados y pegados, y la mano en posición vertical y paralela al plano de imagen de la cámara. Luego el dedo índice se va inclinando hacia la derecha, es decir, va rotando en el sentido positivo del eje Z, pasando por la imagen 4, hasta llegar al valor máximo de su inclinación (imagen 7). Paralelamente, el dedo medio se va inclinando hacia la izquierda, es decir, va rotando en el sentido positivo del eje Z, tambié pasando por la imagen 4, hasta llegar al valor máximo de inclinación (imagen 7). Desde ahí, ambos dedos vuelven a hacer el mismo recorrido pero en sentido inverso, pasando por la imagen 11, hasta llegar al estado inicial (imagen 16).
Imagen 1 Transformación 0 (Estado inicial)
Imagen 4 Transformación 3
77
Imagen 7
Transformación 6
Imagen 11
Transformación 10
Imagen 16
Transformación 15
Figura 8.7: Visualización del movimiento de los dedos índice y medio hacia los lados. En la
columna izquierda se ven las nubes de puntos codificadas por colores en función de la
distancia de la mano al sensor de la cámara. En la columna derecha, aparecen las imágenes
transformadas de una mano modelada con librerías gráficas en 3D.
78
Capítulo 9
CONCLUSIONES Y TRABAJO FUTURO
En esta sección del documento se presentan las conclusiones alcanzadas tras la
finalización del proyecto en base a cada uno de los objetivos establecidos inicialmente.
A continuación se recuerdan los objetivos planificados para el proyecto:
Evaluar si la cámara de tiempo de vuelo es una alternativa válida para la detección de las
manos como dispositivo de extracción de información 3D.
Comprobar si los resultados obtenidos de aplicar el algoritmo que se propondrá para el
procesamiento de los datos 3D son válidos para poder ser aplicados en futuras mejoras
para el reconocimiento de los gestos manuales.
La implementación de un código de demostración en Matlab que pone en correspondencia
dos imágenes consecutivas parcialmente superpuestas a partir de una secuencia de nubes
de puntos captadas con la cámara.
Visualización de la secuencia de movimiento en un modelo geométrico de mano
implementado mediante librerías gráficas 3D a partir de las transformaciones obtenidas de
las nubes de puntos.
Las conclusiones a remarcar después de aplicar los experimentos son las siguientes:
En el capítulo anterior se han mostrado los resultados experimentales de aplicar las etapas
del algoritmo a diferentes nubes de puntos a partir de la información de profundidad
proporcionada por la cámara de tiempo de vuelo SR-3000. En la Figura 9.1 se puede
apreciar de modo esquemático el resultado de aplicar el algoritmo ICP entre nubes de
puntos consecutivas. Una vez se han aplicado las transformaciones obtenidas al modelo de
mano en 3D, se ve una alta similitud en el movimiento si se compara la colección de vídeos
de la reproducción 3D a la colección de vídeos de extracción de datos.
En cuanto a la información de profundidad que proporciona la cámara SR-3000, a pesar de
añadir ruido y operar a baja resolución, es más precisa y proporciona información menos
corrupta en un intervalo de distancia entre 30 y 50 cm. El número de puntos que da la
cámara en ese intervalo, permite al algoritmo ICP medir con precisión las pequeñas
variaciones de movimiento de una imagen respecto a la siguiente.
79
En cuanto al algoritmo implementado, en el capítulo 8 se han puesto en correspondencia
las nubes de puntos consecutivas de los experimentos 1 y 2 considerando las imágenes
como un único cuerpo rígido, y su gran cantidad de puntos incrementan notablemente el
tiempo de ejecución de la etapa de ICP. En los experimentos 3 y 4, al segmentar
manualmente el pulgar y los dedos índice y medio del resto de la mano, como estructuras
de datos diferenciadas, el número de puntos se ha reducido considerablemente y, por
tanto, el tiempo de ejecución de la eatapa de ICP es bastante menor.
En cuanto a las oclusiones, a pesar de que la cámara proporciona información de
profundidad, sólo muestra y captura la malla de la mano visible a ella. Esto quiere decir
que si la mano del usuario está de frente a la cámara, la parte posterior de la mano queda
eclipsada por la parte frontal, o bien, cuando una parte de la mano quede eclipsada por los
dedos. Una posible solución es asumir la restricción de que los gestos de la mano no
pueden adoptar algunas posturas en que los dedos queden fuera del plano de imagen. Por
lo tanto, al igual que las cámaras 2D, la cámara de profundidad no nos soluciona el
problema de las oclusiones para posturas en que los dedos queden fuera del plano de
imagen.
Una posible solución para crear una malla tridimensional de la mano, requiere de al menos
dos cámaras TOF conectadas y enfrentadas donde la escena queda en medio de ambos
planos, o bien, situar cada una en los ejes Z y X repectivamente. Así, en el eje X se
capturarían los puntos que quedaran eclipsados por las oclusiones producidas en el eje Z.
Cada cámara creará su versión de la mano y deberá existir un paso final para unir las dos
mitades o las dos perspectivas en un único modelo tridimensional. Finalmente, otro
motivo que anima para añadir una cámara suplementaria es para captar dos manos a la
vez. Si queremos visualizar las dos manos en el intervalo de distancias de 30 a 50 cm en
profundidad, tal y como se recomienda en el apartado 4.1, la baja resolución de la SR-3000
obliga al usuario a mantenerlas juntas, restringiendo el movimiento de las dos manos.
La segmentación interactiva de las falanges es una de las etapas más difíciles por el coste
computacional que conlleva. Para paliar este problema se propone aplicar la estrategia de
tracking descrita en [11], sustituyendo el modelo de cuerpo humano por el modelo de
mano 3D descrito en el capítulo 5. En cada parte del modelo, se definirían los límites de las
cajas envolventes, para luego asignar los puntos de la nube de cada parte de la mano a su
correspondiente parte del modelo 3D. De esta manera se podría hacer una segmentación
automática.
Para comprobar si los resultados obtenidos de aplicar el algoritmo que se ha propuesto
para el procesamiento de los datos 3D, son válidos para poder ser aplicados en futuras
mejoras, se propone aplicar una técnica de tracking para reconocer los gestos manuales. La
estrategia de tracking sirve para medir en tiempo real las pequeñas variaciones de la posición
de la mano a medida que se va moviendo delante de la cámara, por tanto, se establecería una
correspondencia instantánea entre la nube de puntos generada por la cámara de profundidad
y el modelo de mano 3D que aparace por pantalla. Para buscar las correspondencias se
80
calcularían las distancias entre las nubes de puntos y las superficies del modelo de mano en
3D, aplicando ICP de punto a superficie. Así, si vamos moviendo nuestra mano delante de la
cámara, veríamos por pantalla como el modelo de mano en 3D va adoptando los mismos
gestos, dando lugar a una autocopia virtual de la mano. Esta idea se aprecia en la Figura 9.2.
El primer paso, sería programar una GUI donde se integrararía en un mismo sistema, la
adquisición de las imágenes captadas con las cámaras ToF y color y su correspondiente
visualización en tiempo real; el modelo de mano cilíndrico en 3D; y una base de datos de
símbolos para interpretar los gestos de la mano reconocidos como símbolos.
El siguiente paso sería detectar la posición de la mano y la configuración de los dedos.
Para ello primero habrá que definir las restricciones del movimiento de la mano aplicando el
modelo de articulación de bandas elásticas al modelo cilíndrico de mano descrito en el capítulo
5, mediante las clases y atributos ya predefinidos de la librería Coin 3D. Luego habrá que
inicializar el tracking, es decir, al principio el modelo virtual de mano en 3D estará quieto y
nuestra mano se irá moviendo ante el sensor de la cámara 3D para ajustar la nube de puntos
de la mano a los cilindros del modelo mediante las distancias calculadas. Una vez todos los
cilindros se hayan encontrado entonces comenzaría el tracking, y nos daría unos ángulos entre
los diferentes cilindros que forman la mano mediante ICP.
Finalmente, el último paso sería reconocer los símbolos o patrones comparando la
posición de las manos obtenida con la cámara 3D, con una base de datos de símbolos. Para
encontrar a qué signo corresponde la posición actual se propone que en cada signo la mano se
tiene que parar un rato. Así sabremos que se trata de un signo y no del movimiento de hacer
el signo (cuando se pasa de un signo a otro). Luego, para buscar de qué signo se puede tratar,
se propone almacenar sólo las posiciones relativas de los cilindros para codificar cada símbolo,
así la búsqueda en la base de datos es más simple ya que sólo se buscan relaciones
geométricas entre cilindros.
81
Figura 9.1: Algoritmo implementado.
Figura 9.2: Modelo de tracking.
NUBE DE PUNTOS 1 NUBE DE PUNTOS 2
TRANSFORMACIÓN 1
NUBE DE PUNTOS 3
TRANSFORMACIÓN 2
NUBE DE PUNTOS n
TRANSFORMACIÓN n
MODELO DE MANO
NUBE DE PUNTOS 1
MODELO TRANSFOR
MADO 1
NUBE DE PUNTOS 2
MODELO TRANSFOR
MADO 2
NUBE DE PUNTOS 3
MODELO TRANSFOR
MADO 3
NUBE DE PUNTOS n
NUBE DE PUNTOS n
ICP 1 ICP 2 ICP 3
3 ICP n
H 1 H 2 H 3 H n
ICP 1 ICP 2 ICP n
H 1 H 2 Hn
82
PARTE IV Bibliografía
83
BIBLIOGRAFÍA
[1] S.-C. Sun, C. Rosales, and R. Suárez (2010), "Study of coordinated motions of the human hand for robotic applications”. In: IEEE International Conference on Information and Automation, pp. 776-781. http://iocnet.upc.edu/usuaris/RaulSuarez/papers/icia10-srs.pdf
[2] E. Kollorz, J. Penne, J. Hornegger, and A. Barke, “Gesture recognition with a time-of-flight camera”. In: International Journal of Intelligent Systems Technologies and Applications 5 (2008) No. 3/4 pp.334-343 http://www.pmdtec.com/fileadmin/pmdtec/downloads/publications/pmd_02_gesture_recognition.pdf
[3] M. Flasinski and S. Myslinski, “On the use of graph parsing for recognition of isolated hand postures of Polish Sign Language”. In: Pattern Recognition, vol. 43, no. 6, pp. 2249_2264, 2010. http://www.sciencedirect.com/science?_ob=MImg&_imagekey=B6V14-4Y5GXTV-1-1D&_cdi=5664&_user=1517299&_pii=S0031320310000361&_origin=gateway&_coverDate=06%2F30%2F2010&_sk=999569993&view=c&wchp=dGLzVzz-zSkzS&md5=abfd3a0e9094cdf8a1e56b06f3171fb5&ie=/sdarticle.pdf
[4] N. Tanibata, N. Shimada, and Y. Shirai, “Extraction of hand features for recognition of sign language words”. In: International Conference on Vision Interface, 2002, pp. 391_398. http://www.cipprs.org/vi2002/pdf/s7-7.pdf
[5] Pia Breuer, Christian Eckes, and Stefan Müller, “Hand gesture recognition with a novel IR time-of-flight range camera - A pilot study”. In: Proceedings of the 3rd International Conference on Computer Vision/Computer Graphics, volume 4418, pages 247–260, Rocquencourt, Mar. 2007. http://www.uni-koblenz.de/~cg/Veroeffentlichungen/BreuerEckesMueller.pdf
[6] B. Stenger, P.R.S. Mendonca, R. Cipolla, “Model-based 3D tracking of an articulated hand”. In: IEEE Computer Society Conference on Computer Vision and Pattern Recognition, 02 (2001) 310. http://mi.eng.cam.ac.uk/reports/svr-ftp/stenger_cvpr01.pdf
[7] Ali Erol, George Bebis, Mircea Nicolescu, Richard D. Boyle, Xander Twombly, “Vision-based hand pose estimation: A review”. In: Computer Vision and Image Understanding In Special Issue on Vision for Human-Computer Interaction, Vol. 108, No. 1-2. (October 2007), pp. 52-73. http://www.cs.unr.edu/~bebis/handposerev.pdf
[8] T. R. Stephan Hussmann and B. Hagebeuker, “A Performance Review of 3D TOF Vision Systems in Comparison to Stereo Vision Systems”. In: Stereo Vision, Asim Bhatti (Ed.), 2008. http://www.pmdtec.com/fileadmin/pmdtec/downloads/documentation/White_Paper_3D_TOFvs.Stereo.pdf
84
[9] F. Yuan, A. Swadzba, R. Philippsen, O. Engin, M. Hanheide, and S. Wachsmuth. “Laser-based Navigation Enhanced with 3D Time-of-Flight Data”. In: Proceedings of the IEEE International Conference on Robotics and Automation, pages 2844–2850, Kobe, May 2009. http://aiweb.techfak.uni-bielefeld.de/files/ICRA09_0917.pdf
[10] Thierry Oggier, Bernhard Büttgen, Felix Lustenberger. “SwissRanger SR3000 and First Experiences based on Miniaturized 3D-TOF Cameras”. In: Swiss Center for Electronics and Microtechnology, CSEM, Badenerstrasse 569, 8048 Zurich, SWITZERLAND. http://www.j-clavis.co.jp/pdf/h-4.pdf
[11] S. Knoop, S. Vacek, K. Steinbach and R. Dillmann, “Sensor fusion for model based 3D tracking”. In: Proceedings of the IEEE International Conference on Multi Sensor Fusion and Integration (MFI), 2006. http://i61www.ira.uka.de/dilepis2/data/File/Publications/MFI-Knoop.pdf
[12] Ali Erol, George Bebis, Mircea Nicolescu, Richard D. Boyle, Xander Twombly, “A Review on Vision-Based Full DOF Hand Motion Estimation”. In: Computer Vision and Pattern Recognition, 2005 IEEE Computer Society Conference on. 07/2005. http://www.cs.unr.edu/~bebis/vhci05.pdf
[13] M. Bray, E. Koller-Meier, L.V. Gool, “Smart particle filtering for 3D hand tracking”. In: Sixth IEEE International Conference on Automatic Face and Gesture Recognition, IEEE Computer Society, Los Alamitos, CA, USA, 2004, p. 675. http://www.koller-meier.ch/esther/eth_biwi_00295.pdf
[14] M. Bray, E. Koller-Meier, P. Müller, L.V. Gool, N.N. Schraudolph, “3D Hand tracking by
rapid stochastic gradient descent using a skinning model”. In: First European Conference
on Visual Media Production, London, 2004, pp. 59–68.
http://www.koller-meier.ch/esther/eth_biwi_00288.pdf
[15] K. Nirei, H. Saito, M. Mochimaru, S. Ozawa, “Human hand tracking from binocular
image sequences”. In: 22th International Conference on Industrial Electronics, Control, and Instrumentation, 1996, pp.297–302. http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.41.6815
[16] J. J. Kuch and T. S. Huang. “Human computer interaction via the human hand: A hand model”.In: Twenty-Eighty Asilomar Conference on Signal, Systems, and Computers, pages 1252– 1256, 1994. http://ieeexplore.ieee.org/iel2/3310/9942/00471659.pdf
[17] H. Hu, X. Gao, J. Li, J. Wang, H. Liu, “Calibrating human hand for teleoperating the hit/dlr hand”, In: IEEE International Conference on Robotics and Automation, vol. 5, 2004, pp. 4571–4576 http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.87.396
[18] I. Albrecht, J. Haber, H.-P. Seidel, “Construction and animation of anatomically based human hand models”. In: ACM SIGGRAPH/ Eurographics Symposium on Computer Animation, Eurographics Association, 2003, pp. 98–109. http://www.mpi-inf.mpg.de/resources/VirtualHumans/publ/sca2003.pdf
85
[19] J.J. Kuch, T.S. Huang, “Human computer interaction via the human hand: a hand model”.In: Twenty-Eighty Asilomar Conference on Signal, Systems, and Computers, 1994, pp. 1252– 1256. http://ieeexplore.ieee.org/xpl/freeabs_all.jsp?arnumber=471659
[20] Paul J. Besl and Neil D. McKay, “A method for registration of 3D shapes”. In: IEEE Transactions on Pattern Analysis and Machince Intelligence, 14(2):239–256, 1992. http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=121791&tag=1
[21] R. Valencia, E.H. Teniente, E. Trulls Fortuny, J. Andrade-Cetto. “3D mapping for urban service robots”. In: The 2009 IEEE/RSJ International Conference on Intelligent Robots and Systems, October 11-15, 2009 St. Louis, USA http://upcommons.upc.edu/e-prints/handle/2117/6935
[22] Greg Turk and Marc Levoy. “Zippered polygon meshes from range images”. In: Computer Graphics, SIGGRAPH 1994 Proceedings, pages 311–318. ACM Press, New York, NY, 1994. https://graphics.stanford.edu/papers/zipper/zipper.pdf
[23] Kari Pulli, “Multiview registration for large datasets”. In: International Conference on 3D Digital Imaging and Modeling, pages 160–168, Ottawa, Canada, 1999. http://graphics.stanford.edu/~kapu/3dim99.pdf
[24] Marcus Gross, Hanspeter Pfister, “Point-Based Graphics (The Morgan Kaufmann Series in Computer Graphics)”, Elsevier, 2007. http://www.elsevier.com/wps/find/bookdescription.cws_home/710117/description
[25] Juan Andrade-Cetto, Michael Villamizar. “Object recognition”. J. G. Webster, editor, Wiley Encyclopedia of Electrical and Electronics Engineering, pages 1–28. John Wiley & Sons, New York, 2007. http://digital.csic.es/bitstream/10261/30015/1/doc1.pdf
[26] E.H. Teniente, J. Andrade-Cetto. “Registration of 3D point clouds for urban robot mapping”. In: Technical Report IRI-TR-08-06, Institut de Robòtica i Informàtica Industrial, CSIC-UPC, 2008. http://digital.csic.es/handle/10261/30058
[27] L. Biota, L. Montesano, J. Minguez, F. Lamiraux, “Toward a metric-based scan matching algorithm for displacement estimation in 3D workspaces”, In: Proc. IEEE Int. Conf. Robot. Automat., Orlando, May 2006, pp. 4330–4332. http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.59.798&rep=rep1&type=pdf
[28] “Time-of-flight camera”, In: Wikipedia, the free enciclopedia. http://en.wikipedia.org/wiki/Time-of-flight_camera
86
ANEXO A1: RESULTADOS NUMÉRICOS DE EXTRACCIÓN DE DATOS
EXPERIMENTO 1
Imagen 1 Número de puntos después de limitar la
distancia de los ejes: 3876
Número de puntos después del sampling: 2730
Imagen 2 Número de puntos después de limitar la
distancia de los ejes: 4033
Número de puntos después del sampling: 2736
Resultado de la Matriz Homogénea de la Transformación 1:
Traslación de puntos en metros: Tx: -0.0030 Ty: 0.0644 Tz: 0.0241
Ángulos de Euler de rotación en grados:
Rx: 7.8669 Ry: 0.4471 Rz: -0.4249
Ángulos de Euler de rotación en radianes: Rx: 0.1458 Ry: 0.0065 Rz: -0.0113
87
Imagen 2 Número de puntos después de limitar la
distancia de los ejes: 4033
Número de puntos después del sampling: 2736
Imagen 3 Número de puntos después de limitar la
distancia de los ejes: 4140
Número de puntos después del sampling: 2738
Resultado de la Matriz Homogénea de la Transformación 2:
Traslación de puntos en metros: Tx: 0.0085 Ty: 0.0551 Tz: 0.0188
Ángulos de Euler de rotación en grados:
Rx: 7.1704 Ry: -1.1298 Rz: -0.8858
Ángulos de Euler de rotación en radianes: Rx: 0.1258 Ry: -0.0144 Rz: -0.0183
88
Imagen 3 Número de puntos después de limitar la
distancia de los ejes: 4140
Número de puntos después del sampling: 2738
Imagen 4 Número de puntos después de limitar la
distancia de los ejes: 4155
Número de puntos después del sampling: 2679
Resultado de la Matriz Homogénea de la Transformación 3:
Traslación de puntos en metros: Tx: -0.0027 Ty: 0.0532 Tz: 0.0183
Ángulos de Euler de rotación en grados:
Rx: 6.7651 Ry: 0.4691 Rz: -0.8038
Ángulos de Euler de rotación en radianes: Rx: 0.1181 Ry: 0.0082 Rz: -0.0140
89
Imagen 4 Número de puntos después de limitar la
distancia de los ejes: 4155
Número de puntos después del sampling: 2679
Imagen 5 Número de puntos después de limitar la
distancia de los ejes: 4081
Número de puntos después del sampling: 2601
Resultado de la Matriz Homogénea de la Transformación 4:
Traslación de puntos en metros: Tx: 0.0044 Ty: 0.0385 Tz: 0.0107
Ángulos de Euler de rotación en grados:
Rx: 4.9050 Ry: -0.1441 Rz: -2.2010
Ángulos de Euler de rotación en radianes: Rx: 0.0856 Ry: -0.0025 Rz: -0.0384
90
Imagen 5 Número de puntos después de limitar la
distancia de los ejes: 4081
Número de puntos después del sampling: 2601
Imagen 6 Número de puntos después de limitar la
distancia de los ejes: 3866
Número de puntos después del sampling: 2360
Resultado de la Matriz Homogénea de la Transformación 5:
Traslación de puntos en metros: Tx: -0.0022 Ty: 0.0741 Tz: 0.0265
Ángulos de Euler de rotación en grados:
Rx: 9.4139 Ry: 0.7772 Rz: -1.6071
Ángulos de Euler de rotación en radianes: Rx: 0.1643 Ry: 0.0136 Rz: -0.0280
91
Imagen 6 Número de puntos después de limitar la
distancia de los ejes: 3866
Número de puntos después del sampling: 2360
Imagen 7 Número de puntos después de limitar la
distancia de los ejes: 4154
Número de puntos después del sampling: 2621
Resultado de la Matriz Homogénea de la Transformación 6:
Traslación de puntos en metros:
Tx: -0.0068 Ty: -0.0744 Tz: -0.0073
Ángulos de Euler de rotación en grados: Rx: -8.5485 Ry: 0.6263 Rz: 4.3153
Ángulos de Euler de rotación en radianes:
Rx: -0.1492 Ry: 0.0109 Rz: 0.0753
92
Imagen 7 Número de puntos después de limitar la
distancia de los ejes: 4154
Número de puntos después del sampling: 2621
Imagen 8 Número de puntos después de limitar la
distancia de los ejes: 4136
Número de puntos después del sampling: 2646
Resultado de la Matriz Homogénea de la Transformación 7:
Traslación de puntos en metros:
Tx: -0.0033 Ty: -0.0495 Tz: -0.0077
Ángulos de Euler de rotación en grados: Rx: -5.7364 Ry: 0.2038 Rz: 3.4335
Ángulos de Euler de rotación en radianes:
Rx: -0.1001 Ry: 0.0036 Rz: 0.0599
93
Imagen 8 Número de puntos después de limitar la
distancia de los ejes: 4136
Número de puntos después del sampling: 2646
Imagen 9 Número de puntos después de limitar la
distancia de los ejes: 3852
Número de puntos después del sampling: 2616
Resultado de la Matriz Homogénea de la Transformación 8:
Traslación de puntos en metros: Tx: 0.0073 Ty: -0.1032 Tz: -0.0155
Ángulos de Euler de rotación en grados:
Rx: -12.7768 Ry: -0.7986 Rz: 0.9192
Ángulos de Euler de rotación en radianes: Rx: -0.2246 Ry: -0.0178 Rz: 0.0205
94
Imagen 9 Número de puntos después de limitar la
distancia de los ejes: 3852
Número de puntos después del sampling: 2616
Imagen 10 Número de puntos después de limitar la
distancia de los ejes: 3786
Número de puntos después del sampling: 2559
Resultado de la Matriz Homogénea de la Transformación 9:
Traslación de puntos en metros: Tx: 0.0142 Ty: -0.1012 Tz: 0.0038
Ángulos de Euler de rotación en grados:
Rx: -13.8633 Ry: -0.8278 Rz: 0.3331
Ángulos de Euler de rotación en radianes: Rx: -0.2384 Ry: -0.0175 Rz: 0.0026
95
Imagen 10 Número de puntos después de limitar la
distancia de los ejes: 3786
Número de puntos después del sampling: 2559
Imagen 11 Número de puntos después de limitar la
distancia de los ejes: 3819
Número de puntos después del sampling: 2555
Resultado de la Matriz Homogénea de la Transformación 10:
Traslación de puntos en metros:
Tx: -5.3900e-04 Ty: -0.0716 Tz: 0.0140
Ángulos de Euler de rotación en grados: Rx: -9.1677 Ry: 0.0081 Rz: 2.1745
Ángulos de Euler de rotación en radianes:
Rx: -0.1591 Ry: -0.0028 Rz: 0.0415
96
Imagen 11 Número de puntos después de limitar la
distancia de los ejes: 3819
Número de puntos después del sampling: 2555
Imagen 12 Número de puntos después de limitar la
distancia de los ejes: 3967
Número de puntos después del sampling: 2563
Resultado de la Matriz Homogénea de la Transformación 11:
Traslación de puntos en metros: Tx: 0.0107 Ty: -0.0472 Tz: 0.0131
Ángulos de Euler de rotación en grados:
Rx: -6.2657 Ry: -1.2586 Rz: 0.2173
Ángulos de Euler de rotación en radianes: Rx: -0.1157 Ry: -0.0257 Rz: 0.0037
97
Imagen 12 Número de puntos después de limitar la
distancia de los ejes: 3967
Número de puntos después del sampling: 2563
Imagen 13 Número de puntos después de limitar la
distancia de los ejes: 4293
Número de puntos después del sampling: 2623
Resultado de la Matriz Homogénea de la Transformación 12:
Traslación de puntos en metros: Tx: 0.0013 Ty: -0.0392 Tz: 0.0161
Ángulos de Euler de rotación en grados:
Rx: -6.6852 Ry: 0.5900 Rz: 0.0552
Ángulos de Euler de rotación en radianes: Rx: -0.1057 Ry: 0.0084 Rz: -0.0093
98
Imagen 13 Número de puntos después de limitar la
distancia de los ejes: 4293
Número de puntos después del sampling: 2623
Imagen 14 Número de puntos después de limitar la
distancia de los ejes: 4182
Número de puntos después del sampling: 2561
Resultado de la Matriz Homogénea de la Transformación 13:
Traslación de puntos en metros: Tx: 0.0100 Ty: -0.0413 Tz: 0.0043
Ángulos de Euler de rotación en grados:
Rx: -6.7350 Ry: 0.6485 Rz: -2.9397
Ángulos de Euler de rotación en radianes: Rx: -0.1120 Ry: 0.0025 Rz: -0.0373
99
EXPERIMENTO 2
Imagen 1 Número de puntos después de limitar la
distancia de los ejes: 2529
Número de puntos después del sampling: 2227
Imagen 2 Número de puntos después de limitar la
distancia de los ejes: 2725
Número de puntos después del sampling: 2386
Resultado de la Matriz Homogénea de la Transformación 1:
Traslación de puntos en metros: Tx: -0.0223 Ty: 0.0104 Tz: 0.0122
Ángulos de Euler de rotación en grados:
Rx: 0.9061 Ry: 4.5442 Rz: -6.3470
Ángulos de Euler de rotación en radianes: Rx: 0.0158 Ry: 0.0793 Rz: -0.1108
100
Imagen 2 Número de puntos después de limitar la
distancia de los ejes: 2725
Número de puntos después del sampling: 2386
Imagen 3 Número de puntos después de limitar la
distancia de los ejes: 2973
Número de puntos después del sampling: 2557
Resultado de la Matriz Homogénea de la Transformación 2:
Traslación de puntos en metros: Tx: -0.0324 Ty: 0.0355 Tz: 0.0174
Ángulos de Euler de rotación en grados:
Rx: 4.3418 Ry: 5.1436 Rz: -3.5202
Ángulos de Euler de rotación en radianes: Rx: 0.0758 Ry: 0.0898 Rz: -0.0614
101
Imagen 3 Número de puntos después de limitar la
distancia de los ejes: 2973
Número de puntos después del sampling: 2557
Imagen 4 Número de puntos después de limitar la
distancia de los ejes: 3310
Número de puntos después del sampling: 2786
Resultado de la Matriz Homogénea de la Transformación 3:
Traslación de puntos en metros: Tx: -0.0483 Ty: 0.0719 Tz: 0.0344
Ángulos de Euler de rotación en grados:
Rx: 10.0199 Ry: 5.3641 Rz: 1.5745
Ángulos de Euler de rotación en radianes: Rx: 0.1749 Ry: 0.0936 Rz: 0.0275
102
Imagen 4 Número de puntos después de limitar la
distancia de los ejes: 3310
Número de puntos después del sampling: 2786
Imagen 5 Número de puntos después de limitar la
distancia de los ejes: 3601
Número de puntos después del sampling: 3016
Resultado de la Matriz Homogénea de la Transformación 4:
Traslación de puntos en metros: Tx: -0.0393 Ty: 0.0622 Tz: 0.0297
Ángulos de Euler de rotación en grados:
Rx: 9.3641 Ry: 3.2002 Rz: 4.8045
Ángulos de Euler de rotación en radianes: Rx: 0.1634 Ry: 0.0559 Rz: 0.0839
103
Imagen 5 Número de puntos después de limitar la
distancia de los ejes: 3601
Número de puntos después del sampling: 3016
Imagen 6 Número de puntos después de limitar la
distancia de los ejes: 3708
Número de puntos después del sampling: 3048
Resultado de la Matriz Homogénea de la Transformación 5:
Traslación de puntos en metros: Tx: -0.0281 Ty: 0.0673 Tz: 0.0329
Ángulos de Euler de rotación en grados:
Rx: 10.3754 Ry: 1.6136 Rz: 5.9089
Ángulos de Euler de rotación en radianes: Rx: 0.1811 Ry: 0.0282 Rz: 0.1031
104
Imagen 6 Número de puntos después de limitar la
distancia de los ejes: 3708
Número de puntos después del sampling: 3048
Imagen 7 Número de puntos después de limitar la
distancia de los ejes: 3778
Número de puntos después del sampling: 3058
Resultado de la Matriz Homogénea de la Transformación 6:
Traslación de puntos en metros: Tx: -0.0170 Ty: 0.0261 Tz: 0.0120
Ángulos de Euler de rotación en grados:
Rx: 4.0638 Ry: 1.4547 Rz: 2.3613
Ángulos de Euler de rotación en radianes: Rx: 0.0709 Ry: 0.0254 Rz: 0.0412
105
Imagen 7 Número de puntos después de limitar la
distancia de los ejes: 3778
Número de puntos después del sampling: 3058
Imagen 8 Número de puntos después de limitar la
distancia de los ejes: 3841
Número de puntos después del sampling: 3039
Resultado de la Matriz Homogénea de la Transformación 7:
Traslación de puntos en metros: Tx: -0.0150 Ty: 0.0499 Tz: 0.0210
Ángulos de Euler de rotación en grados:
Rx: 7.7149 Ry: 0.8994 Rz: 3.5293
Ángulos de Euler de rotación en radianes: Rx: 0.1347 Ry: 0.0157 Rz: 0.0616
106
Imagen 8 Número de puntos después de limitar la
distancia de los ejes: 3841
Número de puntos después del sampling: 3039
Imagen 9 Número de puntos después de limitar la
distancia de los ejes: 3759
Número de puntos después del sampling: 2915
Resultado de la Matriz Homogénea de la Transformación 8:
Traslación de puntos en metros: Tx: -0.0108 Ty: 0.0574 Tz: 0.0183
Ángulos de Euler de rotación en grados:
Rx: 9.0684 Ry: -0.7991 Rz: 6.8207
Ángulos de Euler de rotación en radianes: Rx: 0.1583 Ry: -0.0139 Rz: 0.1190
107
Imagen 9 Número de puntos después de limitar la
distancia de los ejes: 3759
Número de puntos después del sampling: 2915
Imagen 10 Número de puntos después de limitar la
distancia de los ejes: 3702
Número de puntos después del sampling: 2941
Resultado de la Matriz Homogénea de la Transformación 9:
Traslación de puntos en metros:
Tx: 9.8783e-04 Ty: -0.0171 Tz: -0.0058
Ángulos de Euler de rotación en grados: Rx: -0.7616 Ry: -2.5713 Rz: 14.0041
Ángulos de Euler de rotación en radianes:
Rx: -0.0133 Ry: -0.0449 Rz: 0.2444
108
Imagen 10 Número de puntos después de limitar la
distancia de los ejes: 3702
Número de puntos después del sampling: 2941
Imagen 11 Número de puntos después de limitar la
distancia de los ejes: 3773
Número de puntos después del sampling: 3003
Resultado de la Matriz Homogénea de la Transformación 10:
Traslación de puntos en metros:
Tx: -0.0290 Ty: -0.0812 Tz: -0.0045
Ángulos de Euler de rotación en grados: Rx: -9.2554 Ry: 3.2628 Rz: 8.0146
Ángulos de Euler de rotación en radianes:
Rx: -0.1615 Ry: 0.0569 Rz: 0.1399
109
Imagen 11 Número de puntos después de limitar la
distancia de los ejes: 3773
Número de puntos después del sampling: 3003
Imagen 12 Número de puntos después de limitar la
distancia de los ejes: 3518
Número de puntos después del sampling: 2912
Resultado de la Matriz Homogénea de la Transformación 11:
Traslación de puntos en metros:
Tx: -0.0335 Ty: -0.1057 Tz: -0.0057
Ángulos de Euler de rotación en grados: Rx: -13.3050 Ry: 4.2011 Rz: 2.9652
Ángulos de Euler de rotación en radianes:
Rx: -0.2322 Ry: 0.0733 Rz: 0.0518
110
Imagen 12 Número de puntos después de limitar la
distancia de los ejes: 3518
Número de puntos después del sampling: 2912
Imagen 13 Número de puntos después de limitar la
distancia de los ejes: 3170
Número de puntos después del sampling: 2638
Resultado de la Matriz Homogénea de la Transformación 12:
Traslación de puntos en metros: Tx: -0.0475 Ty: -0.1005 Tz: 0.0027
Ángulos de Euler de rotación en grados:
Rx: -13.2289 Ry: 6.2220 Rz: 0.0785
Ángulos de Euler de rotación en radianes: Rx: -0.2309 Ry: 0.1086 Rz: 0.0014
111
Imagen 13 Número de puntos después de limitar la
distancia de los ejes: 3170
Número de puntos después del sampling: 2638
Imagen 14 Número de puntos después de limitar la
distancia de los ejes: 2987
Número de puntos después del sampling: 2547
Resultado de la Matriz Homogénea de la Transformación 13:
Traslación de puntos en metros:
Tx: -0.0386 Ty: -0.0610 Tz: -0.0046
Ángulos de Euler de rotación en grados: Rx: -8.6973 Ry: 4.2742 Rz: -5.0207
Ángulos de Euler de rotación en radianes:
Rx: -0.1518 Ry: 0.0746 Rz: -0.0876
112
Imagen 14 Número de puntos después de limitar la
distancia de los ejes: 2987
Número de puntos después del sampling: 2547
Imagen 15 Número de puntos después de limitar la
distancia de los ejes: 2539
Número de puntos después del sampling: 2239
Resultado de la Matriz Homogénea de la Transformación 14:
Traslación de puntos en metros:
Tx: -0.0055 Ty: -0.0434 Tz: -0.0144
Ángulos de Euler de rotación en grados: Rx: -6.8863 Ry: 0.9340 Rz: -13.0066
Ángulos de Euler de rotación en radianes:
Rx: -0.1202 Ry: 0.0163 Rz: -0.2270
113
EXPERIMENTO 3
Imagen 1 Número de puntos resultantes totales: 2988
Número de puntos del pulgar: 285
Imagen 2 Número de puntos resultantes totales: 2992
Número de puntos del pulgar: 291
Resultado de la Matriz Homogénea de la Transformación 1 del pulgar:
Traslación de puntos en metros: Tx: 0.0313 Ty: 0.0013 Tz: -0.0037
Ángulos de Euler de rotación en grados:
Rx: 0.1034 Ry: -4.6620 Rz: 2.9549
Ángulos de Euler de rotación en radianes: Rx: 0.0018 Ry: -0.0814 Rz: 0.0516
114
Imagen 2 Número de puntos resultantes totales: 2992
Número de puntos del pulgar: 291
Imagen 3 Número de puntos resultantes totales: 3006
Número de puntos del pulgar: 280
Resultado de la Matriz Homogénea de la Transformación 2 del pulgar:
Traslación de puntos en metros: Tx: -0.0274 Ty: 0.0180 Tz: 0.0038
Ángulos de Euler de rotación en grados:
Rx: 2.6608 Ry: 3.3608 Rz: 2.0888
Ángulos de Euler de rotación en radianes: Rx: 0.0464 Ry: 0.0587 Rz: 0.0365
115
Imagen 3 Número de puntos resultantes totales: 3006
Número de puntos del pulgar: 280
Imagen 4 Número de puntos resultantes totales: 2989
Número de puntos del pulgar: 299
Resultado de la Matriz Homogénea de la Transformación 3 del pulgar:
Traslación de puntos en metros: Tx: 0.0105 Ty: 0.0213 Tz: -0.0024
Ángulos de Euler de rotación en grados:
Rx: 2.6843 Ry: -1.8621 Rz: 3.5809
Ángulos de Euler de rotación en radianes: Rx: 0.0468 Ry: -0.0325 Rz: 0.0625
116
Imagen 4 Número de puntos resultantes totales: 2989
Número de puntos del pulgar: 299
Imagen 5 Número de puntos resultantes totales: 2969
Número de puntos del pulgar: 284
Resultado de la Matriz Homogénea de la Transformación 4 del pulgar:
Traslación de puntos en metros: Tx: 0.0374 Ty: -0.0071 Tz: -0.0035
Ángulos de Euler de rotación en grados:
Rx: -0.9766 Ry: -5.0252 Rz: 3.6905
Ángulos de Euler de rotación en radianes: Rx: -0.0170 Ry: -0.0877 Rz: 0.0644
117
Imagen 5 Número de puntos resultantes totales: 2969
Número de puntos del pulgar: 284
Imagen 6 Número de puntos resultantes totales: 2956
Número de puntos del pulgar: 280
Resultado de la Matriz Homogénea de la Transformación 5 del pulgar:
Traslación de puntos en metros: Tx: -0.0490 Ty: 0.0637 Tz: 0.0123
Ángulos de Euler de rotación en grados:
Rx: 9.2620 Ry: 4.9921 Rz: 6.7904
Ángulos de Euler de rotación en radianes: Rx: 0.1617 Ry: 0.0871 Rz: 0.1185
118
Imagen 6 Número de puntos resultantes totales: 2956
Número de puntos del pulgar: 280
Imagen 7 Número de puntos resultantes totales: 2967
Número de puntos del pulgar: 296
Resultado de la Matriz Homogénea de la Transformación 6 del pulgar:
Traslación de puntos en metros:
Tx: 0.0852 Ty: -0.0290 Tz: 5.2627e-04
Ángulos de Euler de rotación en grados: Rx: -4.3438 Ry: -11.1739 Rz: 2.0721
Ángulos de Euler de rotación en radianes:
Rx: -0.0758 Ry: -0.1950 Rz: 0.0362
119
Imagen 7 Número de puntos resultantes totales: 2967
Número de puntos del pulgar: 296
Imagen 8 Número de puntos resultantes totales: 2977
Número de puntos del pulgar: 271
Resultado de la Matriz Homogénea de la Transformación 7 del pulgar:
Traslación de puntos en metros: Tx: -0.0843 Ty: 0.0784 Tz: 0.0246
Ángulos de Euler de rotación en grados:
Rx: 10.2034 Ry: 10.5205 Rz: 1.9458
Ángulos de Euler de rotación en radianes: Rx: 0.1781 Ry: 0.1836 Rz: 0.0340
120
Imagen 8 Número de puntos resultantes totales: 2977
Número de puntos del pulgar: 271
Imagen 9 Número de puntos resultantes totales: 2963
Número de puntos del pulgar: 260
Resultado de la Matriz Homogénea de la Transformación 8 del pulgar:
Traslación de puntos en metros: Tx: 0.0389 Ty: 0.0503 Tz: 0.0063
Ángulos de Euler de rotación en grados:
Rx: 5.9028 Ry: -6.0857 Rz: 5.0328
Ángulos de Euler de rotación en radianes: Rx: 0.1030 Ry: -0.1062 Rz: 0.0878
121
Imagen 9 Número de puntos resultantes totales: 2963
Número de puntos del pulgar: 260
Imagen 10 Número de puntos resultantes totales: 2916
Número de puntos del pulgar: 270
Resultado de la Matriz Homogénea de la Transformación 9 del pulgar:
Traslación de puntos en metros: Tx: 0.0415 Ty: 0.0205 Tz: 0.0093
Ángulos de Euler de rotación en grados:
Rx: 3.2922 Ry: -3.6775 Rz: -9.0413
Ángulos de Euler de rotación en radianes: Rx: 0.0575 Ry: -0.0642 Rz: -0.1578
122
Imagen 10 Número de puntos resultantes totales: 2916
Número de puntos del pulgar: 270
Imagen 11 Número de puntos resultantes totales: 2877
Número de puntos del pulgar: 241
Resultado de la Matriz Homogénea de la Transformación 10 del pulgar:
Traslación de puntos en metros: Tx: 0.0224 Ty: 0.0131 Tz: 0.0073
Ángulos de Euler de rotación en grados:
Rx: 1.9930 Ry: -1.8356 Rz: -6.5506
Ángulos de Euler de rotación en radianes: Rx: 0.0348 Ry: -0.0320 Rz: -0.1143
123
Imagen 11 Número de puntos resultantes totales: 2877
Número de puntos del pulgar: 241
Imagen 12 Número de puntos resultantes totales: 2817
Número de puntos del pulgar: 241
Resultado de la Matriz Homogénea de la Transformación 11 del pulgar:
Traslación de puntos en metros: Tx: 0.0659 Ty: 0.0083 Tz: 0.0070
Ángulos de Euler de rotación en grados:
Rx: 1.3207 Ry: -7.9176 Rz: 0.8200
Ángulos de Euler de rotación en radianes: Rx: 0.0231 Ry: -0.1382 Rz: 0.0143
124
Imagen 12 Número de puntos resultantes totales: 2817
Número de puntos del pulgar: 241
Imagen 13 Número de puntos resultantes totales: 2762
Número de puntos del pulgar: 235
Resultado de la Matriz Homogénea de la Transformación 12 del pulgar:
Traslación de puntos en metros: Tx: 0.0475 Ty: -0.0065 Tz: 0.0029
Ángulos de Euler de rotación en grados:
Rx: -0.7289 Ry: -5.9160 Rz: 0.9091
Ángulos de Euler de rotación en radianes: Rx: -0.0127 Ry: -0.1033 Rz: 0.0159
125
Imagen 13 Número de puntos resultantes totales: 2762
Número de puntos del pulgar: 235
Imagen 14 Número de puntos resultantes totales: 2748
Número de puntos del pulgar: 206
Resultado de la Matriz Homogénea de la Transformación 13 del pulgar:
Traslación de puntos en metros: Tx: 0.0046 Ty: 0.0227 Tz: 0.0025
Ángulos de Euler de rotación en grados:
Rx: 2.9458 Ry: 1.6365 Rz: -13.9675
Ángulos de Euler de rotación en radianes: Rx: 0.0514 Ry: 0.0286 Rz: -0.2438
126
Imagen 14 Número de puntos resultantes totales: 2748
Número de puntos del pulgar: 206
Imagen 15 Número de puntos resultantes totales: 2691
Número de puntos del pulgar: 179
Resultado de la Matriz Homogénea de la Transformación 14 del pulgar:
Traslación de puntos en metros:
Tx: 0.0299 Ty: 0.0096 Tz: 7.1060e-04
Ángulos de Euler de rotación en grados: Rx: 2.2494 Ry: -2.6074 Rz: -7.8736
Ángulos de Euler de rotación en radianes:
Rx: 0.0393 Ry: -0.0455 Rz: -0.1374
127
Imagen 15 Número de puntos resultantes totales: 2691
Número de puntos del pulgar: 179
Imagen 16 Número de puntos resultantes totales: 2651
Número de puntos del pulgar: 193
Resultado de la Matriz Homogénea de la Transformación 15 del pulgar:
Traslación de puntos en metros: Tx: 0.0455 Ty: 0.0204 Tz: 0.0035
Ángulos de Euler de rotación en grados:
Rx: 3.6135 Ry: -5.3647 Rz: -2.3354
Ángulos de Euler de rotación en radianes: Rx: 0.0631 Ry: -0.0936 Rz: -0.0408
128
Imagen 16 Número de puntos resultantes totales: 2651
Número de puntos del pulgar: 193
Imagen 17 Número de puntos resultantes totales: 2583
Número de puntos del pulgar: 217
Resultado de la Matriz Homogénea de la Transformación 16 del pulgar:
Traslación de puntos en metros:
Tx: 3.2236e-04 Ty: -0.0351 Tz: -0.0040
Ángulos de Euler de rotación en grados: Rx: -4.1044 Ry:0.4197 Rz: -8.0057
Ángulos de Euler de rotación en radianes:
Rx: -0.0716 Ry: 0.0073 Rz: -0.1397
129
Imagen 17 Número de puntos resultantes totales: 2583
Número de puntos del pulgar: 217
Imagen 18 Número de puntos resultantes totales: 2690
Número de puntos del pulgar: 193
Resultado de la Matriz Homogénea de la Transformación 17 del pulgar:
Traslación de puntos en metros: Tx: -0.0175 Ty: -0.0129 Tz: 0.0025
Ángulos de Euler de rotación en grados:
Rx: -1.3560 Ry: 1.0383 Rz: 12.9717
Ángulos de Euler de rotación en radianes: Rx: -0.0237 Ry: 0.0181 Rz: 0.2264
130
Imagen 18 Número de puntos resultantes totales: 2690
Número de puntos del pulgar: 193
Imagen 19 Número de puntos resultantes totales: 2736
Número de puntos del pulgar: 218
Resultado de la Matriz Homogénea de la Transformación 18 del pulgar:
Traslación de puntos en metros: Tx: 0.0636 Ty: -0.0063 Tz: 0.0029
Ángulos de Euler de rotación en grados:
Rx: -3.2972 Ry: -9.4401 Rz: 15.0482
Ángulos de Euler de rotación en radianes: Rx: -0.0575 Ry: -0.1648 Rz: 0.2626
131
Imagen 19 Número de puntos resultantes totales: 2736
Número de puntos del pulgar: 218
Imagen 20 Número de puntos resultantes totales: 2769
Número de puntos del pulgar: 194
Resultado de la Matriz Homogénea de la Transformación 19 del pulgar:
Traslación de puntos en metros: Tx: 0.0365 Ty: -0.0019 Tz: 0.0018
Ángulos de Euler de rotación en grados:
Rx: -1.4684 Ry: -6.2413 Rz: 14.2863
Ángulos de Euler de rotación en radianes: Rx: -0.0256 Ry: -0.1089 Rz: 0.2493
132
Imagen 20 Número de puntos resultantes totales: 2769
Número de puntos del pulgar: 194
Imagen 21 Número de puntos resultantes totales: 2873
Número de puntos del pulgar: 246
Resultado de la Matriz Homogénea de la Transformación 20 del pulgar:
Traslación de puntos en metros:
Tx: -0.0204 Ty: -0.0560 Tz: -0.0061
Ángulos de Euler de rotación en grados: Rx: -6.8123 Ry: 2.0756 Rz: 11.0167
Ángulos de Euler de rotación en radianes:
Rx: -0.1189 Ry: 0.0362 Rz: 0.1923
133
Imagen 21 Número de puntos resultantes totales: 2873
Número de puntos del pulgar: 246
Imagen 22 Número de puntos resultantes totales: 2927
Número de puntos del pulgar: 278
Resultado de la Matriz Homogénea de la Transformación 21 del pulgar:
Traslación de puntos en metros: Tx: 0.1566 Ty: -0.1930 Tz: 0.0419
Ángulos de Euler de rotación en grados:
Rx: -31.7577 Ry: -10.7675 Rz: 26.3637
Ángulos de Euler de rotación en radianes: Rx: -0.5543 Ry: -0.1879 Rz: 0.4601
134
Imagen 22 Número de puntos resultantes totales: 2927
Número de puntos del pulgar: 278
Imagen 23 Número de puntos resultantes totales: 2912
Número de puntos del pulgar: 268
Resultado de la Matriz Homogénea de la Transformación 22 del pulgar:
Traslación de puntos en metros: Tx: -0.1483 Ty: -0.0936 Tz: 0.0229
Ángulos de Euler de rotación en grados:
Rx: -13.0383 Ry: 18.1848 Rz: -3.2879
Ángulos de Euler de rotación en radianes: Rx: -0.2276 Ry: 0.3174 Rz: -0.0574
135
Imagen 23 Número de puntos resultantes totales: 2912
Número de puntos del pulgar: 268
Imagen 24 Número de puntos resultantes totales: 2892
Número de puntos del pulgar: 274
Resultado de la Matriz Homogénea de la Transformación 23 del pulgar:
Traslación de puntos en metros:
Tx: -0.0300 Ty: 3.9777e-04 Tz: 0.0026
Ángulos de Euler de rotación en grados: Rx: 0.2812 Ry: 4.4486 Rz: -3.3329
Ángulos de Euler de rotación en radianes:
Rx: 0.0049 Ry: 0.0776 Rz: -0.0582
136
Imagen 24 Número de puntos resultantes totales: 2892
Número de puntos del pulgar: 274
Imagen 25 Número de puntos resultantes totales: 2866
Número de puntos del pulgar: 248
Resultado de la Matriz Homogénea de la Transformación 24 del pulgar:
Traslación de puntos en metros:
Tx: -0.0125 Ty: 0.0110 Tz: 3.8030e-04
Ángulos de Euler de rotación en grados: Rx: 1.3367 Ry: 2.4636 Rz: -4.7067
Ángulos de Euler de rotación en radianes:
Rx: 0.0233 Ry: 0.0430 Rz: -0.0821
137
Imagen 25 Número de puntos resultantes totales: 2866
Número de puntos del pulgar: 248
Imagen 26 Número de puntos resultantes totales: 2857
Número de puntos del pulgar: 252
Resultado de la Matriz Homogénea de la Transformación 25 del pulgar:
Traslación de puntos en metros: Tx: 0.0050 Ty: -0.0194 Tz: 0.0022
Ángulos de Euler de rotación en grados:
Rx: -2.2744 Ry: -0.0653 Rz: -6.9940
Ángulos de Euler de rotación en radianes: Rx: -0.0397 Ry: -0.0011 Rz: -0.1221
138
EXPERIMENTO 4
Imagen 1 Número de puntos del dedio medio:375 Número de puntos del dedo índice: 312
Imagen 2 Número de puntos del dedo medio:380 Número de puntos del dedo índice: 331
Resultado de la Matriz Homogénea de la Transformación 1 del dedo medio:
Traslación de puntos en metros: Tx: -0.0232 Ty: 0.0176 Tz: -0.0012
Ángulos de Euler de rotación en grados:
Rx: 2.7074 Ry: 4.3692 Rz: -4.2695
Ángulos de Euler de rotación en radianes: Rx: 0.0473 Ry: 0.0763 Rz: -0.0745
Resultado de la Matriz Homogénea de la Transformación 1 del dedo índice:
Traslación de puntos en metros: Tx: -0.0096 Ty: 0.0121 Tz: -0.0015
Ángulos de Euler de rotación en grados:
Rx: 1.8514 Ry: 2.0074 Rz: -2.6494
Ángulos de Euler de rotación en radianes: Rx: 0.0323 Ry: 0.0350 Rz: -0.0462
139
Imagen 2 Número de puntos del dedio medio:380 Número de puntos del dedo índice: 331
Imagen 3 Número de puntos del dedo medio:377 Número de puntos del dedo índice: 326
Resultado de la Matriz Homogénea de la Transformación 2 del dedo medio:
Traslación de puntos en metros:
Tx: 0.0035 Ty: 0.0026 Tz: -1.0994e-04
Ángulos de Euler de rotación en grados: Rx: 0.3824 Ry: -0.4060 Rz: -3.4774
Ángulos de Euler de rotación en radianes:
Rx: 0.0067 Ry: -0.0071 Rz: -0.0607
Resultado de la Matriz Homogénea de la Transformación 2 del dedo índice:
Traslación de puntos en metros: Tx: 0.0191 Ty: 0.0247 Tz: -0.0022
Ángulos de Euler de rotación en grados:
Rx: 4.2405 Ry: -3.2174 Rz: 4.0449
Ángulos de Euler de rotación en radianes: Rx: 0.0740 Ry: -0.0562 Rz: 0.0706
140
Imagen 3 Número de puntos del dedio medio:377 Número de puntos del dedo índice: 326
Imagen 4 Número de puntos del dedo medio:382 Número de puntos del dedo índice: 342
Resultado de la Matriz Homogénea de la Transformación 3 del dedo medio:
Traslación de puntos en metros: Tx: -0.0631 Ty: -0.0010 Tz: 0.0051
Ángulos de Euler de rotación en grados:
Rx: -1.1556 Ry: 10.8605 Rz: -6.3999
Ángulos de Euler de rotación en radianes: Rx: -0.0202 Ry: 0.1896 Rz: -0.1117
Resultado de la Matriz Homogénea de la Transformación 3 del dedo índice:
Traslación de puntos en metros: Tx: -0.0207 Ty: -0.0052 Tz: 0.0016
Ángulos de Euler de rotación en grados:
Rx: -0.6693 Ry: 3.7812 Rz: 0.9862
Ángulos de Euler de rotación en radianes: Rx: -0.0117 Ry: 0.0660 Rz: 0.0172
141
Imagen 4 Número de puntos del dedio medio:382 Número de puntos del dedo índice: 342
Imagen 5 Número de puntos del dedo medio:366 Número de puntos del dedo índice: 318
Resultado de la Matriz Homogénea de la Transformación 4 del dedo medio:
Traslación de puntos en metros:
Tx: -0.0355 Ty: -0.0054 Tz: -4.2047e-05
Ángulos de Euler de rotación en grados: Rx: -1.2288 Ry: 5.8259 Rz: -5.6706
Ángulos de Euler de rotación en radianes:
Rx: -0.0214 Ry: 0.1017 Rz: -0.0990
Resultado de la Matriz Homogénea de la Transformación 4 del dedo índice:
Traslación de puntos en metros:
Tx: 0.0220 Ty: -0.0047 Tz: -1.9642e-06
Ángulos de Euler de rotación en grados: Rx: -0.7180 Ry: -3.0750 Rz: 4.0441
Ángulos de Euler de rotación en radianes:
Rx: -0.0125 Ry: -0.0537 Rz: 0.0706
142
Imagen 5 Número de puntos del dedio medio:366 Número de puntos del dedo índice: 318
Imagen 6 Número de puntos del dedo medio:361 Número de puntos del dedo índice: 342
Resultado de la Matriz Homogénea de la Transformación 5 del dedo medio:
Traslación de puntos en metros:
Tx: -0.0131 Ty: 0.0092 Tz: -5.5305e-04
Ángulos de Euler de rotación en grados: Rx: 1.5891 Ry: 2.8666 Rz: -2.7158
Ángulos de Euler de rotación en radianes:
Rx: 0.0277 Ry: 0.0500 Rz: -0.0474
Resultado de la Matriz Homogénea de la Transformación 5 del dedo índice:
Traslación de puntos en metros:
Tx: -0.0062 Ty: 0.0071 Tz: -2.7988e-05
Ángulos de Euler de rotación en grados: Rx: 1.3405 Ry: 1.3352 Rz: 2.1828
Ángulos de Euler de rotación en radianes:
Rx: 0.0234 Ry: 0.0233 Rz: 0.0381
143
Imagen 6 Número de puntos del dedio medio:361 Número de puntos del dedo índice: 342
Imagen 7 Número de puntos del dedo medio:363 Número de puntos del dedo índice: 337
Resultado de la Matriz Homogénea de la Transformación 6 del dedo medio:
Traslación de puntos en metros: Tx: -0.0151 Ty: -0.0093 Tz: 0.0015
Ángulos de Euler de rotación en grados:
Rx: -1.7102 Ry: 2.5462 Rz: -3.9815
Ángulos de Euler de rotación en radianes: Rx: -0.0298 Ry: 0.0444 Rz: -0.0695
Resultado de la Matriz Homogénea de la Transformación 6 del dedo índice:
Traslación de puntos en metros: Tx: 0.0094 Ty: 0.0155 Tz: -0.0015
Ángulos de Euler de rotación en grados:
Rx: 2.4297 Ry: -1.1363 Rz: 2.9896
Ángulos de Euler de rotación en radianes: Rx: 0.0424 Ry: -0.0198 Rz: 0.0522
144
Imagen 7 Número de puntos del dedio medio:363 Número de puntos del dedo índice: 337
Imagen 8 Número de puntos del dedo medio:377 Número de puntos del dedo índice: 352
Resultado de la Matriz Homogénea de la Transformación 7 del dedo medio:
Traslación de puntos en metros:
Tx: -0.0277 Ty: 0.0295 Tz: -8.5059e-04
Ángulos de Euler de rotación en grados: Rx: 4.9790 Ry: 4.5649 Rz: 2.4263
Ángulos de Euler de rotación en radianes:
Rx: 0.0869 Ry: 0.0797 Rz: 0.0423
Resultado de la Matriz Homogénea de la Transformación 7 del dedo índice:
Traslación de puntos en metros:
Tx: -0.0132 Ty: 0.0093 Tz: 5.6897e-04
Ángulos de Euler de rotación en grados: Rx: 1.2363 Ry: 2.0916 Rz: -3.5559
Ángulos de Euler de rotación en radianes:
Rx: 0.0216 Ry: 0.0365 Rz: -0.0621
145
Imagen 8 Número de puntos del dedio medio:377 Número de puntos del dedo índice: 352
Imagen 9 Número de puntos del dedo medio:389 Número de puntos del dedo índice: 347
Resultado de la Matriz Homogénea de la Transformación 8 del dedo medio:
Traslación de puntos en metros:
Tx: 0.0176 Ty: -0.0015 Tz: 6.5963e-04
Ángulos de Euler de rotación en grados: Rx: -0.5284 Ry: -2.7745 Rz: 3.1589
Ángulos de Euler de rotación en radianes:
Rx: -0.0092 Ry: -0.0484 Rz: 0.0551
Resultado de la Matriz Homogénea de la Transformación 8 del dedo índice:
Traslación de puntos en metros:
Tx: -1.9600e-04 Ty: 0.0110 Tz: -0.0018
Ángulos de Euler de rotación en grados: Rx: 1.8666 Ry: -0.0786 Rz: -3.4849
Ángulos de Euler de rotación en radianes:
Rx: 0.0326 Ry: -0.0014 Rz: -0.0608
146
Imagen 9 Número de puntos del dedio medio:389 Número de puntos del dedo índice: 347
Imagen 10 Número de puntos del dedo medio:380 Número de puntos del dedo índice: 360
Resultado de la Matriz Homogénea de la Transformación 9 del dedo medio:
Traslación de puntos en metros: Tx: -0.0153 Ty: 0.0042 Tz: -0.0021
Ángulos de Euler de rotación en grados:
Rx: 0.7406 Ry: 2.5013 Rz: -0.1996
Ángulos de Euler de rotación en radianes: Rx: 0.0129 Ry: 0.0437 Rz: -0.0035
Resultado de la Matriz Homogénea de la Transformación 9 del dedo índice:
Traslación de puntos en metros: Tx: -0.0023 Ty: 0.0099 Tz: -0.0019
Ángulos de Euler de rotación en grados:
Rx: 1.7711 Ry: 0.3785 Rz: -1.1640
Ángulos de Euler de rotación en radianes: Rx: 0.0309 Ry: 0.0066 Rz: -0.0203
147
Imagen 10 Número de puntos del dedio medio:380 Número de puntos del dedo índice: 360
Imagen 11 Número de puntos del dedo medio:378 Número de puntos del dedo índice: 350
Resultado de la Matriz Homogénea de la Transformación 10 del dedo medio:
Traslación de puntos en metros:
Tx: 0.0148 Ty: 0.0109 Tz: -2.4717e-04
Ángulos de Euler de rotación en grados: Rx: 1.6925 Ry: -2.7607 Rz: 1.7433
Ángulos de Euler de rotación en radianes:
Rx: 0.0295 Ry: -0.0482 Rz: 0.0304
Resultado de la Matriz Homogénea de la Transformación 10 del dedo índice:
Traslación de puntos en metros:
Tx: 0.0131 Ty: 0.0066 Tz: -4.4990e-04
Ángulos de Euler de rotación en grados: Rx: 1.0747 Ry: -2.2317 Rz: 0.3455
Ángulos de Euler de rotación en radianes:
Rx: 0.0188 Ry: -0.0390 Rz: 0.0060
148
Imagen 11 Número de puntos del dedio medio:378 Número de puntos del dedo índice: 350
Imagen 12 Número de puntos del dedo medio:378 Número de puntos del dedo índice: 344
Resultado de la Matriz Homogénea de la Transformación 11 del dedo medio:
Traslación de puntos en metros:
Tx: 0.0154 Ty: 0.0034 Tz: 8.1911e-04
Ángulos de Euler de rotación en grados: Rx: 0.5275 Ry: -2.7131 Rz: 1.4050
Ángulos de Euler de rotación en radianes:
Rx: 0.0092 Ry: -0.0474 Rz: 0.0245
Resultado de la Matriz Homogénea de la Transformación 11 del dedo índice:
Traslación de puntos en metros: Tx: 0.0204 Ty: 0.0078 Tz: -0.0011
Ángulos de Euler de rotación en grados:
Rx: 1.4093 Ry: -3.2903 Rz: 1.3179
Ángulos de Euler de rotación en radianes: Rx: 0.0246 Ry: -0.0574 Rz: 0.0230
149
Imagen 12 Número de puntos del dedio medio:378 Número de puntos del dedo índice: 344
Imagen 13 Número de puntos del dedo medio:361 Número de puntos del dedo índice: 340
Resultado de la Matriz Homogénea de la Transformación 12 del dedo medio:
Traslación de puntos en metros:
Tx: 0.0122 Ty: 0.0017 Tz: 2.0970e-04
Ángulos de Euler de rotación en grados: Rx: 0.3476 Ry: -2.2369 Rz: 0.2620
Ángulos de Euler de rotación en radianes:
Rx: 0.0061 Ry: -0.0390 Rz: 0.0046
Resultado de la Matriz Homogénea de la Transformación 12 del dedo índice:
Traslación de puntos en metros:
Tx: 0.0085 Ty: 2.5154e-04 Tz: -0.0017
Ángulos de Euler de rotación en grados: Rx: 0.1206 Ry: -1.3028 Rz: 0.8789
Ángulos de Euler de rotación en radianes:
Rx: 0.0021 Ry: -0.0227 Rz: 0.0153
150
Imagen 13 Número de puntos del dedio medio:361 Número de puntos del dedo índice: 340
Imagen 14 Número de puntos del dedo medio:374 Número de puntos del dedo índice: 326
Resultado de la Matriz Homogénea de la Transformación 13 del dedo medio:
Traslación de puntos en metros: Tx: 0.0385 Ty: 0.0145 Tz: 0.0024
Ángulos de Euler de rotación en grados:
Rx: 1.6158 Ry: -6.5579 Rz: 6.6371
Ángulos de Euler de rotación en radianes: Rx: 0.0282 Ry: -0.1145 Rz: 0.1158
Resultado de la Matriz Homogénea de la Transformación 13 del dedo índice:
Traslación de puntos en metros: Tx: 0.0042 Ty: 0.0209 Tz: -0.0013
Ángulos de Euler de rotación en grados:
Rx: 3.5534 Ry: -1.0750 Rz: 0.2688
Ángulos de Euler de rotación en radianes: Rx: 0.0620 Ry: -0.0188 Rz: 0.0047
151
Imagen 14 Número de puntos del dedio medio:374 Número de puntos del dedo índice: 326
Imagen 15 Número de puntos del dedo medio:378 Número de puntos del dedo índice: 340
Resultado de la Matriz Homogénea de la Transformación 14 del dedo medio:
Traslación de puntos en metros:
Tx: 0.0293 Ty: 0.0057 Tz: -1.4746e-04
Ángulos de Euler de rotación en grados: Rx: 0.5948 Ry: -5.4939 Rz: 3.9911
Ángulos de Euler de rotación en radianes:
Rx: 0.0104 Ry: -0.0959 Rz: 0.0697
Resultado de la Matriz Homogénea de la Transformación 14 del dedo índice:
Traslación de puntos en metros:
Tx: -0.0120 Ty: -0.0076 Tz: -8.0405e-04
Ángulos de Euler de rotación en grados: Rx: -1.5821 Ry: 1.1468 Rz: -3.5449
Ángulos de Euler de rotación en radianes:
Rx: -0.0276 Ry: 0.0200 Rz: -0.0619
152
Imagen 15 Número de puntos del dedio medio:378 Número de puntos del dedo índice: 340
Imagen 16 Número de puntos del dedo medio:364 Número de puntos del dedo índice: 345
Resultado de la Matriz Homogénea de la Transformación 15 del dedo medio:
Traslación de puntos en metros:
Tx: 0.0351 Ty: -0.0052 Tz: -4.4667e-04
Ángulos de Euler de rotación en grados: Rx: -1.4473 Ry: -5.2142 Rz: 6.4279
Ángulos de Euler de rotación en radianes:
Rx: -0.0253 Ry: -0.0910 Rz: 0.1122
Resultado de la Matriz Homogénea de la Transformación 15 del dedo índice:
Traslación de puntos en metros: Tx: 0.0155 Ty: -0.0117 Tz: -0.0021
Ángulos de Euler de rotación en grados:
Rx: -1.5554 Ry: -2.5160 Rz: -0.2435
Ángulos de Euler de rotación en radianes: Rx: -0.0271 Ry: -0.0439 Rz: -0.0043
153
154
ANEXO A2: CÓDIGO DE LAS ETAPAS DEL ALGORITMO
1. Adquisición de datos:
% Inicializamos los directorios addpath(genpath('./ToolBoxICP')); addpath(genpath('./Functions')); addpath(genpath('./boxes')); addpath(genpath('./Filters')) addpath(genpath('./DataSets/Indice')); addpath(genpath('./Experimentos/Indice')); addpath(genpath('../../../C++/ann_mwrapper_v1.2/ann_mwrapper')); addpath(genpath('./Functions/Maths/Transform/dataTrans')); % Se cargan 6 archivos ASCII exportados de la SR3000 n_cil = 6; for i = 1:n_cil % convierte enteros a una cadena de caracteres con formato entero. f_name = ['Indice' int2str(i) '.asc']; % N es una estructura de datos de 1xn N(i).data = importdata(f_name,'\t'); end
2.1 Reducción de puntos 1: Limitar la distancia en los ejes % para cada nube de puntos 'filtxyz1' descarta todos los puntos que estén por encima de un valor determinado de X, de Y y de Z, y por debajo de filtxyz2' %imágenes de la 1 a la 6 for i = 1:n_cil filtxyz1(i,:) = [0.1 0.06 0.4]; %filtrado para X, Y, y Z máximos filtxyz2(i,:) = [-0.05 -0.1 0.25]; %filtrado para X, Y, y Z mínimos end for i=1:n_cil tmp.data = []; aa=0; bFilter = 0; for j=1:size(N(i).data,1) % X, Y, Z component filter if (N(i).data(j,1) < filtxyz1(i,1)) && (N(i).data(j,1) > filtxyz2(i,1)) && (N(i).data(j,2) < filtxyz1(i,2)) && (N(i).data(j,2) > filtxyz2(i,2))&& (N(i).data(j,3) < filtxyz1(i,3)) && (N(i).data(j,3) > filtxyz2(i,3)) aa=aa+1; bFilter = 1; tmp.data(aa,:) = N(i).data(j,:); end end if bFilter == 1 N(i).data = []; N(i).data = tmp.data; end end
155
2.2 Reducción de puntos 2: Muestreo ini = 1; last = n_cil; for i=ini:last % uSamp es el tamaño de la caja. Más pequeño, más resolución. Más grande, menos resolución N(i).poseL = [ 0 0 0 0 0 0 ]; Nsamp(i).data = sampleData(N(i).data,N(i).poseL,'uSamp',0.00); end
3 Segmentación de los puntos: %% Imagen 6: Extraemos cada falange por separado % creamos una estructura de datos 'pointClouds', con los campos 'cil1', 'cil2' y 'cil3' pointClouds(i).cil=struct('cil1', [], 'cil2', [], 'cil3', []); % graficamos las 3 falanges separadas de la 6ª imagen plotclouds(Nsamp(6),6,'onecolor',4,'poses',N(i).poseL,'subplot',[2,2,1]); % definimos a partir de dónde queremos filtrar para la primera falange: % rotamos respecto Z para extraer verticalmente: aaa.data = R_z(Nsamp(6).data',20*pi/180); %plotclouds(aaa,61,'onecolor',4,'poses',N(i).poseL); tmp.data = []; aa=0; bFilter = 0; % booleà. Indica si ha filtrat o no for j=1:size(Nsamp(6).data,1) % X, Y, Z component filter if (aaa.data(j,1) > -0.03 && aaa.data(j,1) < -0.0078 && aaa.data(j,2) > -0.015 && aaa.data(j,2) < 0.01 && aaa.data(j,3) > 0.25 && aaa.data(j,3) < 0.325) aa=aa+1; bFilter = 1; % Ha filtrat tmp.data(aa,:) = aaa.data(j,:); end end if bFilter == 1 pointClouds(6).cil.cil1.data = tmp.data; else pointClouds(6).cil.cil1.data = aaa.data; end % desrotamos respecto Z para restituir la imagen original: aaa.data=R_z(pointClouds(6).cil.cil1.data',-20*pi/180); pointClouds(6).cil.cil1.data = aaa.data;
156
% definimos a partir de dónde queremos filtrar para la segunda falange: % rotamos respecto Z para extraer verticalmente: aaa.data = R_z(Nsamp(6).data',60*pi/180); tmp.data = []; aa=0; bFilter = 0; % booleà. Indica si ha filtrat o no for j=1:size(Nsamp(6).data,1) % X, Y, Z component filter if (aaa.data(j,1) > -0.03 && aaa.data(j,1) < -0.01 && aaa.data(j,2) > 0.0 && aaa.data(j,2) < 0.02 && aaa.data(j,3) < 0.325 && aaa.data(j,3) > 0.25) aa=aa+1; bFilter = 1; % Ha filtrat tmp.data(aa,:) = aaa.data(j,:); end end if bFilter == 1 pointClouds(6).cil.cil2.data = tmp.data; else pointClouds(6).cil.cil2.data = aaa.data; end % desrotamos respecto Z para restituir la imagen original: aaa.data=R_z(pointClouds(6).cil.cil2.data',-60*pi/180); pointClouds(6).cil.cil2.data = aaa.data;
% definimos a partir de dónde queremos filtrar para la tercera falange: % rotamos respecto Z para extraer verticalmente: aaa.data = R_z(Nsamp(6).data',0*pi/180); tmp.data = []; aa=0; bFilter = 0; % booleà. Indica si ha filtrat o no for j=1:size(Nsamp(6).data,1) % X, Y, Z component filter if (aaa.data(j,1) < 0.04 && aaa.data(j,1) > 0.009 && aaa.data(j,2) < 0.04 && aaa.data(j,2) > 0.02 && aaa.data(j,3) < 0.325 && aaa.data(j,3) > 0.25) aa=aa+1; bFilter = 1; % Si s'ha filtrat tmp.data(aa,:) = aaa.data(j,:); end end if bFilter == 1 pointClouds(6).cil.cil3.data = tmp.data; else pointClouds(6).cil.cil3.data = aaa.data; end % desrotamos respecto Z para restituir la imagen original: aaa.data=R_z(pointClouds(6).cil.cil3.data',0*pi/180); pointClouds(6).cil.cil3.data = aaa.data;
157
4 ICP: % el resultado de las transformaciones está en la estructura de datos 'Indice': % Indice1, Indice2 y Indice3 son las transformaciones de la 1ª y la 2ª imagen, la 2ª y la 3ª, la 3ª y la 4ª... sucesivamente a lo largo de la secuencia de imágenes. % estimated_HRt.HRt es la matriz H, mientras que estimated_HRt.xyzRxRyRz es la matriz H en ángulos de Euler. % definimos una estructura de datos cil1, cil2 y cil3. % cil1 es la transformación de la 1ª falange entre la imagen actual y la siguiente. % cil2 es la transformación de la 2ª falange entre la imagen actual y la siguiente % cil3 es la transformación de la 3ª falange entre la imagen actual y la siguiente cil1 = struct('ref', [], 'new',[]); cil2 = struct('ref', [], 'new',[]); cil3 = struct('ref', [], 'new',[]); for i=2:size(pointClouds,2) cil1(i-1).ref.data = pointClouds(i-1).cil.cil1.data'; %falange 1 de la 1ª imagen cil2(i-1).ref.data = pointClouds(i-1).cil.cil2.data'; %falange 2 de la 1ª imagen cil3(i-1).ref.data = pointClouds(i-1).cil.cil3.data'; %falange 3 de la 1ª imagen cil1(i-1).new.data = pointClouds(i).cil.cil1.data'; %falange 1 de la siguiente imagen cil2(i-1).new.data = pointClouds(i).cil.cil2.data'; %falange 2 de la siguiente imagen cil3(i-1).new.data = pointClouds(i).cil.cil3.data'; %falange 3 de la siguiente imagen % Calcula el vector normal asociado con cada punto y el plano definido por sus puntos vecinos % Número de puntos vecinos NNN = 9; % Distancia máxima entre puntos vecinos maxDist = 1; [ cil1(i-1).ref.normals cil1(i-1).ref.valid cil1(i-1).ref.error ] = ... findDataNormals( cil1(i-1).ref.data, 'NNN', NNN, 'maxDist', maxDist); [ cil1(i-1).new.normals cil1(i-1).new.valid cil1(i-1).new.error ] = ... findDataNormals( cil1(i-1).new.data, 'NNN', NNN, 'maxDist', maxDist); [ cil2(i-1).ref.normals cil2(i-1).ref.valid cil2(i-1).ref.error ] = ... findDataNormals( cil2(i-1).ref.data, 'NNN', NNN, 'maxDist', maxDist); [ cil2(i-1).new.normals cil2(i-1).new.valid cil2(i-1).new.error ] = ... findDataNormals( cil2(i-1).new.data, 'NNN', NNN, 'maxDist', maxDist); [ cil3(i-1).ref.normals cil3(i-1).ref.valid cil3(i-1).ref.error ] = ... findDataNormals( cil3(i-1).ref.data, 'NNN', NNN, 'maxDist', maxDist); [ cil3(i-1).new.normals cil3(i-1).new.valid cil3(i-1).new.error ] = ... findDataNormals( cil3(i-1).new.data, 'NNN', NNN, 'maxDist', maxDist); % icp type = 'svd'; %singular value decomposition maxIter = 1000; errorThreshold = 0.000001; [ Indice1(i-1) matchedPoints ] = ICP3DGeneralAlgorithm (type, cil1(i-1), maxIter, errorThreshold ); [ Indice2(i-1) matchedPoints ] = ICP3DGeneralAlgorithm (type, cil2(i-1), maxIter, errorThreshold ); [ Indice3(i-1) matchedPoints ] = ICP3DGeneralAlgorithm (type, cil3(i-1), maxIter, errorThreshold ); end
158
5 Reproducción 3D: #include <Inventor/Qt/SoQt.h> #include <Inventor/Qt/viewers/SoQtExaminerViewer.h> #include <Inventor/nodes/SoBaseColor.h> #include <Inventor/nodes/SoCylinder.h> #include <Inventor/nodes/SoCube.h> #include <Inventor/nodes/SoSeparator.h> #include <Inventor/nodes/SoTranslation.h> #include <Inventor/nodes/SoRotationXYZ.h> #include <Inventor/sensors/SoTimerSensor.h> #include <Inventor/nodes/SoMatrixTransform.h> #include <iostream> #include <cstdlib> #include "VDLimb.h" using namespace std; unsigned int nStates = 13; unsigned int k = 0; //matriz H de la mano: Tx,Ty,Tz,Rx,Ry,Rz float matrix1[] = {-0.0061, 0.0067, 0.0019, 0.0199, 0.0177, -0.0093, -0.0040, 0.0013, 0.0011, 0.0068, 0.0117, -0.0126, -6.0552e-04, 0.0025, 1.5285e-04, 0.0062, 0.0024, 0.0026, -0.0017, 0.0010, -6.1141e-04, 0.0024, 0.0095, -0.0150, -0.0016, 0.0021, 2.9832e-04, 0.0062, 0.0067, -0.0043, -0.0020, -1.8872e-04, -2.9470e-04, -3.2513e-04, 0.0103, -0.0046, 0.0039, -0.0043, -0.0017, -0.0095, -0.0063, -0.0178, 2.6918e-04, -0.0047, -6.3049e-04, -0.0135, -0.0027, 0.0215, 5.3975e-04, -0.0021, -8.6711e-04, -0.0056, 1.7994e-04, -0.0070, -9.6669e-05, 0.0014, 3.7182e-04, 0.0047, 0.0014, -0.0038, -3.0753e-04, 0.0051, 0.0021, 0.0134, 0.0017, -0.0030, 0.0014, 0.0012, 6.8324e-04, 0.0041, -0.0062, 0.0031, 0.0042, 8.1791e-04, 2.7418e-04, 0.0051, -0.0131, -0.0076}; // matriz H del pulgar: Tx,Ty,Tz,Rx,Ry,Rz float matrix2[] = {0.0114, -0.0061, -0.0028, -0.0125, -0.0570, 0.1121, 0.0155, 0.0045, -0.0032, 0.0198, -0.0758, 0.1154, 0.0177, 0.0013, -0.0053, 0.0082, -0.0781, 0.0869, 0.0140, -0.0015, -0.0038, 0.0024, -0.0614, 0.0742, 0.0017, -0.0085, -0.0022, -0.0159, -0.0250, 0.0972, -0.0041, 0.0014, -0.0013, 0.0118, -0.0085, 0.0980, -0.0015, -0.0147, -0.0047, -0.0173, -0.0262, 0.1891, 0.1003, 0.0701, 0.0216, 0.2241, -0.2904, -0.0943, 0.0307, 0.0036, -0.0018, -0.0012, -0.0525, -0.0755, 0.0439, 0.0149, -0.0015, 0.0447, -0.1169, -0.0623, 0.0057, 0.0063, 0.0040, -0.0064, 0.0335, -0.1552, 0.0164, 0.0101, -7.6480e-04, 0.0164, -0.0080, -0.1635, -0.0083, -0.0231, -0.0022, -0.1064, 0.0554, -0.1953};
//estructura para enviar datos de traslacion y rotacion en una sola estructura
159
struct PosRot { SoTranslation * offset; SoRotationXYZ * arrowrotationX1; SoRotationXYZ * arrowrotationY1; SoRotationXYZ * arrowrotationZ1; SoRotationXYZ * arrowrotationX2; SoRotationXYZ * arrowrotationY2; SoRotationXYZ * arrowrotationZ2; }; //definición de la función que se ejecutará periódicamente static void func(void * data, SoSensor *) { std::cout<<"Time triggered!!\n"; std::cout<<"k: "<<k<<" Tx: "<<matrix2[6*k+0]<<" Ty: "<<matrix2[6*k+1]<<" Tz: "<<matrix2[6*k+2] <<" Rx: "<<matrix2[6*k+3]<<" Ry: "<<matrix2[6*k+4]<<" Rz: "<<matrix2[6*k+5]<<"\n"; PosRot * posRotData = (PosRot *)data; SoRotationXYZ * arrowrotationX2 = posRotData->arrowrotationX2; SoRotationXYZ * arrowrotationY2 = posRotData->arrowrotationY2; SoRotationXYZ * arrowrotationZ2 = posRotData->arrowrotationZ2; SoRotationXYZ * arrowrotationX1 = posRotData->arrowrotationX1; SoRotationXYZ * arrowrotationY1 = posRotData->arrowrotationY1; SoRotationXYZ * arrowrotationZ1 = posRotData->arrowrotationZ1; SoTranslation * offset = posRotData->offset; if(k!=0) { offset->translation = offset->translation.getValue() + SbVec3f(matrix2[6*k+0], matrix2[6*k+1],matrix2[6*k+2]); // Transformación 2 arrowrotationX2->axis = SoRotationXYZ::X; arrowrotationX2->angle= arrowrotationX2->angle.getValue()-matrix2[6*k+3]; arrowrotationY2->axis = SoRotationXYZ::Y; arrowrotationY2->angle= arrowrotationY2->angle.getValue()-matrix2[6*k+4]; arrowrotationZ2->axis = SoRotationXYZ::Z; arrowrotationZ2->angle= arrowrotationZ2->angle.getValue()-matrix2[6*k+5]; // Transformación 1 arrowrotationX1->axis = SoRotationXYZ::X; arrowrotationX1->angle= arrowrotationX1->angle.getValue()-matrix1[6*k+3]; arrowrotationY1->axis = SoRotationXYZ::Y; arrowrotationY1->angle= arrowrotationY1->angle.getValue()-matrix1[6*k+4];
160
arrowrotationZ1->axis = SoRotationXYZ::Z; arrowrotationZ1->angle= arrowrotationZ1->angle.getValue()-matrix1[6*k+5]; } else { offset->translation = SbVec3f(matrix2[6*k+0], matrix2[6*k+1],matrix2[6*k+2]); // Transformación 2 arrowrotationX2->axis = SoRotationXYZ::X; arrowrotationX2->angle= matrix2[6*k+3]; arrowrotationY2->axis = SoRotationXYZ::Y; arrowrotationY2->angle= matrix2[6*k+4]; arrowrotationZ2->axis = SoRotationXYZ::Z; arrowrotationZ2->angle= matrix2[6*k+5]; // Transformación 1 arrowrotationX1->axis = SoRotationXYZ::X; arrowrotationX1->angle= matrix1[6*k+3]; arrowrotationY1->axis = SoRotationXYZ::Y; arrowrotationY1->angle= matrix1[6*k+4]; arrowrotationZ1->axis = SoRotationXYZ::Z; arrowrotationZ1->angle= matrix1[6*k+5]; } if(k<(nStates-1)) { k++; } else { k=0; } }
161
// Programa Principal int main(int argc, char **argv) { //creamos una instancia de la clase Limb Limb falange; //dimensionamos la falange falange.length=3.5; //longitud falange.rbb=1.5; //radio // Initializes SoQt library (and implicitly also the Coin and Qt libraries). Returns a top-level / shell Qt window to use. QWidget * mainwin = SoQt::init(argc, argv, argv[0]); // Make a dead simple scene graph by using the Coin library, SoSeparator * root= new SoSeparator; root->ref(); SoRotationXYZ *arrowrotationX1, *arrowrotationY1, *arrowrotationZ1, *arrowrotationX2, *arrowrotationY2, *arrowrotationZ2 ; arrowrotationX1 = new SoRotationXYZ; arrowrotationY1 = new SoRotationXYZ; arrowrotationZ1 = new SoRotationXYZ; arrowrotationX2 = new SoRotationXYZ; arrowrotationY2 = new SoRotationXYZ; arrowrotationZ2 = new SoRotationXYZ;
162
// mano derecha mirando a la palma
// dedo anular SoSeparator * dit1= new SoSeparator; //Dibujamos los cilindros de color amarillo SoBaseColor * col = new SoBaseColor; col->rgb = SbColor(1, 0, 0);//rojo dit1->addChild(col); //Definimos un cilindro SoCylinder * cil1 = new SoCylinder; cil1->height=3.5; cil1->radius=1.5; //Traslación del cil1 SoTranslation * offset1 = new SoTranslation; offset1->translation = SbVec3f(-3, 10, 0); //separación entre cilindros x=0, y=4, z=0 dit1->addChild(offset1); //Rotación del cil1 SoRotationXYZ *arrowrotation1 = new SoRotationXYZ; arrowrotation1->axis = SoRotationXYZ::Z; arrowrotation1->angle=3.1416/16; dit1->addChild(arrowrotation1); dit1->addChild(cil1); //Definimos el cil2 SoCylinder * cil2 = new SoCylinder; cil2->height=3.5; cil2->radius=1.5; //Traslación del cil2 SoTranslation * offset2 = new SoTranslation; offset2->translation = SbVec3f(0, 4, 0); //separación entre cilindros x=0, y=4, z=0 dit1->addChild(offset2); dit1->addChild(cil2); //Definimos el cil3 SoCylinder * cil3 = new SoCylinder; cil3->height=3.5; cil3->radius=1.5; dit1->addChild(cil3); //Traslación del cil3 SoTranslation * offset3 = new SoTranslation; offset3->translation = SbVec3f(0, 4, 0); //separación entre cilindros x=0, y=4, z=0 dit1->addChild(offset3); dit1->addChild(cil3);
163
// dedo medio SoSeparator * dit2 = new SoSeparator; //Color rojo para cil4 SoBaseColor * col2 = new SoBaseColor; col2->rgb = SbColor(1, 1, 1);//blanco dit2->addChild(col2); //Definimos el cil4 SoCylinder * cil4 = new SoCylinder; cil4->height=3.5; cil4->radius=1.5; //Traslación del cil4 SoTranslation * offset4 = new SoTranslation; offset4->translation = SbVec3f(1.25, 11, 0); //separación entre cilindros x=0, y=4, z=0 dit2->addChild(offset4); //Rotación del cil4 SoRotationXYZ *arrowrotation2 = new SoRotationXYZ;; arrowrotation1->axis = SoRotationXYZ::Z; arrowrotation1->angle=3.1416/16; dit2->addChild(arrowrotation2); dit2->addChild(cil4); //Definimos el cil5 SoCylinder * cil5 = new SoCylinder; cil5->height=3.5; cil5->radius=1.5; //Traslación del cil5 SoTranslation * offset5 = new SoTranslation; offset5->translation = SbVec3f(0, 4, 0); //separación entre cilindros x=0, y=4, z=0 dit2->addChild(offset5); dit2->addChild(cil5); //Definimos el cil6 SoCylinder * cil6 = new SoCylinder; cil6->height=3.5; cil6->radius=1.5; //Traslación del cil6 SoTranslation * offset6 = new SoTranslation; offset6->translation = SbVec3f(0, 4, 0); //separación entre cilindros x=0, y=4, z=0 dit2->addChild(offset6); dit2->addChild(cil6);
// dedo indice SoSeparator * dit3 = new SoSeparator; //Color rojo para cil7 SoBaseColor * col3 = new SoBaseColor;
164
col3->rgb = SbColor(0, 0, 1);//azul dit3->addChild(col3); //Definimos el cil7 SoCylinder * cil7 = new SoCylinder; cil7->height=3.5; cil7->radius=1.5; //Traslación del cil7 SoTranslation * offset7 = new SoTranslation; offset7->translation = SbVec3f(6, 10, 0); //separación entre cilindros x=0, y=4, z=0 dit3->addChild(offset7); //Rotación SoRotationXYZ *arrowrotation3 = new SoRotationXYZ; arrowrotation3->axis = SoRotationXYZ::Z; arrowrotation3->angle=-3.1416/16; dit3->addChild(arrowrotation3); dit3->addChild(cil7); //Definimos el cil8 SoCylinder * cil8 = new SoCylinder; cil8->height=3.5; cil8->radius=1.5; //Traslación del cil8 SoTranslation * offset8 = new SoTranslation; offset8->translation = SbVec3f(0, 4, 0); //separación entre cilindros x=0, y=4, z=0 dit3->addChild(offset8); dit3->addChild(cil8); //Definimos el cil9 SoCylinder * cil9 = new SoCylinder; cil9->height=3.5; cil9->radius=1.5; //Traslación del cil9 SoTranslation * offset9 = new SoTranslation; offset9->translation = SbVec3f(0, 4, 0); //separación entre cilindros x=0, y=4, z=0 dit3->addChild(offset9); dit3->addChild(cil9);
165
// dedo meñique SoSeparator * dit4 = new SoSeparator; //Color rojo para cil10 SoBaseColor * col4 = new SoBaseColor; col4->rgb = SbColor(0, 1, 0); dit4->addChild(col4); //Definimos el cil10 SoCylinder * cil10 = new SoCylinder; cil10->height=3.0; cil10->radius=1.25; //Traslación del cil10 SoTranslation * offset10 = new SoTranslation; offset10->translation = SbVec3f(-6.5, 9, 0); //separación entre cilindros x=0, y=4, z=0 dit4->addChild(offset10); //Rotación SoRotationXYZ *arrowrotation4 = new SoRotationXYZ;; arrowrotation4->axis = SoRotationXYZ::Z; arrowrotation4->angle=3.1416/8; dit4->addChild(arrowrotation4); dit4->addChild(cil10); //Definimos el cil11 SoCylinder * cil11 = new SoCylinder; cil11->height=3.0; cil11->radius=1.25; //Traslación del cil11 SoTranslation * offset11 = new SoTranslation; offset11->translation = SbVec3f(0, 3.5, 0); //separación entre cilindros x=0, y=4, z=0 dit4->addChild(offset11); dit4->addChild(cil11); //Definimos el cil12 SoCylinder * cil12 = new SoCylinder; cil12->height=3.0; cil12->radius=1.25; //Traslación del cil10 SoTranslation * offset12 = new SoTranslation; offset12->translation = SbVec3f(0, 3.5, 0); //separación entre cilindros x=0, y=4, z=0 dit4->addChild(offset12); dit4->addChild(cil12);
166
//pulgar SoSeparator * dit5 = new SoSeparator; //Color rojo para cil13 SoBaseColor * col6 = new SoBaseColor; col6->rgb = SbColor(1, 1, 0);//amarillo dit5->addChild(col6); //Definimos el cil13 SoCylinder * cil13 = new SoCylinder; cil13->height=3.75; cil13->radius=2.0; //Traslación del cil13 SoTranslation * offset13 = new SoTranslation; offset13->translation = SbVec3f(11, -3, 0); //separación entre cilindros x=0, y=4, z=0 dit5->addChild(offset13); //Rotación SoRotationXYZ *arrowrotation5 = new SoRotationXYZ; arrowrotation5->axis = SoRotationXYZ::Z; arrowrotation5->angle=-3.1416/4+3.1416; dit5->addChild(arrowrotation5); dit5->addChild(arrowrotationX2); dit5->addChild(arrowrotationY2); dit5->addChild(arrowrotationZ2); dit5->addChild(cil13); //Definimos el cil14 SoCylinder * cil14 = new SoCylinder; cil14->height=3.75; cil14->radius=2.0; //Traslación del cil14 SoTranslation * offset14 = new SoTranslation; offset14->translation = SbVec3f(0, -4.5, 0); //separación entre cilindros x=0, y=4, z=0 dit5->addChild(offset14); dit5->addChild(cil14);
167
//palma SoSeparator * palma = new SoSeparator; //Color rojo para la palma SoBaseColor * col5 = new SoBaseColor; col5->rgb = SbColor(1, 0, 3); palma->addChild(col5); //Dimensionamos la palma SoCube * cub = new SoCube; cub->width=14; cub->height=13; cub->depth=3; //Traslación de la palma SoTranslation * offset15 = new SoTranslation; offset15->translation = SbVec3f(0, 0, 0); //posición en pantalla palma->addChild(offset15); //Rotación de la palma palma->addChild(arrowrotationX1); palma->addChild(arrowrotationY1); palma->addChild(arrowrotationZ1); palma->addChild(cub);
//mano
palma->addChild(dit1); palma->addChild(dit2); palma->addChild(dit3); palma->addChild(dit4); palma->addChild(dit5);
168
// Use one of the convenient SoQt viewer classes. SoQtExaminerViewer * eviewer = new SoQtExaminerViewer(mainwin); eviewer->setSceneGraph(palma); eviewer->setTitle("Animacion Pulgar"); eviewer->show(); // Pop up the main window. SoQt::show(mainwin); PosRot posRotData; posRotData.arrowrotationX1 = arrowrotationX1; posRotData.arrowrotationY1 = arrowrotationY1; posRotData.arrowrotationZ1 = arrowrotationZ1; posRotData.arrowrotationX2 = arrowrotationX2; posRotData.arrowrotationY2 = arrowrotationY2; posRotData.arrowrotationZ2 = arrowrotationZ2; posRotData.offset = offset15; SoTimerSensor timerSensor(func, &posRotData); timerSensor.setInterval(1.0); timerSensor.schedule(); // Loop until exit. SoQt::mainLoop(); // Clean up resources. delete eviewer; root->unref(); return 0; }