Określ stawy szkieletowe za pomocą kamery internetowej (nie Kinect)

Próbuję określić stawy szkieletowe (lub przynajmniej być w stanie śledzić pojedynczą dłoń) za pomocą zwykłej kamery internetowej. Szukałem w sieci i nie mogę znaleźć na to sposobu.

Każdy przykład jaki znalazłem to Kinect. Chcę użyć jednej kamery.

Nie ma potrzeby obliczania głębokości połączeń - muszę tylko być w stanie rozpoznać ich położenie X, Y w ramie. Dlatego używam kamery internetowej, a nie Kinect.

Do tej pory obejrzałem:

  • OpenCV (funkcjonalność" szkieletu " w nim jest procesem upraszczania modeli graficznych, ale nie jest to Wykrywanie i / lub szkieletonizacja ludzkiego ciała).
  • OpenNI (z NiTE) - jedynym sposobem na uzyskanie połączeń jest użycie urządzenia Kinect, więc nie działa to z kamerą internetową.

Szukam biblioteki C / C++ (ale w tym momencie spojrzałbym na każdy inny język), najlepiej open source (ale znowu rozważę Każda licencja), która może wykonać następujące czynności:

  • biorąc pod uwagę obraz (ramkę z kamery internetowej) Oblicz pozycje X, Y widocznych stawów
  • [Opcjonalnie] wywołanie strumienia przechwytywania wideo z powrotem do mojego kodu ze zdarzeniami dla pozycji stawów
  • Nie musi być bardzo dokładny, ale wolałby być bardzo szybki (czas przetwarzania poniżej 0,1 s na klatkę) [14]}

Byłabym wdzięczna, gdyby ktoś mógł mi z tym pomóc. Utknąłem na tym od kilku dni bez wyraźnej ścieżki do kontynuowania.

UPDATE

2 lata później znaleziono rozwiązanie: http://dlib.net/imaging.html#shape_predictor

Author: YePhIcK, 2013-06-15

8 answers

Śledzenie ręki za pomocą jednej kamery bez informacji o głębi jest poważnym zadaniem i tematem trwających prac naukowych. Mogę dostarczyć Ci kilka ciekawych i / lub często cytowanych prac naukowych na ten temat:

    [[3]}M. De La Gorce, D. J. Fleet i N. Paragios, "model-Based 3d hand Pose Estimation from Monocular Video.,, IEEE transactions on pattern analysis and machine intelligence, vol. 33.02.2012 2011. R. Wang i J. Popović, " ręczne śledzenie w czasie rzeczywistym z kolorem "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, nr 9, s. 1372-84, Sep. 2006. J. M. Rehg i T. Kanade, "Model-based tracking of self-occluding articulated objects", w Proceedings of IEEE International Conference on Computer Vision, 1995, PP.612-617.

Ręka badanie literatury śledzącej w drugim rozdziale:

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

Niestety nie wiem jak jakaś darmowa biblioteka do śledzenia rąk.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-25 15:00:32

Istnieje prosty sposób na wykrycie dłoni za pomocą odcienia skóry. może to pomoże... wyniki można zobaczyć na tym wideo youtube . uwaga: tło nie powinno zawierać rzeczy w kolorze skóry, takich jak drewno.

Oto kod:

