III. Dokumentacja aplikacji
Transkrypt
III. Dokumentacja aplikacji
III. Dokumentacja aplikacji III.1. Interfejs Główne okno aplikacji „EyeTracker” składa się z pięciu zakładek, które dalej zostaną omówione. III.1.1 Zakładka „Camera” Rys. 3.1. Zakładka „Camera” Po kliknięciu w przycisk „Start Tracking” ( i poprawnym wykryciu kamery wideo), rozpoczyna się proces przysyłania obrazu do aplikacji. W oknie „Main” wyświetlana jest cała klatka z kamery, natomiast w oknach „Left Eye” i „Right Eye”, wykryte na tej klatce obszary oczu. Do sterowania kursorem myszy potrzebne jest ustawienie tzw. strefy neutralnej. To prostokątny obszar ( o wymiarach ustalanych w zakładce „Settings”), którego centralnym punktem jest środkowy punkt między wykrytymi źrenicami. Przycisk „Set Template” /”Reset Template” służy do ustawiania/resetowania tego obszaru. Włączenie/wyłączenie trybu sterowania kursorem jest umożliwianie przez przycisk „Switch Mouse Control On” /„Switch Mouse Control Off”. Określenie czy i o ile pikseli kursor ma się przemieścić w pionie lub w poziome odbywa się na podstawie relacji bieżącego punktu środkowego między źrenicami do ustawionej strefy neutralnej (szczegóły w III.2.3 a). Rozpoczyna się również rejestracja mrugnięć użytkownika (przy zaznaczonych odpowiednich opcjach w ustawieniach). Wykrycie mrugnięcia lewego oka symuluje 20 pojedyncze kliknięcie lewego przycisku myszki, a prawego – dwuklik lewego przycisku myszy. Równoczesne wykrycie mrugnięć obydwu oczu nie powoduje żadnej akcji. W grupie „Tracking” możemy również wybrać obiekty, które mają być zaznaczone na poszczególnych oknach: -opcja „Draw Face”: czy rysowany ma być prostokąt wykrytej twarzy (kolor czerwony) w oknie „Main” -opcja „Draw Eyes”: czy rysowane ma być prostokąty wykrytych oczu (kolor zielony) w oknie „Main” -opcja „Draw Puils”: czy mają być zaznaczane lokalizacje wykrytych źrenic (kolor żółty) w oknach „Left Eye” i „Right Eye” -opcja „Draw Middle Point”: czy zaznaczany ma być punkt środkowy (kolor żółty) w oknie „Main” -opcja „Draw Template”: czy rysowany ma być prostokąt strefy neutralnej (kolor niebieski) w oknie „Main” W polu „FPS” widoczna jest liczba wyświetlana klatek na sekundę dla okna „Main”. III.1.2 Zakładka „Settings” Rys. 3.2. Zakładka „Settings” Zakładka służąca do manipulowania ustawieniami aplikacji. W przypadku większej liczby podłączonych kamer wideo pole „WebCam” umożliwia wybór kamery, która będzie przesyłać obraz do aplikacji. W polach „Frame Width” (szerokość) oraz „Frame Height” (wysokość) ustawiane są wymiary przesyłanego obrazu Oczywiście mniejsze wymiary spowodują wzrost liczby przesyłanych klatek na sekundę, ale równocześnie zmniejszą skuteczność działania algorytmów z rozdziału II. 21 W grupie „Average” ustawiane są liczby uśrednianych wykrytych obszarów twarzy („Avg. Face Number”) i oczu („Avg. Eye Number”). Uśrednianie to jest szerzej opisane w rodziale III.2.3 a. W grupie „Tracking”, z listy „Pupil Localization Algorithm” możemy wybrać jeden z trzech przedstawionych w pracy algorytmów lokalizacji źrenicy, który będzie stosowany na obrazie z kamery („CDF Analysis”- analiza za pomocą dystrybuanty, „Edge Detection”- analiza krawędziowa , „GPF Detection”- analiza za pomocą funkcji rzutującej). W grupie „Clicking” ustawiane są opcje dotyczące detekcji mrugnięć i symulacji kliknięć myszki. Możemy określić czy aplikacja ma rejestrować zarówno mrugnięcie lewego oka (pojedyncze kliknięcie lewym klawiszem myszy, pole „Support Single Click”) jak i prawego oka(podwójne kliknięcie lewym klawiszem myszy ,pole „Support Double Click”), czy też tylko jedną z tych funkcji lub żadną (kompletne wyłączenie rejestracji mrugnięć). Oprócz tego ustawiane są w tej grupie parametry wejściowe dla algorytmu detekcji mrugnięć z rozdziału II.5 . Pole „Avg. Frame Num” ustala liczbę klatek, z których tworzona jest mapa wariancyjna. Im jest ona większa, tym algorytm jest bardziej czuły na nagłe zmiany intensywności w obszarze oka. W polu „Varriance Threshold” ustawiany jest próg intensywności dla mapy wariancyjnej, natomiast pola „Ratio Threshold Left/Right” (dla odpowiednio lewego i prawego oka) określają minimalny stosunek liczby pikseli mapy wariancyjne poniżej progu „Varriance Threshold” do liczby wszystkich pikseli w mapie, wystarczający do stwierdzenia mrugnięcia. W grupie „Cursor Movement” ustawiane są wymiary strefy neutralnej (szerokość – pole „Template Width”, wysokość – pole „Template Height”), jak również współczynniki liniowej modyfikacji ruchu w pionie i poziomie (pola odpowiednio „Vertical Acc.” i „Horizontal Acc.” ). Działanie tych współczynników omówione jest w rozdziale III.2.3 a. Efekty zmian ustawień będą miały miejsce dopiero po ponownym użyciu przycisku „Start Tracking” w zakładce „Camera”. III.1.3 Zakładka „Logs” Rys. 3.3. Zakładka „Logs” 22 Okno czysto informacyjne. Wyświetlane są w nim niektóre zdarzenia, występujące podczas działania aplikacji. Są nimi: -wykrycie twarzy -wykrycie oczu -wykrycie źrenic -wykrycie ruchu -wykrycie mrugnięcia Do wszystkich wpisów dołączony jest czas ich zarejestrowania, a dla wykrytych obiektów podawana jest ich lokalizacja na obrazie z kamery. III.1.4 Zakładka „Image” Rys. 3.4. Zakładka „Image” Umożliwia wizualną ocenę skuteczności trzech przedstawionych metod lokalizacji źrenic na obrazie. W prawym górnym rogu wyświetlany jest obraz wejściowy, a obok wykryte oczy. Gdy program nie może wykryć twarzy (a co za tym idzie oczu), obraz traktowany jest, jako przedstawiający jedno oko i bezpośrednio poddawany jest działaniu algorytmów lokalizujących źrenicę. Obrazy do przeglądania wczytywane są za pomocą przycisku „Load”. Do przechodzenia między kolejnymi obrazami służą przyciski „Previous” (poprzedni obraz) i „Next” (następny obraz). W obszarze „Pupil Localization Algorithm”, można wybrać interesujące nas algorytmy szukania źrenic. Punkty wynikowe zwracane przez każdy z algorytmów są zaznaczane na obrazie oka różnymi kolorami. 23 III.1.5 Zakładka „Comparer” Rys. 3.5. Zakładka „Comparer” Umożliwia porównanie skuteczności algorytmów lokalizacji źrenic na bazie BioID [13] metodą opisaną w IV.1.2. Przyciskiem „Load” wczytywane są wybrane zdjęcia, na których wykonane będzie porównanie (pliki z rzeczywistą lokalizacją źrenicy muszą znajdować się w tym samym katalogu). Przyciskiem „Export File” można określić plik tekstowy, do którego zapisywany będzie wynik porównania. Wyniki przedstawiane są również na wykresie. Oś „ErrorThreshold” (próg błedu) określa maksymalny błąd, w którym muszą się zmieścić wykryte źrenice, a na osi „DetectionRate” zaznaczony jest procent par oczu, które spełniają ten warunek. W polu „Max Error Threshold” ustawiany jest maksymalny próg błędu (ostatni punkt na osi„ErrorThreshold”).W polu „Error Thresholds Number” natomiast, ustawiana jest liczba punktów dzielących równomiernie zakres osi „ErrorThreshold”, dla których przeprowadzane jest porównanie. W grupie „Algorithms” wybierane są interesujące nas algorytmy(domyślni wszystkie trzy), które na wykresie oznaczane są różnymi kolorami. Kliknięcie w przycisk „Compare” rozpoczyna operację porównania. Po jej zakończeniu w grupie „Detection Info” wyświetlane są informacje o liczbie wczytanych zdjęć („Images Loaded”), liczbie wykrytych twarzy („Faces Detected”) oraz liczbie wykrytych par oczu („Eye Pairs Detected”) 24 III.2. Implementacja III.2.1 Wymagania „EyeTracker” jest 32-bitową aplikacją przeznaczoną na systemy operacyjne z rodziny Windows (Windows XP, Windows Vista, Windows 7) z zainstalowanym środowiskiem uruchomieniowym „Microsoft Visual C++ 2010 Redistributable” [14]. Aplikację testowano głownie na procesorze o częstotliwości taktowania 3 GHz z wykorzystaniem kamery internetowej z procesorem z rodziny „Vimicro USB2.0 UVC PC”, o standardowej rozdzielczości 640x480 pikseli oraz częstotliwości przesyłania obrazu 30 klatek na sekundę. III.2.2 Technologie a) Środowisko programistyczne Aplikacja została napisana w języku C++(w standardzie „C++03” z elementami standardu „C++0x”) w środowisku programistycznym „Microsoft Visual Studio 2010”. Do budowy interfejsu graficznego wykorzystano bibliotekę „MFC”(„Microsoft Foundation Classes”), która jest konsolidowana dynamicznie(stąd wymaganie odpowiedniego środowiska uruchomieniowego). Do aplikacji dołączony jest instalator utworzony w technologii „Windows Installer”. b) Biblioteka OpenCV Aplikacja korzysta w ogromnym stopniu z otwartej biblioteki programistycznej, napisanej w języku C/C++, OpenCV („Open Source Computer Vision Library”) [15] w wersji 2.1. Biblioteka – tworzona pierwotnie przez firmę „Intel”- zawiera struktury i funkcje implementujące przeszło pięćset algorytmów służących do obróbki obrazów cyfrowych. Poniżej przedstawiam listę najważniejszych elementów biblioteki, których użyłem w mojej aplikacji: IIplImage - podstawowa struktura biblioteki reprezentująca obraz cyfrowy. cvCaptureFromCAM – funkcja uzyskująca dostęp do kamery wideo. cvQueryFrame – funkcja zwracająca bieżąca klatkę z kamery wideo. cvHaarDetectObjects – funkcja implementująca omówiony w rozdziale II.2.1 algorytm Viola-Jonesa. Do działania funkcja wykorzystuje wytrenowane kaskady klasyfikatorów w postaci plików XML. Przykładowe kaskady dla wykrywania twarzy („haarcascade_frontalface_alt.xml”) i oczu („haarcascade_eye.xml”), z których skorzystałem w aplikacji są dołączone do dystrybucji biblioteki. 25 cvCvtColor– Funkcja konwertująca obraz do innej przestrzeni kolorów. Używałem jej do zamiany obrazu w przestrzeni RGB do postaci monochromatycznej. cvResize – funkcja skalująca obraz do innej rozdzielczości. cvCopy – funkcja kopiująca obraz cvSmooth – imlementacja wygładzania Gaussa. cvErode – imlementacja operatora erozji. cvCanny – imlementacja metody wykrywania krawędzi Canny. c) Kontrolka NTGraph Do wykonania zakładki „Comparer” użyłem darmowej kontrolki ActiveX NTGraph [16]. Umożliwia ona rysowanie dwuwymiarowych wykresów. Kontrolka rejestrowana jest podczas instalacji aplikacji. III.2.3 Ważniejsze klasy a) CCameraDlg Klasa implementująca zakładkę „Camera”. Analizuje przesyłane przez kamerę klatki za pomocą funkcji klasy CObjectDetection. Odpowiada również za sterowanie kursorem myszki. Główną częścią jej kodu jest cyklicznie wywoływana, metoda, która na początku każdego swojego wykonywania pobiera bieżący obraz z kamery. Następnie korzystając z metody CObjectDetection::DetectFace uzyskiwany jest obszar twarzy użytkownika. Ponieważ kolejne klatki z kamery zawsze się różnią (nawet, gdy użytkownik nie wykonuje żadnych ruchów), różnią się również wykryte obszary twarzy (nawet na, wydawałoby się, takich samych klatkach z kamery). W celu eliminacji tych drgań, opcjonalnie przeprowadzane jest uśrednianie obszaru twarzy z pewnej liczby kolejnych klatek. Liczba ta jest ustalana w polu „Avg. Face Number”, w zakładce „Settings”. Jej domyślna wartość to 1, czyli uśrednianie jest wyłączone. Następnie korzystając z uśrednionego(lub nie) obszaru twarzy, za pomocą metody CObjectDetection::DetectEyes wykrywane są obszary oczu, które również podlegają drganiom. Liczba klatek, z których uśredniane są obszary oczu jest ustalana w polu „Avg. Eye Number”, w zakładce „Settings” ( jej domyślną wartością jest również 1). Uśrednianie jest stosowane w celu uniknięcia sytuacji, w której do metod lokalizujących źrenice i wykrywających mrugnięcia jest przesyłany obraz zawierający tylko część oka. Większe wartości „Avg. Face Number” i „Avg. Eye Number” zwiększają dokładność aplikacji, przy jednoczesnym zwiększeniu jej czasu reakcji na zachowanie użytkownika. 26 Na wykrytych (i ewentualnie uśrednionych) obszarach oczu lokalizowane są źrenice za pomocą jednego z trzech omówionych algorytmów (wyboru algorytmu dokonuje się w zakładce „Settings”). Następnie, jeśli zostały wykryte obydwa obszary oczu, to wyliczany jest punkt środkowy między obiema lokalizacjami źrenic. Gdy aplikacja pracuje w trybie sterowania myszką (przycisk „Switch Mouse Control On”) oraz ustawiona jest strefa neutralna (omówiona w III.1.1) to przemieszczenie kursora w pikselach, odpowiednio w poziomie i w pionie obliczane jest jako: |!"##$| !""# i |!"##$| !""# gdzie: DiffH to różnica między odciętą bieżącego punktu środkowego, a bliższą krawędzią strefy neutralności(lewej lub prawej) !""# to współczynnik liniowo modyfikujący ruch w poziomie DiffV to różnica między rzędną bieżącego punktu środkowego, a bliższą krawędzią strefy neutralności(dolna lub górną) !""# to współczynnik liniowo modyfikujący ruch w pionie Wartośći współczynników AccH i AccV są ustawianie w zakładce „Settings”, w grupie „Cursor Movement”. Gdy bieżący punkt środkowy znajduję się wewnątrz strefy neutralnej, to oczywiście kursor nie wykonuje żadnego ruchu. Wywoływane są również metody CObjectDetection::Detect(Left/Right)Blink w celu stwierdzenia czy użytkownik mrugnął. Jak już wspomniano w III.1.5, jeśli wykryto mrugnięcie tylko lewego oka, to jest symulowane pojedyncze kliknięcie lewym przyciskiem myszki(musi być zaznaczona opcja „Support Single Click” w zakładce „Settings”), jeśli tylko prawego, to symulowane jest podwójne kliknięcie lewym przyciskiem myszki (musi być zaznaczona opcja „Support Double Click” w zakładce „Settings”). Wykrycie mrugnięć obydwu oczu, oznacza, że jest to mrugnięcie mimowolne i nieprzeprowadzana jest żadna symulacja. Ponieważ ruch głowy użytkownika może spowodować błędne wykrycie mrugnięcia, to w przypadku, gdy wcześniej został wykryty ruch kursora, niemożliwa jest symulacja kliknięć. Do sterowania ruchem kursora wykorzystuję funkcje SetCursorPos/SetCursorPos, a do symulacji kliknięć funkcje SendInput ze standardowej biblioteki WinApi. Klasa „CCameraDlg” zaznacza również wykryte obiekty na wyświetlanych obrazach w zakładce „Camera”, za pomocą funkcji OpenCV: cvRectangle, cvDrawCircle oraz cvDrawLine. b) CObjectDetection Zawiera zestaw statycznych metod, wywoływanych przez obiekt klasy CCameraDlg, w celu wykrycia określonych obiektów na obrazie: CvRect* DetectFace(IplImage *img ) Metoda zwracająca obszaru twarzy na podanym obrazie (img). Do tego zadania wykorzystuje wspomnianą funkcje cvHaarDetectObjects z biblioteki OpenCV, która implementuje metodę Viola-Jonesa. 27 void DetectEyes(IplImage *img, CvRect* pFace, CvRect* pEyeOne, CvRect* pEyeTwo) Metoda szukającą obszaru oczu na podanym obrazie. Działa analogicznie do DetectFace , tyle że przeszukiwany jest nie cały obraz wejściowy, a jedynie mały podobszar twarzy (pFace), Znalezione obszary oczu zapisywane są do pEyeOne i pEyeTwo. CvPoint DetectPupilCDF(IplImage *pEyeImg) CvPoint DetectPupilGPF(IplImage *pEyeImg) CvPoint DetectPupilEdge(IplImage *pEyeImg) Metody zwracające lokalizacje źrenicy na podanym obrazie oka (pEyeImg). Implementują algorytmy opisane odpowiednio w II.4.1, II.4.2 i II4.3. BOOL DetectLeftBlink(IplImage *pEyeImg, int iLastFramesNumber, int iVarrianceThreshold,double dRatioThreshold, BOOL bReset); BOOL DetectRightBlink(IplImage *pEyeImg, int iLastFramesNumber, int iVarrianceThreshold,double dRatioThreshold, BOOL bReset) Metody implementujące metodę detekcji mrugania opisaną w II.5 dla odpowiednio lewego i prawego oka. W przypadku wykrycia mrugnięcia dla wejściowego obrazu oka (pEyeImg) zwracana jest wartość pozytywna, w przeciwnym razie negatywna Wartości parametrów iLastFramesNumber, iVarrianceThreshold i dRatioThreshold dla tych metod są ustalane w zakładce „Settings”, w grupie „Clicking” (III.1.2). Natomiast flaga bReset określa czy ma być wyczyszczona kolekcja zebranych klatek (np. gdy symulowany jest ruchu kursora). 28