2011-12-21 15 views
19

Actualmente estoy trabajando en un sistema para la detección robusta de manos.Detección de mano robusta a través de Computer Vision

El primer paso es tomar una foto de la mano (en el espacio de color HSV) con la mano colocada en un pequeño rectángulo para determinar el color de la piel. A continuación, aplico un filtro de umbral para establecer todos los píxeles que no sean de piel en negro y todos los píxeles de piel en blanco.

Hasta ahora funciona bastante bien, pero quería preguntar si hay una mejor manera de resolver esto. Por ejemplo, encontré algunos artículos que mencionan espacios de colores concretos para personas caucásicas, pero ninguno con una comparación para tonos de color asiático/africano/caucásico.

Por cierto, estoy trabajando con OpenCV mediante enlaces de Python.

Respuesta

22

¿Has echado un vistazo al papel de camilla de Gary Bradski? Puede descargarlo desde here

Utilicé el algoritmo de detección de piel hace un año para detectar regiones de piel para el seguimiento manual y es robusto. Depende de como lo uses.

El primer problema con el uso del color para el seguimiento es que no es robusto para las variaciones de iluminación o como usted mencionó, cuando las personas tienen diferentes tonos de piel. Sin embargo, esto se puede resolver fácilmente como se menciona en el documento por:

  1. Convierta la imagen al espacio de color HSV.
  2. Deseche el canal V y considere el canal H y S y, por lo tanto, de descuento para las variaciones de iluminación.
  3. Píxeles de umbral con baja saturación debido a su inestabilidad.
  4. Ubique la región de la piel seleccionada en un histograma 2D. (Función calcHist de OpenCV ) Este histograma ahora actúa como modelo para la máscara.
  5. Calcule la "retroproyección" (es decir, utilice el histograma para calcular la "probabilidad" de que cada píxel de su imagen tenga el color del tono de la piel) usando calcBackProject. Las regiones Skin tendrán valores altos.
  6. Puede usar meanShift para buscar el modo del mapa 2D " " de probabilidad generado por backproject o para detectar blobs de alta "probabilidad".

Al tirar el canal V en HSV y considerar únicamente los canales H y S es realmente suficiente (sorprendentemente) para detectar diferentes tonos de piel y bajo diferentes variaciones de iluminación. Un lado positivo es que su cálculo es rápido.

Estos pasos y el código correspondiente se pueden encontrar en el original OpenCV book.

Como nota al margen, también he usado Modelos de mezclas gaussianas (GMM) anteriormente. Si solo estás considerando el color, entonces diría que usar histogramas o GMM no hace mucha diferencia. De hecho, el histograma tendrá un mejor rendimiento (si su GMM no está construido para tener en cuenta las variaciones de iluminación, etc.). GMM es bueno si tus vectores de muestra son más sofisticados (es decir, consideras otras características) pero el histograma de velocidad es mucho más rápido porque calcular el mapa de probabilidad usando histograma es esencialmente una búsqueda de tabla mientras que GMM requiere realizar un cálculo matricial (para vector con dimensión> 1 en la fórmula para distribución gaussiana multidimensional) que puede consumir mucho tiempo para aplicaciones en tiempo real.

Por lo tanto, en conclusión, si solo está tratando de detectar las regiones de la piel usando color, entonces vaya con el método de histograma. También puede adaptarlo para considerar el gradiente local (es decir, histograma de gradientes pero posiblemente no alcance la extensión total del algoritmo de detección humana de Dalal y Trigg) para diferenciar entre piel y regiones con colores similares (por ejemplo, muebles de cartón o madera) usando la información de textura local. Pero eso requeriría más esfuerzo.

Para el código fuente de ejemplo sobre cómo usar el histograma para la detección de la piel, se puede echar un vistazo a OpenCV "s página here. Pero tenga en cuenta que se menciona en esa página web que sólo utilizan el canal de tonalidad y que el uso de ambos el tono y la saturación darían un mejor resultado.

