Interfejs komputera wykorzystujący kamerę
Transkrypt
Interfejs komputera wykorzystujący kamerę
Rok akademicki 2012 / 2013 Politechnika Warszawska Wydział Elektroniki i Technik Informacyjnych Instytut Informatyki PRACA DYPLOMOWA INŻYNIERSKA Dominik Olędzki Interfejs komputera wykorzystujący kamerę Opiekun pracy prof. nzw. dr hab. Przemysław Rokita Ocena: ..................................................... ................................................................ Podpis Przewodniczącego Komisji Egzaminu Dyplomowego Specjalność: Inżynieria Systemów Informatycznych Data urodzenia: 1990.03.19 Data rozpoczęcia studiów: 2009.10.01 Życiorys Urodziłem się 19. marca 1990 roku w Łosicach gdzie ukończyłem szkołę podstawową i gimnazjum. W latach 2006 – 2009 uczęszczałem do I Liceum Ogólnokształcącego im. Bolesława Prusa w Siedlcach. W październiku 2009 roku rozpocząłem studia na Wydziale Elektroniki i Technik Informacyjnych Politechniki Warszawskiej na kierunku Informatyka. Od stycznia 2010 roku aktywnie działałem w ramach Koła Naukowego Twórców Gier „Polygon”. ....................................................... Podpis studenta EGZAMIN DYPLOMOWY Złożył egzamin dyplomowy w dniu .................................................................................. 2013 r z wynikiem .................................................................................................................................. Ogólny wynik studiów: ............................................................................................................... Dodatkowe wnioski i uwagi Komisji: ......................................................................................... ...................................................................................................................................................... ...................................................................................................................................................... STRESZCZENIE Celem pracy jest omówienie próby zaprojektowania i wykonania przez autora interfejsu komputera wykorzystującego kamerę, realizowanego w systemie przetwarzania obrazu stworzonym na potrzeby pracy dyplomowej. Praca zawiera opis dostępnych produktów i technologii, przygotowanego systemu oraz trzech zaproponowanych rozwiązań opartych o wykrywanie położenia i orientacji głowy i części twarzy, wraz z rezultatami i wnioskami. System bazuje na czujniku ruchu wyposażonym w kamerę RGB oraz sensor głębi. Słowa kluczowe: czujnik ruchu, interfejs komputera COMPUTER INTERFACE USING VIDEO CAMERA The purpose of this paper is to describe my attempt to design and develop human-computer interface based on camera, implemented in image processing system, created for the thesis. This paper contains a description of currently available products and technologies, created processing system and the three proposed solutions based on detection of position and orientation of human head and face features with results and conclusions. System uses a motion sensor equipped with RGB video camera and depth sensor. Keywords: motion sensor, computer interface Pragnę złożyć serdeczne podziękowania Panu prof. nzw. dr hab. Przemysławowi Rokicie za wskazówki i pomoc merytoryczną w przygotowaniu niniejszej pracy. Spis treści Spis treści 1 1. Wprowadzenie 3 2. Rozwiązania dostępne na rynku 4 Kontrolery gier 4 Systemy inwazyjne 5 Systemy nieinwazyjne 5 3. Technologia 6 Sprzęt 6 Oprogramowanie 8 4. System przetwarzania obrazu 10 Wymagania 10 Rozwiązanie 11 5. Metoda pierwsza 16 Położenie gałek ocznych 16 Orientacja gałek ocznych 18 Wzajemne relacje położenia kamery i monitora 18 Program do generowania danych uczących sieci 19 Program do wyznaczania punktu skupienia wzroku 23 Wnioski z metody pierwszej 24 6. Metoda druga 26 7. Metoda trzecia 34 1 8. Plany rozwoju 37 9. Podsumowanie 39 10. Bibliografia 40 Dodatek A. Zawartość płyty DVD. 41 2 1. Wprowadzenie Według raportu Gartnera, na świecie jest już ponad miliard komputerów (1). Spotykamy je na co dzień, w domu, w pracy i w szkole, ale warto zadać sobie pytanie, co jest powodem tak dużej popularności urządzeń, które jeszcze 20 lat temu uchodziły za narzędzia dla naukowców i specjalistów. Moim zdaniem jedną z głównych przyczyn tego stanu rzeczy, jest dążenie producentów sprzętu i oprogramowania do ułatwienia obsługi tych urządzeń. Dzisiaj aby móc korzystać z komputera nie musimy już znać na pamięć setek komend, powszechne są interfejsy graficzne, a powoli wkraczają do naszych domów nowoczesne urządzenia takie jak czujniki ruchu i kamery obserwujące wykonywane przez nas gesty. W mojej pracy starałem się zaprojektować interfejs komputera nie wymagający obsługi myszki ani klawiatury, bazujący na kamerze i czujniku ruchu. Celem mojej pracy było zbadanie dostępnych technologii oraz zaprojektowanie i implementacja interfejsu komputera wykorzystującego kamerę. Cel ten można zrealizować na wiele różnorodnych sposobów, ja chciałem oprzeć swoje rozwiązanie na technikach śledzenia spojrzenia użytkownika. Rozwiązanie takie umożliwiłoby korzystanie z komputera osobom o obniżonej sprawności ruchowej, a moim zdaniem byłoby również wygodnym sposobem obsługi komputera dla osób o pełnej sprawności. W pracy tej opisałem trzy metody, które opracowałem: pierwsza oparta o badanie położenia i orientacji gałek ocznych użytkownika, druga o badanie położenia i orientacji głowy użytkownika oraz trzecia oparta na śledzeniu dłoni. Ponadto, do testowania opracowanych metod stworzyłem uniwersalny i łatwy w użyciu system przetwarzania obrazu, który również opisałem w tej pracy. 3 2. Rozwiązania dostępne na rynku Produkty służące do obsługi komputera za pomocą gestów rozpoznawanych dzięki obrazowi z kamer i sensorów można zaklasyfikować do jednej z kategorii: kontrolery gier, inne systemy inwazyjne, inne systemy nieinwazyjne. Kontrolery gier Konsole gier wideo przeżywają swój renesans dzięki zastosowaniu nowoczesnych technologii bazujących na czujnikach ruchu i kamerach. Trzy najbardziej popularne produkty to Microsoft Kinect, Sony Playstation Move oraz Nintendo Wii. Produkt firmy Microsoft charakteryzuje się brakiem jakiegokolwiek kontrolera, sterowanie oparte jest o czujnik ruchu, podobny do tego użytego w mojej pracy. Użytkownik wybiera funkcje na ekranie wskazując je palcem, a ponadto może wykonywać różnego rodzaju gesty, od prostego „kliknięcia” po figury taneczne w grach. Playstation Move to zestaw z kamerą i kontrolerami trzymanymi w dłoni. Kontroler jest w kształcie pałeczki z podświetlaną kulką zmieniającą barwę w zależności od gracza i przebiegu rozgrywki. Kamera znajduje kulkę w polu widzenia i określa jej położenie w przestrzeni trójwymiarowej, a kontroler wyposażony w akcelerometr i żyroskop, pozwala na ocenę orientacji w przestrzeni i prędkości ruchu. Firma Nintendo stworzyła rozwiązanie podobne do Playstation Move, ale kontroler jest kształtem bardziej zbliżony do pilota, a zamiast kulki zastosowano sensor podczerwieni w kontrolerze, który rejestruje położenie specjalnej podstawki z diodami LED umieszczanej pod telewizorem. Ponadto kontroler wyposażono w akcelerometr, a żyroskop umieszczono w dodatkowej części dołączanej do kontrolera (Wii MotionPlus). 4 Systemy inwazyjne Systemy inwazyjne charakteryzują się obecnością urządzeń zwykle zakładanych na głowę użytkownika: okulary, kaski, kamery na wysięgniku, często nie pozwalające na swobodne ruchy ciała. Punkt, w którym skupia się wzrok użytkownika wyznaczany jest na podstawie z góry założonego położenia głowy i analizy obrazu gałki ocznej uzyskanego za pomocą bardzo blisko umieszczonej kamery. Jednym z najbardziej popularnych jest EC8™ System firmy Eye-Com Corporation Systemy nieinwazyjne Systemy nieinwazyjne nie wymagają zakładania żadnego dodatkowego sprzętu. Na przykład EyeTech TM4 firmy EyeTech Digital Systems składa się z kamery oraz źródła światła podczerwonego, które po odbiciu umożliwia wykrycie źrenicy oka. Rozwiązanie to daje dużą dokładność (do około 1°), ale nie pozwala na swobodę ruchów ciała. Ponadto, cena urządzenia zaczyna się od około 6500 dolarów. Ciekawe rozwiązanie zaproponowała firma Tobii Technology, która ma w swojej ofercie urządzenie o bardzo wysokiej dokładności, które do estymacji kierunku spojrzenia używa metody bazującej na odbiciu światła podczerwonego od rogówki (ang. Pupil-Center-Corneal Reflection) (2). Cena modułu śledzenia wzroku wynosi 6900 dolarów. 5 3. Technologia Sprzęt Do zrealizowania celu swojej pracy inżynierskiej potrzebowałem niestandardowej kamery, dosyć dużego monitora oraz wydajnego układu graficznego. W tym podrozdziale opisałem te elementy systemu. Czujnik ruchu Urządzenie, którego używałem to ASUS Xtion Pro Live. Nie jest to typowa kamera, powszechnie przyjęto określenie „czujnik ruchu”. Urządzenie to zawiera kilka sensorów: 1. kamera wideo RGB o rozdzielczości 1280 x 1024 piksele (około 10 kl/s, przy rozdzielczości 640 x 480 30 kl/s); 2. promiennik podczerwieni; 3. matryca CCD czuła na światło podczerwone o rozdzielczości 1600 x 1200 pikseli; 4. 2 mikrofony zlokalizowane na krańcach urządzenia. Pełna specyfikacja urządzenia dostępna jest na stronie producenta (3). Promiennik podczerwieni oraz matryca czuła na podczerwień pozwala na wyznaczenie odległości od czujnika dla każdego piksela obrazu w postaci mapy głębi, co z kolei, po odpowiednim przekształceniu, pozwala na wyznaczenie pozycji każdego piksela obrazu w przestrzeni trójwymiarowej. Metoda skanowania przestrzeni, którą zastosowano w tym urządzeniu nazywana jest „światłem strukturyzowanym” (ang. structured light), metoda ta dokładniej opisana jest w pozycji (4) bibliografii. Ze względu na sposób przetwarzania informacji z matrycy czułej na podczerwień, rozdzielczość wynikowa mapy głębi wynosi tylko 640 x 480 pikseli. 6 Monitor Ze względu na niską dokładność urządzenia pomiarowego (mała rozdzielczość wideo i mapy głębi), ważnym parametrem systemu jest rozmiar monitora. Szerokość kątowa monitora na siatkówce oka jest określona następującym wzorem: Gdzie w – szerokość monitora, L – odległość obserwatora od monitora. Im większy monitor, tym kąty wychylenia gałki będą większe, a tym samym, błąd względny mniejszy. Zależność przedstawiono na rysunku 1. W swojej pracy użyłem monitora o przekątnej 27 cali, uznając ten rozmiar za wystarczająco duży do dokładnych pomiarów, a jednocześnie dostępny w akceptowalnej cenie. 𝑤 𝛼 𝐿 RYSUNEK 1 Układ graficzny Operacje związane z przetwarzaniem obrazów są bardzo wymagające obliczeniowo, dlatego używa się do nich specjalnych kart graficznych. Firma NVIDIA Corporation stworzyła technologię CUDA (ang. Compute Unified Device Architecture) służącą do wykonywania własnych, niestandardowych programów przy użyciu kart graficznych. 7 Najbardziej wymagające kroki moich algorytmów wykorzystują tę technologię, dlatego wyposażyłem komputer w kartę graficzną firmy NVIDIA współpracującą z technologią CUDA. Oprogramowanie W swojej pracy oprogramowania użyłem kilku pośredniczącego, programistycznych do kamery produktów w ASUS tym: Xtion z kategorii zestaw narzędzi Pro Live, biblioteki przetwarzania obrazu OpenCV, platformy programistycznej Qt do budowy interfejsu graficznego. Oprogramowanie czujnika ruchu W skład oprogramowania firmy PrimeSense dostarczonego wraz z czujnikiem ruchu wchodzą: 1. Sterownik urządzenia dla systemów Windows i Linux. 2. Biblioteka OpenNI (Open Natural Interaction), dostarczająca uniwersalny interfejs programistyczny dla urządzeń naturalnego interfejsu użytkownika, takich jak ASUS Xtion i Microsoft Kinect. 3. Oprogramowanie NITE stanowiące warstwę pośrednią między urządzeniem, a biblioteką OpenNI. Jest to zestaw algorytmów do wykrywania gestów oraz analizowania sceny. Przetwarzanie obrazu Do implementacji opracowanych rozwiązań posłużyłem się biblioteką OpenCV autorstwa firm Intel oraz Willow Garage. Wybrałem tę bibliotekę ze względu na szeroki zakres zastosowania, wysoką wydajność implementowanych algorytmów, a przede wszystkim ze względu na silne wsparcie społeczności użytkowników na portalach internetowych. Ponadto, OpenCV zawiera wiele implementacji algorytmów korzystających z technologii CUDA oraz bardzo dobrze współpracuje z używaną przeze mnie platformą programistyczną Qt. 8 Interfejs użytkownika Do stworzenia interfejsu graficznego opisanych programów użyłem zestawu bibliotek Qt firmy Qt Development Frameworks. Biblioteki te umożliwiają łatwe i szybkie stworzenie aplikacji zdarzeniowych z interfejsem graficznym, a w tym ułatwiają implementację np. widoków trójwymiarowych z użyciem OpenGL, których używałem do testowania metody drugiej. Środowisko programistyczne i inne narzędzia Jako środowisko programistyczne używałem Microsoft Visual Studio 2010, w którym napisałem bibliotekę – system przetwarzania obrazu oraz pięć innych programów, opisałem wszystkie w dalszej części pracy. Biblioteka oraz pięć programów napisałem w języku C++, jeden w języku C#. Poza opisanymi wyżej bibliotekami, w trakcie pracy używałem jeszcze oprogramowania AForge.NET Framework 1 – do uczenia sieci neuronowej, Accord.NET Framework2 – używałem modułu Statistics do analizy głównych składowych, ARToolkit 3 – do wyznaczania relacji kamera-monitor na podstawie markerów. Poza tym, kod źródłowy projektu umieściłem na repozytorium Subversion w serwisie Google Code. Jako klienta SVN używałem oprogramowania TortoiseSVN dla systemu Windows. 1 2 3 http://www.aforgenet.com/ http://code.google.com/p/accord/ http://www.hitl.washington.edu/artoolkit/ 9 4. System przetwarzania obrazu Wymagania Do zrealizowania celu pracy inżynierskiej potrzebowałem uniwersalnego narzędzia, które pozwoliłoby na testowanie różnych podejść, metod przetwarzania i analizy obrazów oraz zapisywanie wyników. Oprogramowanie, którego szukałem musiało obsługiwać wiele strumieni danych wejściowych oraz pozwalać na wspólne przetwarzanie odpowiadających sobie klatek w każdym ze strumieni. Jednocześnie potrzebowałem oprogramowania, które obsługiwałoby używany przeze mnie czujnik ruchu. Niestety nie znalazłem odpowiedniego rozwiązania, co zmusiło mnie do stworzenia własnego, uniwersalnego systemu przetwarzania obrazu. Projektując system określiłem następujące wymagania funkcjonalne: 1. System musi obsługiwać czujnik ruchu ASUS Xtion Pro Live. 2. Musi pozwalać na współbieżne przetwarzanie obrazu z wielu źródeł, np. obrazu RGB i mapy głębi z czujnika. 3. Musi być łatwo rozszerzalny o nowe metody przetwarzania. 4. Powinien wspomagać wielokrotne używanie raz napisanego kodu. 5. Powinien izolować poszczególne metody przetwarzania tak aby ułatwić wymianę poszczególnych etapów i umożliwić szybkie lokalizowanie błędów. Ponadto, system powinien spełniać poniższe wymagania pozafunkcjonalne: 1. System powinien działać na komputerze PC wyposażonym w system operacyjny Microsoft Windows. 2. Powinien wykorzystywać możliwości procesorów wielordzeniowych i kart graficznych współpracujących z technologią CUDA. 10 3. Wydajność systemu powinna pozwalać na przetwarzanie co najmniej 10 klatek na sekundę dla metod opisanych w niniejszej pracy. Rozwiązanie System, który stworzyłem spełnia prawie wszystkie powyższe wymagania, aktualnie nie wykorzystuje wielu rdzeni do równoległego przetwarzania, ponieważ wydajność była satysfakcjonująca i nie było takiej potrzeby, a ponadto, utrudniłoby to implementację wielu używanych filtrów. Moje rozwiązanie jest biblioteką statyczną dołączaną do pozostałych projektów, która dostarcza łatwego i uniwersalnego interfejsu do implementacji niestandardowych metod przetwarzania. Umożliwia przetwarzanie danych z wielu źródeł, w tym nie tylko obrazu, ale również dźwięku czy innych dowolnych danych liczbowych, które można zapisać w postaci macierzy. Kroki przetwarzania mogą przyjmować dane z kilku strumieni oraz mogą generować kilka strumieni nowych danych, mogą być dowolnie łączone, przeplatane i zapętlane. System składa się z dwóch kluczowych elementów: grafu przetwarzania oraz zestawu filtrów. Graf przetwarzania Graf przetwarzania obrazu jest strukturą, która definiuje kolejność kroków przetwarzania oraz przepływ danych między nimi. Odpowiada odpowiedniej stworzeniu za wywołanie kolejności są wszystkich potrzebnych i na odpowiednich dodawane do listy filtrów danych. grafu, filtrów w Filtry po który przed uruchomieniem przetwarzania wyznacza kolejność w jakiej filtry powinny być wywoływane, aby spełnione zostały określone między nimi zależności przepływu danych. Graf przetwarzania decyduje również o wyborze jednej z dwóch metod przetwarzania zawartych w każdym filtrze: przetwarzanie danych poprawnych, przetwarzanie danych, w których co najmniej jedna składowa jest niepoprawna. 11 Poza samym procesem przetwarzania, graf filtrów odpowiada również za stworzenie interfejsu umożliwiającego wyświetlanie wyników oraz kontrolę parametrów w trakcie przetwarzania. W tym celu tworzy widżet ekranowy agregujący widżety udostępniane przez filtry. Architekturę typowej aplikacji wykorzystującej mój system przetwarzania przedstawia rysunek 2, graf przetwarzania jest zawarty w aplikacji. Graf przetwarzania Aplikacja Filtr Filtr RYSUNEK 2 Filtry Filtr można utożsamiać z funkcją: Gdzie: – liczba wejść filtra; – liczba wyjść filtra; - macierze wejściowe określonego o określonej liczbie wymiarów i w pełni lub częściowo określonych wymiarach – np. obraz RGB o rozdzielczości 640 x 480 pikseli lub zestaw punktów w przestrzeni trójwymiarowej zapisanych w postaci wektorów poziomych tak, że każdy wiersz macierzy określa inny punkt; - macierze wejściowe określone na tych samych zasadach co macierze wejściowe; 12 - dodatkowe wartości logiczne określające czy dane wejściowe w macierzy są poprawne; - dodatkowe wartości logiczne określające czy dane wyjściowe w macierzy są poprawne; – funkcja przetwarzania danych, dzięki dodatkowym flagom poprawności danych może w wyjątkowy sposób obsługiwać sytuacje błędne lub częściowy brak danych. Filtry można podzielić na trzy kategorie: 1. filtry wejściowe, 2. filtry wyjściowe, 3. filtry przetwarzające. Filtry wejściowe to takie, które dostarczają danych z określonego źródła. Charakteryzują się brakiem wejść i (zwykle) jednym wyjściem, w moim systemie do tej grupy należą filtry takie jak: RGBInput – pobiera obraz RGB z czujnika ruchu ASUS Xtion Pro Live; DepthInput – pobiera mapę głębokości z czujnika ruchu; IRInput – pobiera obraz z matrycy czułej na podczerwień z czujnika ruchu; ConstInput – generuje stałą, wcześniej ustaloną macierz; FileInput – odczytuje dane z pliku; StreamInput – generuje ciąg wcześniej ustalonych macierzy; ParameterInput – generuje wartości parametryzowane za pomocą suwaków na widżecie wyświetlanym w oknie grafu przetwarzania. Filtry wyjściowe to takie, które wyświetlają lub zapisują wyniki przetwarzania, zwykle mają jedno wejście i nie mają żadnych wyjść. Do tej grupy należą takie filtry: ImageOutput – wyświetla obraz we własnym widżecie; FileOutput – zapisuje obrazy do kolejnych plików w formacie ddd.png, gdzie ddd zastępuje kolejnymi liczbami; 13 ConsoleOutput – wyświetla wartość w konsoli, przydatne w przypadku małych macierzy zawierających np. współrzędne jednego punktu lub macierz transformacji, używane do testowania; CSVOutput – zapisuje kolejne macierze wyjściowe w postaci rozciągniętej do jednego wiersza do pliku w formacie CSV, obsługuje wiele strumieni wejściowych, ale trzeba pamiętać ich kolejność i wymiary; OpenGLOutput – wyświetla trzy rodzaje danych: punkty w przestrzeni trójwymiarowej, wektory w przestrzeni trójwymiarowej oraz macierze transformacji, tło widoku stanowi siatkę na płaszczyźnie XZ przestrzeni trójwymiarowej, punkty rysowane są jako koła określonym kolorze i średnicy, wektory jako strzałki, a macierze transformacji jako trzy wektory jednostkowe równoległe do osi układu współrzędnych, przekształcone za pomocą macierzy transformacji, w każdym z widoków widoczne są trzy półprzezroczyste wektory OX, OY i OZ przydatne jako punkt odniesienia; PointOnScreenOutput – wyświetla koło o określonym kolorze i promieniu na widoku pełnoekranowym w punkcie w przestrzeni dwuwymiarowej, przekazanym za pomocą wejścia. Do filtrów przetwarzających należą takie, które przetwarzają dane wejściowe, a wyniki tego przetwarzania udostępniają za pośrednictwem swoich wyjść. W trakcie pisania pracy zaimplementowałem wiele filtrów tego rodzaju, nie ma potrzeby wypisywania ich, a wiele z nich opakowuje funkcje OpenCV. Dane z wejść i wyjść filtrów przekazywane są w postaci macierzy, obiektu klasy Mat biblioteki OpenCV. Dzięki temu rozwiązaniu filtry mogą przekazywać między sobą niemal dowolne dane numeryczne, macierze mają dowolną liczbę wymiarów, dowolne rozmiary oraz dowolny typ danych. Poza standardowymi połączeniami wyjść i wejść 14 filtrów, w systemie występują również asocjacje między filtrami, które są wymagane przez niektóre zastosowania np. do wywoływania metod udostępnianych przez API czujnika ruchu. W swoich zastosowaniach starałem się konsekwentnie używać kilku typów danych: obrazy 3kanałowe RGB, obrazy 1-kanałowe – w skali szarości (liczby całkowite) i mapa głębi (liczby zmiennoprzecinkowe), punkty i wektory w przestrzeni dwu- i trójwymiarowej, macierze transformacji. Ponieważ system udostępnia wspólny dla wszystkich filtrów interfejs, do opisywania projektowanych grafów przetwarzania zaproponowałem jednolitą notację w postaci przedstawia diagramu. Przykładowy rysunek Filtr wejściowy 3. Filtr wejściowy Dane 2 Dane 1 Asocjacja diagram Filtr przetwarzający Wynik przetwarzania Filtr wyjściowy RYSUNEK 3 15 5. Metoda pierwsza Pierwsza próba budowy interfejsu komputera zakładała obsługę bez użycia myszy. Głównym założeniem było wykrycie punktu na ekranie monitora, na którym użytkownika skupia wzrok i przesunięcie tam kursora. Do osiągnięcia tego celu potrzebne były następujące dane: 1. położenie gałek ocznych względem czujnika; 2. kąty obrotu gałek ocznych w osi pionowej i osi poziomej prostopadłej do kierunku spojrzenia; 3. położenie kamery względem monitora; 4. wymiary i rozdzielczość monitora. W dalszej części rozdziału przedstawiłem diagram programów zbudowanych na bazie opisanego wcześniej systemu przetwarzania, realizujących metodę pierwszą. Położenie gałek ocznych Czujnik ruchu udostępnia mapę głębi widzianej sceny, dzięki tym danym oraz obrazowi z matrycy RGB możemy określić położenie punktów sceny w przestrzeni trójwymiarowej w układzie związanym z czujnikiem ruchu. W tym celu najpierw musimy wyznaczyć położenie gałek ocznych na obrazie RGB w układzie dwuwymiarowym obrazu. Dokonywane jest to za pomocą klasyfikatora cech Haaro-podobnych, którego implementację dostarcza biblioteka OpenCV. Ponieważ wykrywanie oczu w każdej klatce znacząco obniżyłoby wydajność rozwiązania, wykrywanie następuje etapowo. Pierwszym krokiem jest znalezienie twarzy na obrazie przy użyciu klasyfikatora cech Haaropodobnych, jeśli nie znaleziono twarzy we wcześniejszej klatce wyszukiwanie przeprowadzane jest w obrębie całej klatki, w innym wypadku wyszukiwanie przeprowadzane jest w obszarze, w którym istnieje wysokie prawdopodobieństwo znalezienia twarzy, jest to obszar o szerokości i wysokości 25% większej niż prostokąt, w którym ostatnio 16 znaleziono twarz. Jeśli użytkownik nie wykona szczególnie szybkiego ruchu, skuteczność tego rozwiązania jest bardzo wysoka. Jeśli nie udało się znaleźć twarzy w obszarze wysokiego prawdopodobieństwa, wyszukiwanie następuje w obrębie całej klatki. Wstępne wyszukiwanie twarzy przyspiesza proces detekcji oczu, ponieważ oczy, jako mniejsze elementy obrazu, są trudniejsze do znalezienia i wymagają więcej czasu. Po znalezieniu twarzy, można przeprowadzić detekcję oczu tylko w ograniczonym obszarze obrazu. Po znalezieniu położenia oczu na obrazie RGB z czujnika ruchu, należy obliczyć ich położenie w przestrzeni trójwymiarowej względem czujnika. Przypomnę, że obraz dwuwymiarowy powstaje na matrycy kamery w sposób, który opisuje rzutowanie perspektywiczne, poniżej podałem formułę pozwalającą na obliczenie położenia rzutu perspektywicznego punktu na matrycę kamery w zależności od położenia punktu w przestrzeni, we współrzędnych jednorodnych. Wzory te nie uwzględniają transformacji współrzędnych z matrycy kamery do współrzędnych obrazu w postaci cyfrowej oraz zniekształcenia obiektywu kamery. [ ] [ ] [ ] – punkt w przestrzeni trójwymiarowej, – macierz projekcji, - rzut punktu P na matrycę kamery, – ogniskowa kamery. Jak widać, podczas rzutowania perspektywicznego zatracana jest informacja o odległości punktu P od kamery. Wartość tę można odczytać z mapy głębi, którą tworzy czujnik ruchu. W efekcie współrzędne pierwotnego punktu P możemy policzyć za pomocą wzoru: 17 W ten sposób z obrazu RGB i mapy głębi uzyskaliśmy współrzędne położenia gałek ocznych w przestrzeni trójwymiarowej o początku układu współrzędnych związanym z kamerą. Orientacja gałek ocznych Samo położenie gałek ocznych nie wystarczy do wyznaczenia kierunku spojrzenia, do tego celu potrzebujemy jeszcze dwóch kątów obrotu gałek ocznych. Początkowo założyłem, że kąty te można wyznaczyć za pomocą odpowiednio nauczonej sieci neuronowej. Warstwa wejściowa sieci posiadała 400 neuronów (20x20 pikseli), warstwa wyjściowa 2 wartości w przedziale 〈 〉, a warstwa ukryta 50 neuronów. Próba wynosiła 3000 obrazów dla 100 różnych punktów na ekranie, 90% próby przeznaczyłem na zbiór uczący, a 10% na zbiór testowy. Neurony w sieci aktywowane były bipolarną funkcją sigmoidalną i uczone za pomocą algorytmu wstecznej propagacji błędu (5) przez 10000 epok lub do momentu uzyskania średniego błędu kwadratowego mniejszego niż 0,2 (wszystkie dane znormalizowano do przedziału 〈 〉 ). Niestety tak zaprojektowana sieć neuronowa nie wykazała zadowalającej zdolności uczenia się. W trakcie uczenia średni błąd kwadratowy zmalał od wartości początkowej 0,92 do wartości 0,02 (dla 10000 epok) oraz wartości 0,19 (dla drugiego warunku), ale w żadnym z opisanych wypadków sieć nie uzyskała pożądanej własności uogólniania wzorca, przez co praktyczne zastosowanie rozwiązania nie daje satysfakcjonujących rezultatów. Wzajemne relacje położenia kamery i monitora Aby rzutować wektor spojrzenia na płaszczyznę monitora, musimy znać jego położenie i orientację w zależności od kamery, ponieważ do tej pory wszystkie operacje wykonywaliśmy w układzie współrzędnych związanym z kamerą. W tym celu należy dokonać niezbędnych pomiarów i skonstruować macierz transformacji, którą mnoży się z 18 każdym punktem obliczonym we współrzędnych kamery. Ciekawym rozwiązaniem, które można wprowadzić do tego kroku w przyszłości wydaje się być biblioteka ARToolkit udostępniająca narzędzia dla twórców aplikacji związanych z ideą rozszerzonej rzeczywistości. Kamerę i monitor należałoby oznaczyć odpowiednimi markerami, a następnie wykonać kilka zdjęć pod różnymi kątami obejmujących oba urządzenia i dokonać wyznaczenia macierzy transformacji między nimi przy użyciu biblioteki ARToolkit. Niestety pierwsze próby tego typu podejścia nie dawały oczekiwanych rezultatów, więc pozostawiam ten temat jako potencjalny punkt rozwoju pracy w przyszłości. Program do generowania danych uczących sieci Sposób w jaki chciałem uzyskać kąty odchylenia gałek ocznych, opisany w podrozdziale „Orientacja gałek ocznych” wymaga zebrania zestawu uczącego i testowego. Do tego celu przygotowałem pierwszy program. Tak jak pisałem w rozdziale 4., wszystkie programy bazujące na moim systemie przetwarzania obrazu można przedstawić w formie diagramu filtrów. Rysunek 4. przedstawia diagram dla pierwszego programu. Diagram uwzględnia tylko jedno oko, aby zachować czytelność, ponieważ obraz drugiego oka jest przetwarzany analogicznie i nie ma potrzeby dublowania diagramu. W tabeli 1. przedstawiłem opis filtrów występujących na diagramie. Program po uruchomieniu generuje zestaw losowych punktów, których współrzędne mieszczą się w zakresie rozdzielczości monitora, a następnie zaczyna wyświetlać je na pełnoekranowym widżecie. Użytkownik powinien zachowywać się naturalnie i śledzić oczami pojawiający się punkt. W tym czasie czujnik ruchu rejestruje obraz RGB i mapę głębi, a program oblicza o jaki kąt użytkownik powinien odchylić każde z oczu, aby punkt skupienia wzroku trafiał w cel na ekranie. Wszystkie dane liczbowe zapisywane są do arkusza CSV (jeden wiersz na klatkę), a wszystkie obrazy oczu są wycinane i zapisywane do plików PNG o nazwie zawierającej numer klatki. Tak zebrane dane można poddać analizie. 19 TABELA 1 Nazwa filtra Opis działania RGBInput Pobiera obraz z kamery RGB zamontowanej w czujniku ruchu. DepthInput Pobiera mapę głębi z czujnika ruchu. FaceDetection Wykrywa twarz, oczy, nos i usta na obrazie. Crop Kadruje podany obraz do podanego prostokąta. CenterOfRect Filtr bazujący na klasie CustomFilter, oblicza środek prostokąta. Position3D Na podstawie współrzędnych na obrazie 2D i mapie głębi oblicza położenie punktu w przestrzeni trójwymiarowej. Transform3D Wykonuje przekształcenie podanych na wejście punktów za pomocą wcześniej ustalonej macierzy transformacji. W tym programie użyte w celu zmiany układu współrzędnych ze związanego z kamerą na związany z monitorem. StreamData Przekazuje wcześniej wygenerowane dane. W tym programie są to losowe punkty na ekranie, które wzrokiem śledzi użytkownik. FindAngles Znajduje pożądane kąty odchylenia gałki ocznej tak, aby rzut wektora od gałki ocznej odchylony o te kąty trafiał w punkt przekazany na drugie wejście filtra. CSVOutput Zapisuje dane do pliku w formacie CSV. SaveToFile Zapisuje obrazy do plików w formacie PNG. PointOnScreen Wyświetla punkt na ekranie o środku podanym na wejście. Podczas zbierania danych użytkownik powinien śledzić wzrokiem ten punkt. 20 RGBInput DepthInput obraz RGB mapa głębi FaceDetection prostokąt oka Crop CenterOfRect Position3D SaveToFile Transform3D punkt na ekranie StreamData FindAngles PointOnScreen CSVOutput RYSUNEK 4 21 Opisany program został zawarty na dołączonej płycie DVD, w katalogu o nazwie Metoda 1. Instrukcja kompilacji również znalazła się na płycie, w katalogu Media. Po uruchomieniu programu użytkownik zobaczy poniższy ekran. RYSUNEK 5 Czarny punkt wskazuje miejsce, w którym należy skupić wzrok. Punkt zmienia położenie co sekundę, a użytkownik powinien go śledzić wzorkiem. Po każdej klatce w katalogu Output/eyes/ zapisywane są obrazy oczu w rozmiarach w jakich zostały wykryte, a w katalogu Output/eyes50/ obrazy o rozmiarze 50 x 50 pikseli o środku w tym samym punkcie co oryginalne. Ponadto zapisywany jest arkusz kalkulacyjny w pliku Output/output.csv, w którym pierwsze dwie kolumny odnoszą się do lewego oka, a drugie dwie do prawego oka. Pierwsza kolumna dla oka oznacza oczekiwany kąt odchylenia gałki ocznej w poziomie, a druga w pionie, obie wartości podane są w radianach. Ostatnie dwie kolumny arkusza to położenie punktu na wyświetlaczu, ponieważ punkty generowane są losowo. Tak pozyskane dane można wykorzystać do uczenia sieci neuronowej za pomocą programu NetsTest, który znajduje się na płycie w katalogu Uczenie sieci. Proces można obejrzeć na nagraniach: 22 oraz metoda_1_zbieranie_probek.mp4 metoda_1_zbieranie_probek_ekran.wmv. Program do wyznaczania punktu skupienia wzroku Program do wyliczania punktu, na który spogląda użytkownik jest bardzo podobny do programu do zbierania danych uczących. Dane poddawane są analogicznym przekształceniom, a główna różnica wynika z faktu konieczności wyliczenia innej niewiadomej – wcześniej wyliczaliśmy kąty na podstawie danego punktu docelowego, teraz kąty musimy estymować za pomocą sieci neuronowej, a wyliczać punkt docelowy. Jeśli punkt wyliczony dla prawego oka jest inny niż ten wyliczony dla lewego (prawie zawsze tak jest), punkty są uśredniane. Rysunek 6. przedstawia diagram działania programu. W programie pojawiły się nowe filtry, opisałem je w tabeli 2. TABELA 2 Nazwa filtra Opis działania NeuroNetwork Implementacja tego filtra nie powstała, ponieważ tymczasowo zrezygnowałem z rozwijania tej metody ze względu na niezadowalające wyniki uczenia sieci neuronowej. Koncepcyjnie, filtr ten powinien obliczać wartości kątów odchylenia gałki ocznej na podstawie wyciętego obrazka. Wagi neuronów w sieci byłyby ładowane na początku działania programu. Projection Ten filtr wykonuje rzutowanie punktu podanego na wejście wzdłuż wektora o odchyleniu podanym za pomocą dwóch kątów (drugie wejście) względem osi OZ, na płaszczyznę monitora, czyli płaszczyznę XY. 23 RGBInput DepthInput mapa głębi obraz FaceDetection prostokąt oka CenterOfRect Crop Position3D NeuroNetwork Transform3D kąty odchylenia Projection punkt 2D PointOnScreen RYSUNEK 6 Wnioski z metody pierwszej 24 Najsłabszym punktem metody pierwszej okazała się sieć neuronowa. Prawdopodobnie zbiór uczący sieci neuronowej był zbyt mało różnorodny, ponieważ dla każdego punktu na ekranie generowano aż 30 obrazów, co z 3000 próbek dawało 100 rzeczywiście różnorodnych punktów. Sieć uzyskała pewną zdolność rozpoznawania wartości odchylenia kąta dla punktów we zbioru uczącego, ale nie zyskała cechy uogólniania wzorca przez co wyniki na innym zbiorze testowym nie były satysfakcjonujące. Myślę, że dalsza praca nad tą metodą musiałaby uwzględnić przebudowanie i przetestowanie innych rodzajów sieci neuronowej oraz próbę selekcji informacji z obrazów w celu zmniejszenia liczby wymiarów wektora wejściowego. 25 6. Metoda druga Po nieudanej próbie wyznaczenia punktu, w którym skupia się wzrok użytkownika, uprościłem założenia projektu. Druga metoda zakłada, że użytkownik steruje kursorem za pomocą ruchów całą głową. Program miał wyznaczać rzut czubka nosa wzdłuż wektora skierowanego zgodnie z orientacją głowy, na płaszczyznę monitora, czyli sterowanie kursorem miało odbywać się poprzez wskazywanie położenia nosem. Po uruchomieniu programy zakładamy, że głowa użytkownika znajduje się mniej więcej naprzeciwko środka monitora i jest skierowana w jego kierunku, w tym stanie wektor, po którym będziemy rzutować ma współrzędne w układzie związanym z monitorem, gdzie oś Z wskazuje głębokość i rośnie wraz z oddalaniem od monitora. Ta metoda bazuje na obliczaniu transformacji, której poddane zostały punkty charakterystyczne wykryte w obszarze głowy w okresie czasu między poszczególnymi klatkami obrazu. Algorytm składa się z pięciu ogólnych kroków, które opisałem w kolejnych podrozdziałach. 1. Wykrycie punktów charakterystycznych w obszarze twarzy. 2. Połączenie punktów w pary, z punktami odpowiadającymi z poprzedniej klatki. 3. Znalezienie przekształcenia między punktami z kolejnych klatek. 4. Nałożenie przekształcenia na wektor wzdłuż którego rzutujemy. 5. Rzutowanie czubka nosa wzdłuż wektora na monitor. Wykrycie punktów charakterystycznych Tak jak w poprzednim przypadku, w celu skrócenia czasu przetwarzania klatki, pierwszą operacją przeprowadzaną na obrazie jest wykrycie twarzy. Tutaj również posłużyłem się znaną metodą klasyfikatora cech Haaro-podobnych. Metoda ta działa bardzo szybko, ponieważ nie zależy nam na znalezieniu dokładnego położenia i 26 rozmiaru twarzy, a tylko przybliżony obszar zainteresowania, co można uzyskać dostosowując parametry wyszukiwania, a ponadto biblioteka OpenCV dostarcza implementację klasyfikatora dla kart graficznych wspierających technologię CUDA. Po znalezieniu twarzy na obrazie, na podstawie prostokąta tworzona jest maska bitowa, która później podawana jest jako parametr do operacji znajdowania punktów charakterystycznych. Aktualnie jednym z najlepszych algorytmów znajdowania cech charakterystycznych w obrazie jest SURF (ang. Speeded Up Robust Features) (6). Algorytm ten po raz pierwszy został zaprezentowany w 2006 roku przez Herberta Baya z Eidgenössische Technische Hochschule Zürich. Opiera się on o sumy dwuwymiarowych falek Haara, co pozwala na wydajne użycie sumacyjnych postaci obrazu (ang. integral image, summed area table) (7). Ja użyłem implementacji z biblioteki OpenCV w postaci klasy SurfFeatureDetector. Ze względu na system przetwarzania, który przesyła między filtrami macierze, cechy wykrytych punktów takie jak o położenie, rozmiar czy orientacja muszą być zapisane do postaci wektora liczb zmiennoprzecinkowych. Po zapisaniu wszystkich punktów w postaci macierzy, są one przekazywane do bufora zapamiętującego dane na jedną klatkę oraz do filtra znajdującego przekształcenie między punktami z poszczególnych klatek. Połączenie punktów Odpowiadające sobie punkty charakterystyczne obrazu z aktualnej i poprzedniej klatki muszą zostać połączone w pary. W tym celu wykorzystuję metodę najbliższych sąsiadów, która została zaimplementowana w OpenCV przy użyciu biblioteki FLANN (ang. Fast Library for Nearest Neighbors). Wyznaczanie przekształcenia (8) Wyznaczenie przekształcenia między dwoma zestawami punktów w przestrzeni trójwymiarowej należy do skomplikowanych problemów 27 optymalizacyjnych, szczególnie w przypadku gdy błędy pomiaru są znaczne lub zbiór danych zawiera punkty fałszywe. Pierwszym etapem wyznaczania przekształcenia między dwoma zbiorami danych A i B zawierającymi po N odpowiadających sobie punktów P jest obliczenie centroidów: [ ] ∑ ∑ Obliczanie centroidów ma na celu wyłuskanie z danych samego przesunięcia, pozostawiając rotację bez zmian. Przesuwamy punkty z obu zbiorów tak, aby centroidy znalazły się w środku układu współrzędnych po czym możemy przystąpić do wyznaczania macierzy rotacji. Jest wiele sposobów na znalezienie optymalnej macierzy rotacji tak, aby odległości odpowiadających sobie punktów były jak najmniejsze. Jednym z nich jest skorzystanie z metody rozkładu macierzy według wartości osobliwych (SVD, ang. Singular Value Decomposition). Metoda ta jest szeroko dostępna w różnych bibliotekach programistycznych, również w OpenCV, którego używamy. Każdą macierz rzeczywistą można przedstawić w postaci rozkładu według wartości osobliwych. Twierdzenie: Dla każdej macierzy ortogonalne i ( gdzie macierz rzędu i o wymiarach istnieją takie macierze oraz taka macierz pseudodiagonalna , że: ma postać: [ ] oznacza macierz diagonalną r-tego stopnia, gdzie: oraz: 28 Przy czym liczby to niezerowe wartości osobliwe macierzy . W celu znalezienia macierzy rotacji tworzymy akumulator, macierz rozmiaru , sumując iloczyny wycentrowanych, odpowiadających sobie punktów ze zbiorów obliczamy macierz obrotu i . Następnie dokonujemy rozkładu i według wzorów: ∑ [ Musimy jeszcze wyznacznik macierzy ] obsłużyć jedną wyjątkową sytuację. Gdy jest mniejszy od 0, należy zmienić znak liczb w trzeciej kolumnie macierzy. Aby znaleźć wynikową macierz transformacji należy złożyć wszystkie przekształcenia. [ ] [ ] [ ] Nałożenie przekształcenia i rzutowanie punktu Do przekształcania wektora orientacji głowy użyjemy filtra Multiply, który na swoje wejścia przyjmuje dwie macierze, a na wyjściu daje wynik mnożenia tych macierzy. Należy jeszcze wziąć pod uwagę różnice w położeniu kamery względem monitora, co uzyskamy za pomocą filtra Transform3D z odpowiednio ustawioną macierzą 29 transformacji. Transformacji tej należy poddać punkt czubka nosa jak i wyznaczony wektor orientacji głowy. Diagram programu Poniżej, na rysunku 7. przedstawiłem diagram programu dla systemu przetwarzania obrazu. Nowym elementem na tym diagramie jest filtr cykliczny zrealizowany za pomocą dwóch filtrów: BufferInput i BufferOutput. Takie rozwiązanie wymuszone jest przez założenie projektowe grafu przetwarzania, że dla jednej klatki każdy filtr może zostać wywołany tylko raz. TABELA 3 Nazwa filtra Opis działania FindFeatures Ten filtr znajduje punkty charakterystyczne na obrazie za pomocą algorytmu SURF. Na wyjścia wystawia macierz punktów odpowiadających 2D im oraz macierz punktów charakterystycznych. Buffer Przechowuje dane przez jedną klatkę po czym wystawia je na wyjście. BufferOutput Te dwa filtry współpracują ze sobą, aby możliwe BufferInput było stworzenie zależności cyklicznych. Na swoje wyjścia BufferOutput wystawia macierze, które podano na wejścia BufferInput. Multiply Na wyjściu wynik mnożenia dwóch macierzy z wejść. VectorProjection Rzutowanie punktu wzdłuż wektora na płaszczyznę monitora XY. 30 RGBInput obraz FaceDetection prostokąt nosa CenterOfRect prostokąt twarzy FindFeatures punkty charakterystyczne DepthInput punkty 2D Position3D Buffer FindTransform BufferOutput macierz transformacji Multiply BufferInput Position3D VectorProjection Transform3D PointOnScreen RYSUNEK 7 31 Opisany program znajduje się na dołączonej płycie w katalogu Metoda 2. Konfiguracja i uruchomienie przebiega analogicznie do pierwszego programu opisanego w poprzednim rozdziale. Po uruchomieniu użytkownik zobaczy ekran podobny do tego poniżej. RYSUNEK 8 Po prawej stronie okna znajduje się widok z kamery z nałożoną ramką wykrytej twarzy. Po lewej zaś, widok trójwymiarowy z półprzezroczystym oraz nieprzezroczystym oznaczeniem osi. Jest to widok, który wizualnie reprezentuje obliczoną macierz transformacji. Osie półprzezroczyste to oryginalne osie układu X, Y i Z, natomiast osie nieprzezroczyste reprezentują początek układu po przekształceniu za pomocą obliczonej transformacji. Jak widać z działania programu, transformacja ta zachowuje się dosyć chaotycznie, a przy próbie szybszego ruchu całkowicie znika z ekranu. Jeśli osie nie są widoczne, należy użyć klawiszy W, S, A oraz D do przemieszczania kamery oraz klawiszy strzałek do obracania kamery. Wnioski z metody drugiej Metoda druga nie zawiera algorytmów heurystycznych ani uczenia maszynowego, które mogłoby spowodować niedeterministyczne działanie rozwiązania. W tym przypadku największym problemem są duże błędy pomiaru i potencjalnie błędne parowanie punktów charakterystycznych z kolejnych klatek obrazu, które powodują chaotyczne przemieszczanie się wyznaczonego punktu na ekranie. 32 Kolejnym źródłem błędów są punkty charakterystyczne, które zmieściły się w obszarze oznaczonym jako twarz, ale znajdują się np. na tle. Rozwiązaniem tego typu problemów mogą być statystyczne metody klasyfikacji punktów jako obserwacje odstające, np. RANSAC (ang. RANdom SAmple Consensus). Ponadto, trudno jest poprawnie obsłużyć sytuację, w której twarz użytkownika wychodzi poza obszar widoczności kamery, a następnie znowu się pojawia. Resetowanie wektora orientacji głowy w tej sytuacji może spowodować rozkalibrowanie i stale wskazywać przesunięty punkt na ekranie. Najlepszym sposobem obsługi takiego zdarzenia wydaje się być ponowne kalibrowanie. 33 7. Metoda trzecia Trzeci projekt interfejsu komputera, który przygotowałem wyróżnia się z dwóch pozostałych, ponieważ do obsługi komputera wykorzystuje dłonie, a poza tym, jest próbą wykorzystania pakietu narzędzi programistycznych dostarczonych przez producenta razem z czujnikiem ruchu. Opis Co prawda, narzędzia dla programistów dostarczone z kamerą mają bardzo wygodny interfejs programistyczny, ale w celu zachowania spójności pracy, ten projekt również zrobiłem na bazie własnego systemu przetwarzania obrazu. Wymagało to napisania nowego filtra, który opakowuje funkcje bibliotek producenta. Filtr HandDetector posiada jedno wyjście i jest to macierz punktów w przestrzeni trójwymiarowej określających pozycję dłoni na scenie. Kolejność punktów jest zachowywana między klatkami. Implementacja filtru HandDetector polega na zdefiniowaniu i zarejestrowaniu funkcji obsługi odpowiednich zdarzeń w API kamery. Śledzenie dłoni rozpoczyna się po wykryciu gestu machania, ukrycie dłoni na chwilę spowoduje przerwanie śledzenia. I tak, filtr implementuje procedury obsługi następujących zdarzeń: 1. Wykrycie gestu machania – powoduje rozpoczęcie śledzenia. 2. Wykrycie nowej dłoni – powoduje dodanie deskryptora do tablicy dłoni. 3. Aktualizacja położenia dłoni – powoduje zaktualizowanie deskryptora w tablicy. 4. Zniknięcie dłoni – powoduje usunięcie deskryptora z tablicy. Oczywiście, funkcja Process filtra bada stan tablicy deskryptorów i ustala na wyjściu położenie śledzonych dłoni w przestrzeni trójwymiarowej. Na podstawie tego filtra zrobiłem program demonstracyjny pozwalający na odbijanie piłki rękami, znajduje się na płycie z 34 materiałami. Najpierw należy pomachać do urządzenia, aby program zaczął śledzić dłoń (za pierwszym razem może się nie udać). Gdy dłoń zostanie wykryta, z góry spada piłka, którą można odbijać. Oczywiście, jeśli w tym czasie pomachamy drugą dłonią, ona również zostanie wykryta. Diagram tego projektu jest bardzo prosty i nie ma potrzeby przedstawiania go tutaj. Natomiast jako ciekawostkę, pozwolę sobie wspomnieć, że prosta gra została zaimplementowana w postaci filtra przetwarzania obrazu. Filtr Game przyjmuje na wejściu obraz RGB, którego używa jako tło oraz macierz z punktami na obrazie, w których znajdują się wykryte dłonie. Sam filtr Game nie tworzy żadnego widżetu, do wyświetlania używa innego, standardowego filtra – ImageOutput. Poniżej przedstawiam zrzut ekranu z aplikacji demonstrującej metodę trzecią. Program ten znajduje się na płycie, w katalogu Metoda 3. Sposób uruchomienia jest analogiczny do dwóch poprzednich programów. W katalogu Media znajduje się nagranie wideo prezentujące działanie programu. RYSUNEK 9 35 Wnioski z metody trzeciej W tym wypadku nie było problemów z dokładnością działania, do tego zastosowania oferowana dokładność jest wystarczająca, choć czasami widoczne są „przeskoki” punktów, w których wykryto dłonie. Do tej metody zastosowałem zestaw narzędzi dostarczonych przez producenta kamery, nie ma zastrzeżeń co do ich działania, ale nie dostarczają one wystarczającej dokładności pomiarów do zrealizowania dwóch poprzednich metod, którymi się zajmowałem. 36 8. Plany rozwoju W przyszłości chciałbym rozwinąć system przetwarzania do postaci narzędzia dostępnego dla osób nie potrafiących programować, ponieważ w tym momencie system jest biblioteką statyczną, a nie znalazłem narzędzia, które pozwoliłoby mi na przetestowanie kilku metod bez potrzeby pisania kodu. W tym celu chciałbym stworzyć graficzny edytor diagramów przepływu danych i możliwość zapisywania ich do plików. Ponadto, system wymaga stworzenia wielu filtrów, które pomimo tego, że są podstawowe i często używane, nie zostały zaimplementowane, ponieważ nie były potrzebne do moich projektów. Kluczowym zagadnieniem jest zapewnienie kompatybilności z innymi kamerami dostępnymi na rynku, a przede wszystkim ze standardowym interfejsem obsługi kamery internetowej. Bardzo pożądana jest również opcja nagrywania i odtwarzania plików audio-video na przykład do testowania rozwiązań. Najsłabszym ogniwem pierwszego rozwiązania jest sieć neuronowa, dlatego w przyszłości chciałbym ją lepiej zaprojektować oraz zdobyć więcej próbek, co pozwoliłoby na nauczenie sieci wyznaczania kierunku wzroku użytkownika. Co do drugiego rozwiązania, problem stanowią fałszywe punkty charakterystyczne przekształceń. algorytmów oraz Dlatego zbyt też statystycznych mała chciałbym służący do dokładność wyznaczania zaimplementować jeden z eliminowania obserwacji odstających od modelu, np. RANSAC. Myślę, że ten krok znacząco poprawi dokładność obliczeń. Problemem, który dotyka obu powyższych rozwiązań jest trudność w ręcznym określeniu dokładnych relacji przestrzennych kameramonitor. Chciałbym opracować możliwie łatwą i dokładną metodę na wyznaczanie tych relacji (macierzy transformacji z jednego układu współrzędnych do drugiego). Możliwe, że udałoby się to osiągnąć dzięki samemu czujnikowi głębi, który mógłby w jakiś sposób identyfikować 37 monitor, a następnie analizować zmiany zachodzące na scenie podczas przenoszenia urządzenia w inne miejsce. 38 9. Podsumowanie Nie udało mi się zrealizować pierwotnie postawionego celu, ale opracowałem trzy metody, których dokładność nie jest zadowalająca, ale po poznaniu ich mocnych i słabych stron stwierdzam, że są one dobrą bazą do rozwoju i dalszych badań w tym temacie, na przykład w ramach pracowni dyplomowej magisterskiej. Ponadto zapoznałem się z możliwościami urządzenia, którym dysponowałem podczas tworzenia pracy oraz z oprogramowaniem dostarczonym z czujnikiem ruchu i na tej podstawie przygotowałem program demonstracyjny korzystający z tego oprogramowania, będący implementacją pewnego interfejsu komputera dla prostej gry zręcznościowej bazującą na wykrywaniu dłoni. Bardzo pomocnym i wygodnym narzędziem okazał się stworzony przeze mnie w ramach tej pracy system przetwarzania obrazu, który również warto rozwijać podczas dalszych badań tematu. 39 10. Bibliografia 1. Gartner, Inc. Gartner, Inc. Gartner. [Online] 23 6 2008. http://www.gartner.com/newsroom/id/703807. 2. Tobii Technology. An introduction to eye tracking and Tobii Eye Trackers. 27 1 2010. 3. ASUSTeK Computer Inc. ASUS Xtion Pro Live. [Online] http://pl.asus.com/Multimedia/Motion_Sensor/Xtion_PRO_LIVE/#sp ecifications. 4. Szeliski Richard. Computer Vision: Algorithms and Applications. brak miejsca : Springer, 2010. 5. Tadeusiewicz Ryszard. Sieci neuronowe. Warszawa : Akademicka Oficyna Wydaw. RM, 1993. 6. Khvedchenia Ievgen. Comparison of the OpenCV's feature detection algorithms. Computer Vision Talks. [Online] 11 1 2011. http://computer-vision-talks.com/2011/01/comparison-of-theopencvs-feature-detection-algorithms-2/. 7. SURF: Speeded Up Robust Features. Bay Herbert, Tuytelaars Tinne i Van Gool Luc. Graz, Austria : Springer Berlin Heidelberg, 2006. 8. Ho Nghia. Finding optimal rotation and translation between corresponding 3D points. Nghia Ho. [Online] 09 2011. http://nghiaho.com/?page_id=671. 40 Dodatek A. Zawartość płyty DVD. Poniżej przedstawiam hierarchię katalogów i plików utworzoną na dołączonej płycie DVD. Media o konfiguracja_projektow.wmv – wideo prezentujące ustawienia projektu. o metoda_1_uczenie_sieci.jpg – zrzut ekranu z programu do uczenia sieci na podstawie próbek. o metoda_1_zbieranie_probek.mp4 – nagranie procesu tworzenia próbek do metody pierwszej. – o metoda_1_zbieranie_probek_ekran.wmv przechwycenie obrazu monitora z procesu tworzenia próbek do metody pierwszej. o metoda_2.wmv – prezentacja programu opartego na metodzie drugiej. o metoda_3.wmv – prezentacja programu opartego na metodzie trzeciej. Metoda 1 o Projekt MS Visual Studio 2010 z programem 1 Metoda 2 o Projekt MS Visual Studio 2010 z programem 2 Metoda 3 o Projekt MS Visual Studio 2010 z programem 3 Potrzebne biblioteki o Accord.NET Framework-2.7.1.exe przetwarzania obrazu, – obliczeń biblioteka do statystycznych, uczenia maszynowego, wykorzystana w programie NetsTest do uczenia sieci neuronowej. o cudatoolkit_4.2.9_win_32.msi NVidia do tworzenia – narzędzia programów firmy używających technologii CUDA, instalacja opcjonalna. 41 o OpenCV-2.4.3.exe – biblioteka do przetwarzania obrazu, baza dla mojego systemu przetwarzania. o qt-win-opensource-4.8.4-vs2010.exe programistyczna dla programów – platforma o interfejsie graficznym, bardzo bogaty zestaw bibliotek. System przetwarzania o Projekt MS przetwarzania, Visual Studio 2010 z systemem tworzy bibliotekę statyczną, którą podłączamy w poprzednich programach. Uczenie sieci o Projekt MS Visual Studio 2010 w języku C# z programem do uczenia sieci neuronowej na podstawie próbek i danych z programu „Metoda 1”. Praca dyplomowa.pdf – tekst pracy dyplomowej. 42