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é:
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:
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
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
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:
Suivi manuel de la littérature au 2ème chapitre:
Malheureusement, je ne connais pas de bibliothèque de suivi des mains disponible gratuitement.
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/
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.
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).
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.
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:
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.
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.