Determinar las articulaciones esqueléticas con una cámara web (no Kinect)


Estoy tratando de determinar articulaciones esqueléticas (o al menos para poder rastrear una sola palma) usando una webcam regular. He buscado por toda la web y parece que no puedo encontrar una manera de hacerlo.

Cada ejemplo que he encontrado está usando Kinect. Quiero usar una sola webcam.

No es necesario que calcule la profundidad de las articulaciones, solo necesito ser capaz de reconocer su posición X, Y en el marco. Por eso estoy usando una webcam, no una Kinect.

Hasta ahora he mirado:

  • OpenCV (la funcionalidad de "esqueleto" en él es un proceso de simplificación de los modelos gráficos, pero no es una detección y/o esqueleto de un cuerpo humano).
  • OpenNI (con NiTE): la única manera de obtener las articulaciones es usar el dispositivo Kinect, por lo que esto no funciona con una cámara web.

Estoy buscando una biblioteca de C / C++ (pero en este punto miraría cualquier otro lenguaje), preferiblemente de código abierto (pero, de nuevo, consideraré cualquier licencia) que puede hacer lo siguiente:

  • Dada una imagen (un marco de una cámara web) calcular las posiciones X, Y de las articulaciones visibles
  • [Opcional] Dado un flujo de captura de video, llame de nuevo a mi código con eventos para las posiciones de las articulaciones
  • No tiene que ser súper preciso, pero preferiría que fuera muy rápido (tiempo de procesamiento de menos de 0.1 segundos por fotograma)

Realmente apreciaría si alguien me puede ayudar con esto. He estado atascado en esto por unos pocos días ahora sin un camino claro para proceder.

UPDATE

2 años después se encontró una solución: http://dlib.net/imaging.html#shape_predictor

Author: YePhIcK, 2013-06-15

8 answers

Rastrear una mano usando una sola cámara sin información de profundidad es una tarea seria y un tema de trabajo científico en curso. Puedo suministrarle un montón de artículos científicos interesantes y/o muy citados sobre el tema:

  • M. de La Gorce, D. J. Fleet, and N. Paragios, "Model-Based 3D Hand Pose Estimation from Monocular Video., "IEEE transactions on pattern analysis and machine intelligence, vol. 33, Feb. 2011.
  • R. Wang y J. Popović, " Seguimiento manual en tiempo real con un color glove, " ACM Transactions on Graphics (TOG), 2009.
  • B. Stenger, A. Thayananthan, P. H. S. Torr, and R. Cipolla, "Model-based hand tracking using a hierarchical Bayesian filter., "IEEE transactions on pattern analysis and machine intelligence, vol. 28, no. 9, pp 1372-84, Sep. 2006.
  • J. M. Rehg y T. Kanade, "Model-based tracking of self-ocluding articulated objects," en Proceedings of IEEE International Conference on Computer Vision, 1995, pp.612-617.

Mano seguimiento de la encuesta de literatura en el 2do capítulo:

  • T. de Campos, "3D Visual Tracking of Articulated Objects and Hands," 2006.

Desafortunadamente no conozco alguna biblioteca de seguimiento de manos disponible gratuitamente.

 18
Author: Palmstrom,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-25 15:00:32

Hay una manera sencilla de detectar la mano usando el tono de piel. tal vez esto podría ayudar... puedes ver los resultados en este video de youtube . advertencia: el fondo no debe contener cosas del color de la piel como la madera.

Aquí está el código:

''' Detect human skin tone and draw a boundary around it.
Useful for gesture recognition and motion tracking.

Inspired by: http://stackoverflow.com/a/14756351/1463143

Date: 08 June 2013
'''

# Required moduls
import cv2
import numpy

# Constants for finding range of skin color in YCrCb
min_YCrCb = numpy.array([0,133,77],numpy.uint8)
max_YCrCb = numpy.array([255,173,127],numpy.uint8)

# Create a window to display the camera feed
cv2.namedWindow('Camera Output')

# Get pointer to video frames from primary device
videoFrame = cv2.VideoCapture(0)

# Process the video frames
keyPressed = -1 # -1 indicates no key pressed

while(keyPressed < 0): # any key pressed has a value >= 0

    # Grab video frame, decode it and return next video frame
    readSucsess, sourceImage = videoFrame.read()

    # Convert image to YCrCb
    imageYCrCb = cv2.cvtColor(sourceImage,cv2.COLOR_BGR2YCR_CB)

    # Find region with skin tone in YCrCb image
    skinRegion = cv2.inRange(imageYCrCb,min_YCrCb,max_YCrCb)

    # Do contour detection on skin region
    contours, hierarchy = cv2.findContours(skinRegion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # Draw the contour on the source image
    for i, c in enumerate(contours):
        area = cv2.contourArea(c)
        if area > 1000:
            cv2.drawContours(sourceImage, contours, i, (0, 255, 0), 3)

    # Display the source image
    cv2.imshow('Camera Output',sourceImage)

    # Check for user input to close program
    keyPressed = cv2.waitKey(1) # wait 1 milisecond in each iteration of while loop

# Close window and camera after exiting the while loop
cv2.destroyWindow('Camera Output')
videoFrame.release()

El cv2.findContour es bastante útil, puedes encontrar el centroide de un "blob" usando cv2.momentos después de u encontrar los contornos. eche un vistazo a la documentación de opencv sobre descriptores de forma.

Todavía no me he imaginado cómo hacer los esqueletos que se encuentran en el centro del contorno, pero estaba pensando en "erosionar" los contornos hasta que sea una sola línea. en el procesamiento de imágenes el proceso se llama "esqueletización"o" esqueleto morfológico". aquí hay algo de información básica sobre la esqueletización.

Aquí hay un enlace que implementa esqueletización en opencv y c++

Aquí hay un enlace para esqueletización en opencv y python

Esperanza que ayuda :)

