Blog

Juan Mellado, 12 Mayo, 2012 - 20:15

He liberado los fuentes de js-handtracking, una librería escrita en JavaScript que captura la imagen de una webcam y la procesa con el objetivo de detectar la presencia de piel humana, preferentemente una mano, y extraer sus características estructurales más importantes.


La librería realiza las siguientes operaciones:

- Detección de las áreas de la imagen que contienen piel
- Extracción de los contornos de las áreas
- Determinación del contorno de mayor área
- Optimización del contorno
- Cálculo de la envolvente convexa del contorno
- Cálculo de los defectos de convexidad

Demo online:
http://www.inmensia.com/files/handtracking/demo/index.html

Para probar la demo es necesario utilizar un navegador moderno con soporte para WebRTC, que es la tecnología que permite a JavaScript acceder a la webcam directamente desde el navegador. Por ejemplo, Chrome 18 o superior, con el flag --enable-media-stream.

Para la detección de piel al final he optado por convertir los colores desde RGB hasta HSV y comprobar los valores de los canales H y V para determinar si están dentro del rango de la piel humana:

v >= 15 and v <= 250

h >= 3 and h <= 33

Las condiciones de iluminación son muy importantes y hacen que los colores sean detectados de forma muy distinta por la webcam. He tenido bastantes problemas ajustando los parámetros. Al final eliminando el equilibrado automático de blancos he conseguido una detección bastante estable.

Lo realmente importante es darse cuenta que hace sólo unos pocos meses era impensable pensar en realizar este tipo de aplicaciones sencillas de visión artificial en JavaScript.

Juan Mellado, 9 Mayo, 2012 - 18:54

Estoy trabajando en una nueva librería escrita en JavaScript. Esta vez estoy tratando de implementar un sistema de tracking, en especial de manos. Mi objetivo es ser capaz de detectar una mano que se encuentre dentro de una imagen y destacar sobre ella sus características principales. Ya tengo un prototipo bastante avanzado, como puede verse en la siguiente imagen:

Hand Tracking

La librería segmenta una imagen dada dividiéndola en regiones que contengan colores dentro del rango que caracteriza la piel humana (blanco). Asumiendo que la región más grande encontrada corresponde a una mano, ya que ese es el objetivo de uso de la librería. A continuación encuentra el contorno de la región (rojo), y sobre ese contorno calcula la envolvente convexa (azul) y sus defectos de convexidad (verde).

Los defectos de convexidad suelen ser de bastante utilidad, ya que se pueden usar para contar el número de dedos que tiene levantados la mano por ejemplo.

Viendo la imagen está claro que la librería ya cumple su objetivo, pero aún me quedan varias pruebas que quiero realizar antes de liberar los fuentes. La parte más complicada del proceso está siendo la primera, la detección de la piel humana. Ya había trabajado antes en el tema, pero me estoy encontrando con problemas debido a que mi webcam es MUY mala y no hay forma de que me proporcione fotogramas con los colores correctos. De momento me estoy limitando a utilizar imágenes estáticas, aunque tengo una demo que acepta como entrada vídeo directamente.

En el apartado de la documentación de referencia, para la detección de piel he probado tres sistemas distintos. Al final el que se encuentra ahora mismo implementado es el que se describe en esta página (en chino):

- http://blog.csdn.net/scyscyao/article/details/5468577

De hecho, la imagen de la mano que he puesto es de esa página. La he estado utilizando para comparar resultados. Espero que no haya problemas de copyright.

Antes de liberar la librería me gustaría revisar la implementación que tiene OpenCV de una técnica llamada "adaptive skin detection", que ajusta los parámetros de detección de piel humana en función de como varía la imagen fotograma a fotograma. Pero no estoy muy convencido, ya he hecho una primera prueba en JavaScript de la parte básica sobre una imagen estática y detecta menos piel que el método que tengo ahora mismo funcionando.

