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

Podobne dokumenty