''' 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 jest bardzo przydatny, możesz znaleźć centroid "Bloba" za pomocą cv2.chwile po u znaleźć kontury. zapoznaj się z dokumentacją opencv dotyczącą deskryptorów kształtu .

Nie doszedłem jeszcze do wniosku jak zrobić szkielety, które leżą w środku konturu, ale myślałem o "erozji" konturów, aż będzie to pojedyncza linia. w przetwarzaniu obrazu proces ten nazywany jest "szkieletonizacją" lub "szkieletem morfologicznym". oto kilka podstawowych informacji na temat skeletonizacji .

Oto link, który implementuje skeletonizację w opencv i c++

Oto link do skeletonizacji w opencv i Pythonie

Hope that helps :)

--- edytuj ----

Gorąco polecam, abyś przejrzał te dokumenty Deva Ramanana (przewiń w dół po odwiedzeniu połączonej strony): http://www.ics.uci.edu / ~ dramanan /

  1. C. Desai, D. Ramanan. "Wykrywanie akcji, pozy i obiektów z Frazy relacyjne " European Conference on Computer Vision (ECCV), Florencja, Włochy, październik 2012.
  2. D. Park, D. Ramanan. "N-najlepsze Dekodery do modeli części" International Konferencja on Computer Vision (ICCV) Barcelona, Hiszpania, listopad 2011.
  3. D. Ramanan. "Nauka parsowania obrazów Artykulowanych obiektów" Proc. Systemy (NIPS), Vancouver, Kanada, grudzień 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-01 03:36:36

Najczęstsze podejście można zobaczyć w poniższym filmie youtube. http://www.youtube.com/watch?v=xML2S6bvMwI

Ta metoda nie jest dość solidna, ponieważ ma tendencję do niepowodzenia, jeśli ręka jest obrócona do dużo (np. jeśli kamera patrzy na bok ręki lub na częściowo wygiętą rękę).

Jeśli nie masz nic przeciwko użyciu dwóch kamer, możesz przyjrzeć się pracy Roberta Wanga. Jego obecna firma (3GearSystems) wykorzystuje tę technologię, wzbogaconą o kinect, do zapewnić śledzenie. Jego oryginalna praca wykorzystuje dwie kamery internetowe, ale ma znacznie gorsze śledzenie.

Wang, Robert, Sylvain Paris i Jovan Popović. "6D hands: markerless hand-tracking dla komputerowego wspomagania projektowania."Materiały z 24th annual ACM symposium on User interface software and technology. ACM, 2011.

Inną opcją (ponownie, jeśli możliwe jest użycie "więcej" niż jedna kamera internetowa), jest użycie emitera podczerwieni. Ręka dobrze odbija światło IR, podczas gdy tło nie. Dodając filtr do kamery internetowej, który filtruje normalne światło (i usuwając standardowy filtr, który robi odwrotnie), możesz stworzyć całkiem skuteczne śledzenie ręki. Zaletą tej metody jest to, że segmentacja dłoni od tła jest znacznie prostsza. W zależności od odległości i jakości kamery, Potrzebujesz więcej diod IR, aby odbić wystarczające światło z powrotem do kamery. Leap motion wykorzystuje tę technologię do śledzenia palców i dłoni (wykorzystuje 2 Podczerwieni kamery i 3 DIODY IR, aby uzyskać również informacje o głębokości).

To wszystko jest powiedziane; myślę, że Kinect jest najlepszym rozwiązaniem w tym. Tak, nie potrzebujesz głębokości, ale informacje o głębokości znacznie ułatwiają wykrycie ręki (używając informacji o głębokości do segmentacji).

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-20 15:36:04

Moją sugestią, biorąc pod uwagę twoje ograniczenia, byłoby użycie czegoś takiego: http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html

Oto samouczek użycia go do wykrywania twarzy: http://opencv.willowgarage.com/wiki/FaceDetection?highlight=%28facial%29/%28recognition%29

Problem, który opisałeś, jest dość trudny i nie jestem pewien, czy próba zrobienia tego przy użyciu tylko kamery internetowej jest rozsądnym planem, ale to to chyba najlepsze wyjście. Jak wyjaśniono tutaj (http://docs.opencv.org/modules/objdetect/doc/cascade_classification.html?highlight=load#cascadeclassifier-load), będziesz musiał trenować klasyfikatora z czymś takim:

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

Pamiętaj: mimo że nie potrzebujesz informacji o głębi do użytku, posiadanie tych informacji ułatwia bibliotece identyfikację ręki.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-24 15:28:08

W końcu znalazłem rozwiązanie. Okazuje się, że projekt open-source ma "predyktor kształtu", który po odpowiednim przeszkoleniu robi dokładnie to, czego potrzebuję: zgaduje (z dość zadowalającą dokładnością)"pozę". "Poza "jest luźno zdefiniowana jako" cokolwiek trenujesz, aby rozpoznać jako pozę", trenując ją za pomocą zestawu obrazów, opatrzonych adnotacjami o kształtach, które z nich wydobywają.

Predyktor kształtu jest opisany tutaj na stronie 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/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-08 22:54:02

Nie wiem o możliwych istniejących rozwiązaniach. Jeśli istnieje opcja nadzorowanego (lub częściowo nadzorowanego) uczenia się, szkoleniowe drzewa decyzyjne lub sieci neuronowe mogą już wystarczyć (kinect wykorzystuje losowe lasy z tego, co słyszałem). Zanim pójdziesz taką ścieżką, zrób wszystko, co w twojej mocy, aby znaleźć istniejące rozwiązanie. Poprawienie uczenia maszynowego zajmuje dużo czasu i eksperymentów.

OpenCV ma komponenty uczenia maszynowego, potrzebne są dane treningowe.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-24 13:34:44

Z motion tracking features z open source Blender project można stworzyć model 3D oparty na materiale 2D. Nie jest potrzebny sensor kinect. Ponieważ blender jest open source, możesz używać ich skryptów pyton poza frameworkiem blendera do własnych celów.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-24 14:30:20

Czy słyszałeś kiedyś o Eyesweb

Używałem go do jednego z moich projektów i pomyślałem, że może być przydatny do tego, co chcesz osiągnąć. Oto kilka ciekawych publikacji LNAI 3881-Finger Tracking Methods Using EyesWeb i Powerpointing-HCI using gestures

W zasadzie workflow to:

  1. tworzysz swoją łatkę w EyesWeb
  2. przygotuj dane, które chcesz wysłać z klientem sieciowym
  3. użyj tez przetwarzane dane na twoim własnym serwerze (Twojej aplikacji)

Jednak Nie wiem, czy istnieje sposób, aby osadzić część przetwarzania obrazu w czasie rzeczywistym Eyes Web w soft as a library.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2013-07-01 00:26:10