Temas: Java Spring
Juan Mellado, 7 Mayo, 2012 - 09:25

Spring FrameworkLa última tanda de artículos de la serie dedicada a Spring tratan el desarrollo de aplicaciones web, que es donde se utiliza el framework de forma más habitual. Los artículos son un repaso rápido de la documentación oficial de referencia, enumerando algunas de las facilidades más importantes que ofrece Spring a la hora de implementar servlets y handlers:

- Web MVC (1) - Configuración

- Web MVC (2) - Servlets

- Web MVC (3) - Controladores

- Web MVC (4) - Handlers

- Web MVC (5) - Modelos

- Web MVC (6) - Vistas

- Web MVC (7) - Tag Library

Esta parte de la documentación, junto a la dedicada a base de datos, es la más extensa. Y no es casual. Son las capas a las que normalmente más tiempo se le dedica durante el desarrollo de una aplicación. Y eso que me he dejado muchas cosas en el tintero, como la integración con otros frameworks, la creación de portlets, la escritura de webservices, ... y un largo etcétera.

Temas: Java Spring
Juan Mellado, 5 Mayo, 2012 - 10:13

Spring FrameworkLa mayoría de aplicaciones del mundo empresarial suelen estar basadas en algún de tipo de base de datos. El modelo de dominio de un sistema suele ser la pieza central en base a la que se construye. Spring ofrece una gran cantidad de formas de configurar y acceder a bases de datos, e incluso fuentes de recursos más sofisticados como JDO.

En esta nueva tanda de artículos dentro de la serie dedicada a Spring se revisa el uso de JDBC, la implementación de Hibernate para realizar el mapeo entidad-relación, el estándar JPA, e incluso la serialización XML de entidades:

- JDBC (1) - Introducción

- JDBC (2) - JdbcTemplate

- JDBC (3) - Objetos

- ORM (1) - Hibernate

- ORM (2) - JPA

- Object/XML Mapping

En la práctica no tiene sentido conocer los detalles de todas las implementaciones disponibles, sólo saber que existen. Normalmente la tecnología a utilizar viene dada por el proyecto, si se trata de un proyecto de mantenimiento, o por el tipo de desarrollo, si se trata de un nuevo desarrollo. En la actualidad aplicar JPA 2.0 parece ser la norma.

La siguiente tanda de artículos será la última de esta serie, y estará dedicada al desarrollo de aplicaciones web.

Temas: Java Spring
Juan Mellado, 3 Mayo, 2012 - 09:37

Spring FrameworkEl concepto de transacción es algo que cualquiera que haya trabajado con una base de datos debería comprender perfectamente. Se establece un punto de inicio, se realizan operaciones, y se termina consolidando las operaciones realizadas (con un commit), o deshaciéndolas (con un rollback). La transacción garantiza la atomicidad de las operaciones, o todo o nada.

Spring da soporte para incorporar la gestión de transacciones a las aplicaciones más allá del ofrecido por un gestor de base de datos. Ya sea aprovechando las capacidades ofrecidas por un servidor de aplicaciones, o las proporcionadas de forma local por la propia aplicación mediante alguna librería que lo implemente. En los siguientes artículos de la serie dedicada a Spring reviso algunos términos importantes y muestro configuraciones de ejemplos:

- Transacciones (1) - Introducción

- Transacciones (2) - Definición y Uso

- Transacciones (3) - Configuración y Anotaciones

- Transacciones (4) - Ejemplo

Una de las cosas que siempre me han gustado de esta parte es que basta con añadir la etiqueta @Transactional sobre un método para conseguir que su código se ejecute dentro de una transacción. Una de las cosas que nunca me han gustado de esta parte es que en algunos casos, si la configuración no es correcta, el código no se ejecuta dentro de una transacción, pero no se eleva ningún mensaje de advertencia o error ni se produce ninguna excepción.

La siguiente tanda de artículos estará dedicado al acceso a base de datos y el mapeo objeto relacional en general.