Para un enfoque más sofisticado, puede echar un vistazo al trabajo sobre "Detección de personas desnudas" por Margaret Fleck y David Forsyth. Este fue uno de los trabajos anteriores sobre detección de regiones cutáneas que considera tanto el color como la textura. Los detalles se pueden encontrar here.

Un gran recurso para el código fuente relacionado con la visión por computadora y yo El procesamiento de mage, que incluye el código para el seguimiento visual, se puede encontrar en here. Y no, no es OpenCV.

Espero que esto ayude.

+2

gracias por su respuesta detallada. No sé si implementaré el método exactamente, pero es de gran ayuda, ya que también explica algunos detalles como ignorar el canal v, lo que estoy haciendo actualmente pero sin comprender realmente por qué – Nicolas

+1

agregué un enlace a un sitio que tiene muchos códigos fuente de CV y aplicaciones de procesamiento de imágenes, incluido el seguimiento visual, que creo que puede resultar útil, ya que creo que la detección de la piel podría ser solo un posible enfoque. Puede valer la pena mirar a los demás. – lightalchemist

+0

Actualización del enlace para detectar personas desnudas - http://mfleck.cs.illinois.edu/naked.html – saurabheights

5

Here es un documento sobre la adaptación adaptativa de la piel modelo de mezcla gaussiana que puede resultarle interesante.

Además, recuerdo haber leído un artículo (desafortunadamente parece que no puedo rastrearlo) que usaba una técnica muy inteligente, pero requería que tuviera la cara en el campo de visión. La idea básica fue detectar la cara de la persona y usar el parche para la piel detectado en la cara para identificar el color de la piel automáticamente. Luego, use un modelo de mezcla gaussiana para aislar los píxeles de la piel de manera robusta.

Finalmente, Google Scholar puede ser una gran ayuda en la búsqueda del estado del arte en la detección de la piel. Está muy investigado en adademia en este momento y también se usa en la industria (por ejemplo, las imágenes de Google y las políticas de imágenes de carga de Facebook).

+0

también pensé en la idea de hacer un reconocimiento facial primero. desafortunadamente, no puedo suponer de manera confiable que haya un rostro presente. – Nicolas

4

Te será difícil encontrar el tono de la piel en función del color solamente.
En primer lugar, depende en gran medida del algoritmo de balance de blancos automático. Por ejemplo, en esta imagen, cualquier persona puede ver que el color es el tono de la piel. Pero para la computadora será azul. enter image description here

En segundo lugar, la calibración correcta del color en las cámaras digitales es algo difícil, y rara vez será lo suficientemente preciso para sus propósitos.
Puede ver www.DPReview.com, para entender a qué me refiero.

En conclusión, realmente creo que el color en sí mismo puede ser una entrada, pero no es suficiente.

+0

Esto supone que no puede controlar el balance de blancos. En muchas cámaras, se puede controlar manualmente. Además, si el tono de la piel se estima a través de la detección de rostros, también funcionaría en situaciones arbitrarias de balance de blancos. – mevatron

+0

El OP preguntó acerca de la detección de mano solo desde canales de color HSV. Además, puedo imaginarme muchas situaciones en las que no tienes caras en la imagen. –

5

He trabajado en algo similar hace 2 años. Puede probar con Particle Filter (Condensation), utilizando píxeles de color de piel como entrada para la inicialización. Es bastante robusto y rápido. La forma en que lo apliqué para mi proyecto es en este link. Tienes tanto una presentación (diapositivas) como la encuesta. Si inicializa el color de la mano con el color real extraído de la mano que va a rastrear, no debería haber ningún problema con personas de raza negra.

Para filtro de partículas, creo que puede encontrar algunas muestras de implementación de código. Buena suerte.

0

Bueno, mi experiencia con el modelado de la piel son malas, porque: 1) rayo puede variar - segmentación de la piel no es robusto 2) que marcará su cara también (como otros objetos similares a la piel)

I utilizaría técnicas de aprendizaje automático como el entrenamiento Haar, que, en mi opinión, si el enfoque es mucho mejor que modelar y corregir algunas restricciones (como detección de piel + umbralización ...)

Cuestiones relacionadas