Rozpoznawanie gestów za pomocą kamery
Internet 7th Jun 2008
Od dawna chciałem już zrobić coś związanego z kamerą. W tym semestrze nadarzyła się okazja i zaproponowaliśmy prowadzącemu własny temat projektu z przedmiotu o nazwie „struktury systemów informatycznych”. Naszym zamierzeniem było stworzenie programu, który działałby podobnie jak gesty wykonywane myszą w Firefoksie tyle, że rolę myszki odegrać miała kamera. Założenia wstępne: platforma – Linux, język – Python.
Najwięcej problemów sprawiła nam sama kamera, a dokładniej to zbieranie i przetwarzanie jej obrazu.
Na początku zabraliśmy się za testowanie reacTIVision, które w zasadzie jest oprogramowaniem dla ekranów wielodotykowych. ReacTIVision ma swoją bibliotekę 89 symboli, które potrafi rozpoznać określając ich numer id, pozycję x-y, kąt nachylenia a nawet przyśpieszenie.
Działo to całkiem sprawnie. Jeżeli wykonaliśmy szybszy ruch markerem, a dokładniej przyśpieszenie markera przekroczyło pewną granicę, wówczas rozpoczynał się rysować gest. Wadą jednak tego rozwiązania były markery. Jeżeli nie miało się markera to program był bezużyteczny. Trzeba było więc go zastąpić czymś co ma każdy, np. ręką :-)
Do łapania obrazu z kamery tym razem wykorzystaliśmy moduł Pythona pyvideograb. Znaleźliśmy nawet bardzo przydatny skrypt, który wykrywał punkty ruchu w obrazie poprzez porównywanie dwóch sąsiednich klatek. Co prawda autorzy zaznaczyli, że działa tylko pod Windowsem z uwagi na moduł do przychwytywania obrazu z kamery, ale ten łatwo można było podmienić.
Teraz wystarczyło wrzucić wszystko do Pygame’a i już pierwsze efekty były widoczne.
Program wykrywał ruch i potrafił określić współrzędne punktu ruchu, co w przypadku poruszającej się większej powierzchni oznaczało jej środek.
Po naciśnięciu spacji możemy już wykonywać gest.
Następny etap to sieć neuronowa a dokładniej sieć Hopfielda. Dzięki niej jesteśmy w stanie rozpoznać, czy wykonany gest zgadza się z jednym z 4 wzorców. Jeżeli tak, wykonywane jest przypisane do niego polecenie.
W konsoli wygląda to tak:
W tej chwili program ma wprowadzone 4 wzorce (plik: patterns.txt)
Przypisane do nich działania można łatwo edytować (interfejs.py)
Jeżeli ktoś miał by ochotę się tym pobawić lub zrobić z tym coś więcej to proszę bardzo.
Gesty v0.001 na licencji GNU GPL
Projekt – 4.5, radość ze zrealizowanego pomysłu – bezcenna ;-)
Współautorzy:
– Marek Knaga
– Jarosław Miazga
UPDATE: ponieważ strona projektu pyvideograb od jakiegoś czasu jest martwa zamieszczam spakowany moduł pyvideograb.tar.gz
Komentarze z jogger.pl
Dostaję błąd i nie mam pojęcia jak to rozwiązać.
Traceback (most recent call last): File „gesty.py”, line 54, in <module> pixelformat = v4l2_consts.V4L2_PIX_FMT_RGB24
directvideo.DirectVideoError: ioctl(VIDIOC_S_FMT) failure : 22, Invalid argument
mam ten sam blad. jakies pomysly jak to naprawic?
Faktycznie, tu możecie mieć problem. Chodzi o format w jakim Wasza kamera zwraca obraz. Trzeba wybrać odpowiedni dla Waszej kamery.
Formaty RGB
Formaty YUV:
w moim przypadku tylko ten dal jakikolwiek efekt V4L2_PIX_FMT_YUYV.
okienko programy na sekunde sie pokazuje a potem dostaje:
Traceback (most recent call last): File „gesty.py”, line 132, in <module> ni = Image.fromstring(‘RGB’,(SIZE0,SIZE1),nii) File „/usr/lib/python2.5/site-packages/PIL/Image.py”, line 1745, in fromstring im.fromstring(data, decoder_name, args) File „/usr/lib/python2.5/site-packages/PIL/Image.py”, line 576, in fromstring raise ValueError(„not enough image data”)
ValueError: not enough image data
kamerka to wbudowana w lapka kamerka HP
Pozwoliłem sobie na szybko program zmienić, żeby przetestować wszystkie wartości. Niestety, z żadną z nich nie działa.
Oto patch: http://pastebin.com/m419acf79
szarak: sprawdź inny tryb, zamiast RGB daj L, CMYK, P lub F.
Husia: a Twoja kamera działa pod V4L2?
Jasne. Moja kamerka to isight wbudowany w macbooka.
iSight przesyła w jakimś skompresowanym formacie QuickTime’a. Prawdopodobnie YUV422_UC_To2VUY_W1x ale musisz dokładnie wygooglować.
Myślałem, że to będą gesty bardziej złożone (ułożenie ręki, a nie wyrysowany w powietrzu kształt/znak), np. pokazanie środkowego palca = rm -rf / :D
Projekt świetny.
Gratuluje pomysłu.
Jestem pod wrażeniem.
Czemu tylko 4.5?
I to jest dobre pytanie :-) Grunt to nie zwracać uwagi na oceny i robić swoje, bo większość prowadzących ma raczej mgliste pojęcie o przedmiocie który prowadzi.
brawo…
Pomysł rewelacja!
polecam obejrzec to
:)http://www.youtube.com/watch?v=v0srY37kkMw
Pakiet pyvideograb jest niedostępny, może ktoś podać linka albo przesłać na
triacetylcholine@gmail.com
Najlepiej wrzucić na jakiś własny serwer albo na RapidShare’a, bo wtedy każdy będzie sobie mógł ściągnąć :p
UPDATE: ponieważ strona projektu pyvideograb od jakiegoś czasu jest martwa zamieszczam spakowany moduł pyvideograb.tar.gz
Hmm, u mnie uruchomienie gesty.py (nawet po zmianie czegóśtam na V4L2_PIX_FMT_YUV422P) zwraca „not enough image data”. Gdy usunąłem z /usr/share/python2.5/site-packages/PIL/Image.py linię zwracającą ten komunikat, program uruchomił się, ale w okienku pygame pojawiają się krzaczki.
Świetna robota !
Jestem na etapie szukania tego typu rozwiązań, znalazłem kinecta, który oferuje gotowe API, ale szukam czegoś co byłoby niezależne od zewnętrznej platformy.
pozdrawiam