web-dev-qa-db-fra.com

Déterminer les articulations du squelette avec une webcam (pas Kinect)

J'essaie de déterminer les articulations squelettiques (ou tout au moins de pouvoir suivre un seul Palm) à l'aide d'une webcam régulière. J'ai parcouru le Web et je n'arrive pas à trouver un moyen de le faire.

Chaque exemple que j'ai trouvé utilise Kinect. Je veux utiliser une seule webcam.

Je n'ai pas besoin de calculer la profondeur des articulations - je dois juste être capable de reconnaître leur position X, Y dans le cadre. C'est pourquoi j'utilise une webcam, pas une Kinect.

Jusqu'ici j'ai regardé:

  • OpenCV (la fonctionnalité "squelette" qui s'y trouve est un processus de simplification des modèles graphiques, mais il ne s'agit pas d'une détection et/ou d'une squelettisation d'un corps humain).
  • OpenNI (avec NiTE) - le seul moyen d'obtenir les liaisons est d'utiliser le périphérique Kinect, afin que cela ne fonctionne pas avec une webcam.

Je cherche une bibliothèque C/C++ (mais à ce stade-ci examinerait tout autre langage), de préférence open source (mais, là encore, envisagerons toute licence) pouvant effectuer les opérations suivantes:

  • Étant donné une image (un cadre d'une webcam) calculer les positions X, Y des articulations visibles
  • [Facultatif] Dans mon code, un flux de capture vidéo est rappelé avec des événements pour les positions des articulations.
  • Ne doit pas être super précis, mais préférerait qu'il soit très rapide (temps de traitement inférieur à 0,1 s par image)

J'apprécierais vraiment si quelqu'un pouvait m'aider avec ça. Cela fait quelques jours que je suis coincé là-dessus, sans chemin clair à suivre.

METTRE À JOUR

Deux ans plus tard, une solution a été trouvée: http://dlib.net/imaging.html#shape_predictor

26
YePhIcK

J'ai enfin trouvé une solution. Il s'avère qu'un projet open source dlib a un "prédicteur de forme" qui, une fois correctement formé, fait exactement ce dont j'ai besoin: il calcule la "pose" avec une précision assez satisfaisante. Une "pose" est définie de manière approximative comme "tout ce que vous pouvez l'entendre à reconnaître comme une pose" en l'entraînant avec un ensemble d'images, annotées avec les formes à extraire.

Le prédicteur de forme est décrit ici sur le site Web de dlib

2
YePhIcK

Suivre une main à l'aide d'une seule caméra sans informations de profondeur est une tâche sérieuse et un sujet de travail scientifique en cours. Je peux vous fournir de nombreux articles scientifiques intéressants et/ou très cités sur le sujet:

  • M. de La Gorce, D.J. Fleet et N. Paragios, «Estimation de pose de main 3D basée sur un modèle à partir d'une vidéo monoculaire.», Transactions IEEE sur l'analyse des modèles et l'intelligence artificielle, vol. 33 février 2011.
  • R. Wang et J. Popović, «Suivi manuel en temps réel avec un gant de couleur», ACM Transactions on Graphics (TOG), 2009.
  • B. Stenger, A. Thayananthan, P. H. S. Torr et R. Cipolla, «Suivi manuel des mains à l'aide d'un filtre bayésien hiérarchique.», Transactions IEEE sur l'analyse des modèles et l'intelligence artificielle, vol. 28, non. 9, p. 1372–84, septembre 2006.
  • J. M. Rehg et T. Kanade, «Suivi basé sur un modèle d'objets articulés à auto-obturation», dans Actes de la Conférence internationale sur la vision par ordinateur de l'IEEE, 1995, p. 612–617.

Suivi manuel de la littérature au 2ème chapitre:

  • T. de Campos, «Suivi visuel en 3D d'objets articulés et de mains», 2006.

Malheureusement, je ne connais pas de bibliothèque de suivi des mains disponible gratuitement.

19
Palmstrom

il existe un moyen simple de détecter la main à l’aide du tonus de la peau. peut-être que cela pourrait aider ... vous pouvez voir les résultats sur cet YouTube vidéo . mise en garde: le fond ne doit pas contenir d'éléments colorés comme le bois. 

voici le code:

''' 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()

le cv2.findContour est très utile, vous pouvez trouver le centre de gravité d'un "blob" en utilisant cv2.moments après avoir trouvé les contours. jetez un oeil à la documentation opencv sur descripteurs de forme

je n'ai pas encore compris comment faire les squelettes qui se trouvent au milieu du contour, mais je pensais à "éroder" les contours jusqu'à ce qu'il ne reste plus qu'une seule ligne. dans le traitement d'images, le processus s'appelle "squelettisation" ou "squelette morphologique". voici quelques informations de base sur la squelettisation

voici un lien qui implémente squelettisation en opencv et c ++

voici un lien pour squelettisation en opencv et python

j'espère que cela pourra aider :)

--- MODIFIER ----

je vous recommande fortement de lire ces articles de Deva Ramanan (après avoir consulté la page liée): http://www.ics.uci.edu/~dramanan/

  1. C. Desai, D. Ramanan. "Détecter des actions, des poses et des objets avec Relational Phraselets", Conférence européenne sur la vision par ordinateur (ECCV), Florence, Italie, oct. 2012. 
  2. D. Park, D. Ramanan. Conférence internationale "N-Best Maximal Decoders for Part Models" Sur la vision par ordinateur (ICCV) Barcelone, Espagne, novembre 2011. 
  3. D. Ramanan. "Apprendre à analyser des images d'objets articulés" Neural Info. Proc . Systems (NIPS), Vancouver, Canada, décembre 2006.
7
samkhan13

Ma suggestion, compte tenu de vos contraintes, serait d'utiliser quelque chose comme ceci: http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html

Voici un tutoriel pour l’utiliser pour la détection des visages: http://opencv.willowgargarage.com/wiki/FaceDetection?highlight=%28facial%29%%28recognition%29

Le problème que vous avez décrit est assez difficile et je ne suis pas sûr que le faire en utilisant uniquement une webcam soit un plan raisonnable, mais c'est probablement votre meilleur pari. Comme expliqué ici ( http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html?highlight=load#cascadeclassifier-load ), vous devrez former le classifieur avec quelque chose du genre

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

Rappelez-vous: Même si vous n’avez pas besoin d’informations sur la profondeur, cette information facilite l’identification d’une main par la bibliothèque.

2
Andrew W

L'approche la plus commune peut être vu dans la vidéo youtube suivante. http://www.youtube.com/watch?v=xML2S6bvMwI

Cette méthode n'est pas assez robuste, car elle a tendance à échouer si la main est trop tournée (par exemple, si la caméra regarde du côté de la main ou si la main est partiellement pliée). 

Si cela ne vous dérange pas d'utiliser deux caméras, vous pouvez regarder dans le travail de Robert Wang. Sa société actuelle ( 3GearSystems ) utilise cette technologie, complétée d’un kinect, pour assurer le suivi. Son document original utilise deux webcams mais son suivi est bien pire. 

Wang, Robert, Sylvain Paris et Jovan Popović. "Mains 6d: suivi des mains sans marqueur pour la conception assistée par ordinateur." Compte rendu du 24e symposium annuel de l'ACM sur les logiciels et technologies d'interface utilisateur. ACM, 2011.

Une autre option (encore une fois si l'utilisation "plus" qu'une seule webcam est possible), consiste à utiliser un émetteur IR. Votre main reflète assez bien la lumière infrarouge, contrairement à l'arrière-plan. En ajoutant un filtre à la webcam qui filtre la lumière normale (et en supprimant le filtre standard qui fait le contraire), vous pouvez créer un suivi manuel très efficace. L'avantage de cette méthode est que la segmentation de la main de l'arrière-plan est beaucoup plus simple. En fonction de la distance et de la qualité de la caméra, vous aurez besoin de davantage de LED infrarouges afin de refléter suffisamment de lumière dans la webcam. Le mouvement bissextile utilise cette technologie pour suivre les doigts et les paumes des mains (il utilise 2 caméras IR et 3 DEL IR pour également obtenir des informations sur la profondeur).

Tout cela étant dit; Je pense que le Kinect est votre meilleure option dans ce domaine. Oui, vous n'avez pas besoin de la profondeur, mais les informations de profondeur facilitent la détection de la main (en utilisant les informations de profondeur pour la segmentation).

2
Nallath

Avec les fonctionnalités motion tracking du projet open source Blender , il est possible de créer un modèle 3D basé sur un métrage 2D. Aucun kinect nécessaire. Depuis que blender est open source, vous pourrez peut-être utiliser leurs scripts pyton en dehors du framework de blender pour vos propres besoins. 

0
Ruut

Avez-vous déjà entendu parler de Eyesweb

Je l'ai utilisé pour l'un de mes projets et je pense que cela pourrait être utile pour ce que vous voulez atteindre ... Voici quelques publications intéressantes LNAI 3881 - Méthodes de suivi des doigts avec EyesWeb et Powerpointing-HCI utilisant des gestes

Fondamentalement, le flux de travail est:

  1. Vous créez votre patch dans EyesWeb
  2. Préparez les données que vous souhaitez envoyer avec un client réseau
  3. Utilisez ces données traitées sur votre propre serveur (votre application)

Cependant, je ne sais pas s’il est possible d’incorporer la partie traitement de l’image en temps réel de Eyes Web dans une bibliothèque logicielle.

0
Gomino

Je ne sais pas sur les solutions existantes possibles. Si l'apprentissage supervisé (ou semi-supervisé) est une option, des arbres de décision de formation ou des réseaux de neurones pourraient déjà suffire (kinect utilise des forêts aléatoires d'après ce que j'ai entendu). Avant de vous engager dans cette voie, faites tout votre possible pour trouver une solution existante. Bien faire les choses en apprentissage machine prend beaucoup de temps et d’expérimentation.

OpenCV a des composants d’apprentissage automatique, vous avez besoin de données de formation.

0
kutschkem