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

Komentarze do notki “Rozpoznawanie gestów za pomocą kamery”

  1. Husio
    07 czerwca 2008 o 14:01:26

    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

  2. szarak
    07 czerwca 2008 o 15:08:59

    mam ten sam blad. jakies pomysly jak to naprawic?

  3. trójkąt
    07 czerwca 2008 o 17:45:12

    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

  4. szarak
    07 czerwca 2008 o 18:24:00

    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

  5. Husio
    07 czerwca 2008 o 18:41:06

    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

  6. trójkąt
    07 czerwca 2008 o 18:47:31

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

    Husia: a Twoja kamera działa pod V4L2?

  7. Husio
    07 czerwca 2008 o 18:59:10

    Jasne. Moja kamerka to isight wbudowany w macbooka.

  8. trójkąt
    07 czerwca 2008 o 19:17:31

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

  9. Moarc/J-23
    08 czerwca 2008 o 10:06:45

    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.

  10. Kys
    08 czerwca 2008 o 14:24:26

    Gratuluje pomysłu.
    Jestem pod wrażeniem.

  11. thm
    09 czerwca 2008 o 11:30:27

    Czemu tylko 4.5?

  12. trójkąt
    09 czerwca 2008 o 14:13:54

    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.

  13. xponok
    09 czerwca 2008 o 14:15:00

    brawo…

  14. pawkow
    09 czerwca 2008 o 23:39:09

    Pomysł rewelacja!

  15. skrobul
    12 czerwca 2008 o 10:46:53

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

    :)

  16. argus
    27 lipca 2008 o 10:57:35

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

  17. Moarc/J-23
    29 lipca 2008 o 15:31:02

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

Skomentuj (Textile)

Stronę napędza Jogger. Pewne prawa zastrzeżone.