TechLife devBlog

Rozpoznawanie gestów za pomocą kamery

Kodowanie, Python, Projekty, Techblog 7 czerwca 2008 13:06

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.

Symbole wyglądają tak:

Kamera widziała to tak:

A reacTIVision tak:

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

Husio 07 czerwca 2008 / 14:01

Dostaję błąd i nie mam pojęcia jak to rozwiązać.

  1. python gesty.py

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

szarak 07 czerwca 2008 / 15:08

mam ten sam blad. jakies pomysly jak to naprawic?

trójkąt 07 czerwca 2008 / 17:45

Faktycznie, tu możecie mieć problem. Chodzi o format w jakim Wasza kamera zwraca obraz. Trzeba wybrać odpowiedni dla Waszej kamery.

Formaty RGB

V4L2_PIX_FMT_RGB332
V4L2_PIX_FMT_RGB555
V4L2_PIX_FMT_RGB565b1
V4L2_PIX_FMT_RGB555X
V4L2_PIX_FMT_RGB565X
V4L2_PIX_FMT_BGR24
V4L2_PIX_FMT_RGB24
V4L2_PIX_FMT_BGR32
V4L2_PIX_FMT_RGB3

Formaty YUV:

V4L2_PIX_FMT_GREY
V4L2_PIX_FMT_YUYV
V4L2_PIX_FMT_UYVY
V4L2_PIX_FMT_Y41P
V4L2_PIX_FMT_YVU420, V4L2_PIX_FMT_YUV420
V4L2_PIX_FMT_YVU410, V4L2_PIX_FMT_YUV410
V4L2_PIX_FMT_YUV422P
V4L2_PIX_FMT_YUV411P
V4L2_PIX_FMT_NV12, V4L2_PIX_FMT_NV21

szarak 07 czerwca 2008 / 18:24

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

Husio 07 czerwca 2008 / 18:41

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

trójkąt 07 czerwca 2008 / 18:47

szarak: sprawdź inny tryb, zamiast RGB daj L, CMYK, P lub F.

Husia: a Twoja kamera działa pod V4L2?

Husio 07 czerwca 2008 / 18:59

Jasne. Moja kamerka to isight wbudowany w macbooka.

trójkąt 07 czerwca 2008 / 19:17

iSight przesyła w jakimś skompresowanym formacie QuickTime’a. Prawdopodobnie YUV422_UC_To2VUY_W1x ale musisz dokładnie wygooglować.

Moarc/J-23 08 czerwca 2008 / 10:06

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.

Kys 08 czerwca 2008 / 14:24

Gratuluje pomysłu.
Jestem pod wrażeniem.

thm 09 czerwca 2008 / 11:30

Czemu tylko 4.5?

trójkąt 09 czerwca 2008 / 14:13

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.

xponok 09 czerwca 2008 / 14:15

brawo…

pawkow 09 czerwca 2008 / 23:39

Pomysł rewelacja!

skrobul 12 czerwca 2008 / 10:46

polecam obejrzec to
http://www.youtube.com/watch?v=v0srY37kkMw

:)
argus 27 lipca 2008 / 10:57

Pakiet pyvideograb jest niedostępny, może ktoś podać linka albo przesłać na
triacetylcholine@gmail.com

Moarc/J-23 29 lipca 2008 / 15:31

Najlepiej wrzucić na jakiś własny serwer albo na RapidShare’a, bo wtedy każdy będzie sobie mógł ściągnąć :p

trójkąt 13 listopada 2008 / 19:05

UPDATE: ponieważ strona projektu pyvideograb od jakiegoś czasu jest martwa zamieszczam spakowany moduł pyvideograb.tar.gz

Moarc/J-23 13 listopada 2008 / 19:09

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.

mietunek 10 stycznia 2012 / 00:26

Ś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



Komentarze