Ich versuche, Skelettgelenke (oder zumindest einen einzelnen Palm nachverfolgen zu können) mithilfe einer normalen Webcam zu ermitteln. Ich habe im ganzen Internet nachgesehen und finde keinen Weg, dies zu tun.
Jedes Beispiel, das ich gefunden habe, verwendet Kinect. Ich möchte eine einzelne Webcam verwenden.
Ich muss nicht die Tiefe der Verbindungen berechnen - ich muss nur ihre XY-Position im Rahmen erkennen können. Deshalb verwende ich eine Webcam, kein Kinect.
Bisher habe ich angeschaut:
Ich bin auf der Suche nach einer C/C++ - Bibliothek (würde an dieser Stelle jedoch nach einer anderen Sprache suchen), vorzugsweise Open Source (wird aber auch jede Lizenz in Betracht ziehen), die Folgendes tun kann:
Würde es wirklich sehr schätzen, wenn mir jemand dabei helfen kann. Ich bin schon seit ein paar Tagen dabei, ohne einen klaren Weg zu gehen.
UPDATE
2 Jahre später wurde eine Lösung gefunden: http://dlib.net/imaging.html#shape_predictor
Endlich habe ich eine Lösung gefunden. Ein dlib
Open-Source-Projekt hat einen "Shape-Predictor", der, wenn er richtig trainiert wurde, genau das tut, was ich brauche: Es gibt die "Pose" (mit ziemlich zufriedenstellender Genauigkeit). Eine "Pose" wird lose als "was auch immer Sie trainieren, um eine Pose zu erkennen" definiert, indem Sie sie mit einem Satz von Bildern trainieren, die mit den Formen versehen sind, um daraus zu extrahieren.
Der Formprädiktor ist hier beschrieben auf dlibs Website
Eine Hand mit einer einzigen Kamera ohne Tiefeninformationen zu verfolgen, ist eine ernsthafte Aufgabe und ein Thema laufender wissenschaftlicher Arbeit. Ich kann Ihnen eine Reihe interessanter und/oder viel zitierter wissenschaftlicher Artikel zum Thema liefern:
Hand-Tracking-Literaturübersicht im 2. Kapitel:
Leider kenne ich keine frei verfügbare Hand-Tracking-Bibliothek.
es gibt eine einfache Möglichkeit, die Haut anhand der Hautfarbe zu erkennen. Vielleicht könnte dies helfen ... Sie können die Ergebnisse auf diesem YouTube Video sehen. Achtung: Der Hintergrund sollte keine hautfarbenen Dinge wie Holz enthalten.
hier ist der 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()
cv2.findContour ist sehr nützlich. Sie können den Schwerpunkt eines "Blobs" mit cv2.moments finden, nachdem Sie die Konturen gefunden haben. Sehen Sie sich die opencv-Dokumentation unter shape descriptors an.
ich habe noch nicht herausgefunden, wie man die Skelette macht, die in der Mitte der Kontur liegen, aber ich dachte daran, die Konturen zu "erodieren", bis es eine einzige Linie ist. In der Bildverarbeitung wird der Prozess als "Skelettierung" oder "morphologisches Skelett" bezeichnet. Hier sind einige grundlegende Informationen zur Skelettierung .
hier ist ein link, der skeletonization in opencv und c ++ implementiert
hier ist ein link für skeletonization in opencv und python
hoffentlich hilft das :)
--- EDIT ----
ich würde wärmstens empfehlen, dass Sie diese Papiere von Deva Ramanan durchgehen (nach dem Aufrufen der verlinkten Seite nach unten scrollen): http://www.ics.uci.edu/~dramanan/
Mein Vorschlag wäre, unter Berücksichtigung Ihrer Einschränkungen, Folgendes zu verwenden: http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html
Hier ist ein Tutorial für die Verwendung zur Gesichtserkennung: http://opencv.willowgarage.com/wiki/FaceDetection?highlight=%28facial%29|%28recognition%29
Das von Ihnen beschriebene Problem ist ziemlich schwierig, und ich bin nicht sicher, dass der Versuch, es nur mit einer Webcam zu tun, ein vernünftiger Plan ist, aber dies ist wahrscheinlich die beste Wahl. Wie hier erklärt ( http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html?highlight=load#cascadeclassifier-load ), müssen Sie den Klassifikator folgendermaßen trainieren:
http://docs.opencv.org/doc/user_guide/ug_traincascade.html
Denken Sie daran: Auch wenn Sie keine Tiefeninformationen für Ihre Verwendung benötigen, erleichtert diese Information die Identifizierung einer Hand durch die Bibliothek.
Der gebräuchlichste Ansatz ist im folgenden Youtube-Video zu sehen. http://www.youtube.com/watch?v=xML2S6bvMwI
Diese Methode ist nicht sehr robust, da sie zum Versagen neigt, wenn die Hand zu stark gedreht wird (z. B. wenn die Kamera auf die Handseite oder auf eine teilweise verbogene Hand schaut).
Wenn es Ihnen nichts ausmacht, zwei Kameras zu verwenden, können Sie sich die Arbeit von Robert Wang ansehen. Sein aktuelles Unternehmen ( 3GearSystems ) verwendet diese mit einer Kinekt-Technologie erweiterte Technologie zur Nachverfolgung. Sein Originalpapier verwendet zwei Webcams, hat jedoch ein viel schlechteres Tracking.
Wang, Robert, Sylvain Paris und Jovan Popović. "6d Hände: Markerloses Handtracking für computergestütztes Design." Vorträge des 24. jährlichen ACM-Symposiums zu Software und Technologie für die Benutzeroberfläche. ACM, 2011.
Eine weitere Option (wiederum wenn "mehr" als eine einzelne Webcam verwendet werden kann) ist die Verwendung eines IR-Senders. Ihre Hand reflektiert das IR-Licht ziemlich gut, der Hintergrund dagegen nicht. Durch Hinzufügen eines Filters zur Webcam, der normales Licht filtert (und den Standardfilter entfernt, der das Gegenteil tut), können Sie eine ziemlich effektive Handaufzeichnung erstellen. Der Vorteil dieser Methode ist, dass die Segmentierung der Hand vom Hintergrund wesentlich einfacher ist. Je nach Entfernung und Qualität der Kamera benötigen Sie mehr IR-LEDs, um ausreichend Licht in die Webcam zu reflektieren. Die Sprungbewegung verwendet diese Technologie, um die Finger und Handflächen zu verfolgen (es verwendet 2 IR-Kameras und 3 IR-LEDs, um auch Tiefeninformationen zu erhalten).
All das wird gesagt; Ich denke, der Kinect ist dabei die beste Option. Ja, Sie brauchen nicht die Tiefe, aber die Tiefeninformation macht es viel einfacher, die Hand zu erkennen (anhand der Tiefeninformationen für die Segmentierung).
Mit den Bewegungsverfolgungsfunktionen des Open Source Blender-Projekts ist es möglich, ein 3D-Modell basierend auf 2D-Filmmaterial zu erstellen. Kein kinect benötigt. Da Blender Open Source ist, können Sie die Pyton-Skripts außerhalb des Blender-Frameworks möglicherweise für Ihre eigenen Zwecke verwenden.
Haben Sie jemals von Eyesweb gehört?
Ich habe es für eines meiner Projekte verwendet und ich denke, es könnte für das, was Sie erreichen wollen, nützlich sein ... Hier sind einige interessante Publikationen LNAI 3881 - Finger-Tracking-Methoden mit EyesWeb und Powerpointing-HCI mit Gesten
Grundsätzlich ist der Workflow:
Ich weiß jedoch nicht, ob es eine Möglichkeit gibt, den Echtzeit-Bildverarbeitungsteil von Eyes Web in eine Soft-Library zu integrieren.
Ich weiß nicht, welche möglichen Lösungen es gibt. Wenn beaufsichtigtes (oder halbüberwachtes) Lernen eine Option ist, sind Schulungsentscheidungsbäume oder neuronale Netzwerke möglicherweise bereits ausreichend (kinect verwendet zufällige Gesamtstrukturen, was ich gehört habe). Bevor Sie einen solchen Weg gehen, tun Sie alles, um eine vorhandene Lösung zu finden. Maschinelles Lernen richtig zu machen, erfordert viel Zeit und Experimente.
OpenCV verfügt über maschinelle Lernkomponenten, was Sie benötigen, sind Schulungsdaten.