--- EDITAR ----

Le recomiendo encarecidamente que revise estos documentos de Deva Ramanan (desplácese hacia abajo después de visitar la página enlazada): http://www.ics.uci.edu / ~ dramanan /

  1. C. Desai, D. Ramanan. "Detectar Acciones, Poses y Objetos con Frases Relacionales " Conferencia Europea sobre Visión por Ordenador (ECCV), Florencia, Italia, Oct. 2012.
  2. D. Park, D. Ramanan. "N-Mejores Descodificadores Maximal para Modelos de Piezas" Internacional Congreso sobre Visión por Computador (ICCV) Barcelona, España, noviembre 2011.
  3. D. Ramanan. "Learning to Parse Images of Articulated Objects" Neural Info. Proc. Systems (NIPS), Vancouver, Canada, Dec 2006.
 7
Author: samkhan13,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-01 03:36:36

El enfoque más común se puede ver en el siguiente video de youtube. http://www.youtube.com/watch?v=xML2S6bvMwI

Este método no es muy robusto, ya que tiende a fallar si la mano se gira mucho (por ejemplo, si la cámara está mirando al lado de la mano o a una mano parcialmente doblada).

Si no te importa usar dos cámaras, puedes mirar el trabajo de Robert Wang. Su empresa actual (3GearSystems ) utiliza esta tecnología, aumentada con un kinect, para proporcionar seguimiento. Su artículo original utiliza dos cámaras web, pero tiene mucho peor seguimiento.

Wang, Robert, Sylvain Paris y Jovan Popović. "6d hands: markerless hand-tracking for computer aided design."Proceedings of the 24th annual ACM symposium on User interface software and technology. ACM, 2011.

Otra opción (de nuevo si es posible usar "más" que una sola cámara web), es usar un emisor IR. Su mano refleja la luz IR bastante bien mientras que el fondo lo hace ni. Al agregar un filtro a la cámara web que filtra la luz normal (y eliminar el filtro estándar que hace lo contrario) puede crear un seguimiento de manos bastante efectivo. La ventaja de este método es que la segmentación de la mano desde el fondo es mucho más sencilla. Dependiendo de la distancia y la calidad de la cámara, necesitará más led IR, con el fin de reflejar suficiente luz de nuevo en la cámara web. El leap motion utiliza esta tecnología para rastrear los dedos y las palmas (utiliza 2 IR cámaras y 3 led IR para obtener también información de profundidad).

Dicho todo esto; creo que el Kinect es su mejor opción en esto. Sí, no necesitas la profundidad, pero la información de profundidad hace que sea mucho más fácil detectar la mano (usando la información de profundidad para la segmentación).

 2
Author: Nallath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-20 15:36:04

Mi sugerencia, dadas sus restricciones, sería usar algo como esto: http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html

Aquí hay un tutorial para usarlo para la detección de rostros: http://opencv.willowgarage.com/wiki/FaceDetection?highlight=%28facial%29/%28recognition%29

El problema que has descrito es bastante difícil, y no estoy seguro de que intentar hacerlo usando solo una cámara web sea un plan razonable, pero esto es probablemente tu mejor apuesta. Como se explica aquí (http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html?highlight=load#cascadeclassifier-load), usted tendrá que entrenar el clasificador con algo como esto:

Http://docs.opencv.org/doc/user_guide/ug_traincascade.html

Recuerde: Aunque no necesite la información de profundidad para su uso, tener esta información hace que sea más fácil para la biblioteca identificar una mano.

 2
Author: Andrew W,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-24 15:28:08

Por fin he encontrado una solución. Resulta que un proyecto de código abierto dlib tiene un "predictor de forma" que, una vez entrenado adecuadamente, hace exactamente lo que necesito: adivina (con una precisión bastante satisfactoria) la "pose". Una " pose "se define vagamente como" lo que se entrena para reconocer como una pose " entrenándola con un conjunto de imágenes, anotadas con las formas para extraer de ellas.

El predictor de forma es descrito aquí en El sitio web de dlib

 2
Author: YePhIcK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-08 22:54:02

No conozco las posibles soluciones existentes. Si el aprendizaje supervisado (o semi-supervisado) es una opción, los árboles de decisión de entrenamiento o las redes neuronales podrían ser suficientes (kinect usa bosques aleatorios por lo que he oído). Antes de ir por ese camino, haga todo lo posible para encontrar una solución existente. Hacer bien las cosas de aprendizaje automático requiere mucho tiempo y experimentación.

OpenCV tiene componentes de aprendizaje automático, lo que necesitaría son datos de entrenamiento.

 0
Author: kutschkem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-24 13:34:44

Con las características de seguimiento de movimiento del proyecto Blender de código abierto es posible crear un modelo 3D basado en imágenes 2D. No se necesita kinect. Dado que blender es de código abierto, es posible que pueda usar sus scripts de pyton fuera del marco de blender para sus propios fines.

 0
Author: Ruut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-24 14:30:20

¿Alguna vez has oído hablar de Eyesweb

Lo he estado usando para uno de mis proyectos y pensé que podría ser útil para lo que quieres lograr. Aquí hay algunas publicaciones interesantes LNAI 3881-Métodos de rastreo de dedos Usando EyesWeb y Powerpointing-HCI usando gestos

Básicamente el flujo de trabajo es:

  1. Usted crea su parche en EyesWeb
  2. Prepare los datos que desea enviar con un cliente de red
  3. Use tesis datos procesados en su propio servidor (su aplicación)

Sin embargo, no se si hay una manera de incrustar la parte de procesamiento de imágenes en tiempo real de Eyes Web en una biblioteca suave como una.

 0
Author: Gomino,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-01 00:26:10