it-swarm.com.de

Skelettgelenke mit einer Webcam ermitteln (nicht Kinect)

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:

  • OpenCV (die "Skelett" -Funktionalität ist ein Prozess zur Vereinfachung grafischer Modelle, aber keine Erkennung und/oder Skelettierung eines menschlichen Körpers).
  • OpenNI (mit NiTE) - Die einzige Möglichkeit, die Gelenke zu erhalten, ist die Verwendung des Kinect-Geräts. Dies funktioniert also nicht mit einer Webcam.

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:

  • Bei einem gegebenen Bild (einem Frame aus einer Webcam) berechnen Sie die X-, Y-Positionen der sichtbaren Verbindungen
  • [Optional] Angenommen, ein Videoaufnahmestrom wird mit Ereignissen für die Positionen der Verbindungen in meinen Code zurückgerufen
  • Muss nicht extrem genau sein, würde es aber vorziehen, sehr schnell zu sein (Verarbeitungszeit unter 0,1 Sekunden pro Frame)

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

26
YePhIcK

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

2
YePhIcK

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:

  • M. de La Gorce, D. J. Fleet und N. Paragios, "Modellbasierte 3D-Handpositionsschätzung von Monocular Video.", IEEE-Transaktionen zu Musteranalyse und Machine Intelligence. Vol. 33, Feb. 2011.
  • R. Wang und J. Popović, „Echtzeit-Handtracking mit einem Farbhandschuh“, ACM Transactions on Graphics (TOG), 2009.
  • B. Stenger, A. Thayananthan, P. H. S. Torr und R. Cipolla, "Modellbasiertes Handtracking mit einem hierarchischen Bayes'schen Filter". IEEE-Transaktionen zu Musteranalyse und Machine Intelligence. Vol. 28, nein. 9, S. 1372–84, September 2006.
  • J. M. Rehg und T. Kanade, „Modellbasierte Verfolgung von sich selbst okkludierenden artikulierten Objekten“ in Proceedings of IEEE, Internationale Konferenz zu Computer Vision, 1995, S. 612–617.

Hand-Tracking-Literaturübersicht im 2. Kapitel:

  • T. de Campos, „3D-visuelle Verfolgung von artikulierten Objekten und Händen“, 2006.

Leider kenne ich keine frei verfügbare Hand-Tracking-Bibliothek.

19
Palmstrom

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/

  1. C. Desai, D. Ramanan. "Erkennen von Aktionen, Posen und Objekten mit Relational Phraselets" Europäische Konferenz über Computer Vision (ECCV), Florenz, Italien, Oktober 2012. 
  2. D. Park, D. Ramanan. "N-Best Maximal Decoder für Teilmodelle" Internationale Konferenz über Computer Vision (ICCV) Barcelona, ​​Spanien, November 2011. 
  3. D. Ramanan. "Lernen, Bilder artikulierter Objekte zu analysieren". Proc . Systems (NIPS), Vancouver, Kanada, Dezember 2006.
7
samkhan13

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.

2
Andrew W

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).

2
Nallath

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. 

0
Ruut

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:

  1. Sie erstellen Ihren Patch in EyesWeb
  2. Bereiten Sie die Daten vor, die Sie mit einem Netzwerk-Client senden möchten
  3. Verwenden Sie diese verarbeiteten Daten auf Ihrem eigenen Server (Ihrer App).

Ich weiß jedoch nicht, ob es eine Möglichkeit gibt, den Echtzeit-Bildverarbeitungsteil von Eyes Web in eine Soft-Library zu integrieren.

0
Gomino

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.

0
kutschkem