pyimagesearch adrian python image-processing opencv computer-vision skin

python - adrian - Detección de mano robusta a través de la visión por computadora



adrian py image search (5)

Bueno, mi experiencia con el modelado de la piel es mala, porque: 1) el rayo puede variar: la segmentación de la piel no es robusta 2) también marcará tu rostro (como otros objetos parecidos a la piel)

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

Actualmente estoy trabajando en un sistema para la detección robusta de manos.

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 a través de enlaces de Python.


¿Has echado un vistazo al papel de camshift de Gary Bradski? Puedes descargarlo desde aquí

Usé el algoritmo de detección de la piel hace un año para detectar regiones de la 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. Convierte la imagen al espacio de color HSV.
  2. Bote el canal V y considere el canal H y S, y por lo tanto, desconéctelo de las variaciones de iluminación.
  3. Píxeles de umbral con baja saturación debido a su inestabilidad.
  4. Ubique la región de piel seleccionada en un histograma 2D. (Función calcHist de OpenCV) Este histograma ahora actúa como modelo para la piel.
  5. Calcule la "proyección inversa" (es decir, use 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 de piel tendrán valores altos.
  6. Luego puede usar meanShift para buscar el modo del mapa de "probabilidad" 2D generado por el backproject o para detectar blobs de alta "probabilidad".

Tirar el canal V en HSV y solo considerar 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 libro original de OpenCV .

Como nota al margen, también he usado Gaussian Mixture Models (GMM) antes. 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.

Entonces, en conclusión, si solo está tratando de detectar las regiones de la piel que usan color, entonces vaya con el método del 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 ver el código fuente de muestra sobre cómo usar el histograma para la detección de la piel, puede echar un vistazo a la página de OpenCV aquí . Pero tenga en cuenta que se menciona en esa página web que solo usan el canal Hue y que utilizando tanto tono como saturación dar 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 la detección de regiones de piel que considera tanto el color como la textura. Los detalles se pueden encontrar aquí .

Puede encontrar aquí un gran recurso para el código fuente relacionado con la visión artificial y el procesamiento de imágenes, que incluye el código para el seguimiento visual. Y no, no es OpenCV.

Espero que esto ayude.


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

En segundo lugar, la calibración correcta del color en cámaras digitales es algo difícil, y rara vez será lo suficientemente preciso para sus propósitos.
Puedes 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.


Aquí hay un documento sobre la detección adaptativa de la piel modelo de mezcla gaussiana que puede encontrar 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 tuvieras 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 de lo último en detección de la piel. Se ha investigado mucho 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 carga de fotos de Facebook).


He trabajado en algo similar hace 2 años. Puede probar con el Filtro de Partículas ( Condensación ), 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 está en este enlace . Tienes tanto una presentación (diapositivas) como la encuesta. Si inicializas el color de la mano con el color real extraído de la mano que vas a seguir, no deberías tener ningún problema con las personas negras.

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