1 Wprowadzenie. 1.1 Interakcja człowieka z maszyną. 1.2 Cel i zakres pracy

Podobne dokumenty
Przetwarzanie obrazów rastrowych macierzą konwolucji

Analiza obrazów - sprawozdanie nr 2

Parametryzacja obrazu na potrzeby algorytmów decyzyjnych

Implementacja filtru Canny ego

Cyfrowe przetwarzanie obrazów i sygnałów Wykład 8 AiR III

Rozpoznawanie obrazów na przykładzie rozpoznawania twarzy

Filtracja obrazu operacje kontekstowe

Automatyczne tworzenie trójwymiarowego planu pomieszczenia z zastosowaniem metod stereowizyjnych

Filtracja obrazu operacje kontekstowe

Filtracja splotowa obrazu

Cyfrowe przetwarzanie obrazów i sygnałów Wykład 7 AiR III

BIBLIOTEKA PROGRAMU R - BIOPS. Narzędzia Informatyczne w Badaniach Naukowych Katarzyna Bernat

i ruchów użytkownika komputera za i pozycjonujący oczy cyberagenta internetowego na oczach i akcjach użytkownika Promotor: dr Adrian Horzyk

Cyfrowe przetwarzanie obrazów i sygnałów Wykład 9 AiR III

Spośród licznych filtrów nieliniowych najlepszymi właściwościami odznacza się filtr medianowy prosty i skuteczny.

Reprezentacja i analiza obszarów

PRZETWARZANIE SYGNAŁÓW

Obraz jako funkcja Przekształcenia geometryczne

Przetwarzanie obrazu

Przetwarzanie obrazów wykład 4

Przetwarzanie obrazów wykład 7. Adam Wojciechowski

Aproksymacja funkcji a regresja symboliczna

ANALIZA I INDEKSOWANIE MULTIMEDIÓW (AIM)

Przekształcenia kontekstowe. Filtry nieliniowe Typowy przykład usuwania zakłóceń z obrazu

Metody kodowania wybranych cech biometrycznych na przykładzie wzoru naczyń krwionośnych dłoni i przedramienia. Mgr inż.

Laboratorium. Cyfrowe przetwarzanie sygnałów. Ćwiczenie 11. Filtracja sygnałów wizyjnych

Analiza obrazu. wykład 4. Marek Jan Kasprowicz Uniwersytet Rolniczy 2009

Zastosowanie stereowizji do śledzenia trajektorii obiektów w przestrzeni 3D

FIGURY I PRZEKSZTAŁCENIA GEOMETRYCZNE

ZAGADNIENIA PROGRAMOWE I WYMAGANIA EDUKACYJNE DO TESTU PRZYROSTU KOMPETENCJI Z MATEMATYKI DLA UCZNIA KLASY II

Filtracja liniowa (metody konwolucyjne, tzn. uwzględniające pewne otoczenie przetwarzanego piksla):

Reprezentacja i analiza obszarów

w analizie wyników badań eksperymentalnych, w problemach modelowania zjawisk fizycznych, w analizie obserwacji statystycznych.

dr inż. Piotr Odya dr inż. Piotr Suchomski

KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT

0. OpenGL ma układ współrzędnych taki, że oś y jest skierowana (względem monitora) a) w dół b) w górę c) w lewo d) w prawo e) w kierunku do

PRÓBNY EGZAMIN MATURALNY Z MATEMATYKI poziom rozszerzony

Funkcja liniowa - podsumowanie

Segmentacja przez detekcje brzegów

Algorytmy decyzyjne będące alternatywą dla sieci neuronowych

Materiały: kartki papieru (5 x 5 kolorów), piłeczki pingpongowe (5 x 5 kolorów), worek (nieprzeźroczysty).

maska 1 maska 2 maska 3 ogólnie

Ćwiczenia nr 7. TEMATYKA: Krzywe Bézier a

Detekcja twarzy w obrazie

Akademia Górniczo - Hutnicza im. Stanisława Staszica w Krakowie. Projekt. z przedmiotu Analiza i Przetwarzanie Obrazów

Analiza obrazów. Segmentacja i indeksacja obiektów

W naukach technicznych większość rozpatrywanych wielkości możemy zapisać w jednej z trzech postaci: skalara, wektora oraz tensora.

Cyfrowe przetwarzanie obrazów i sygnałów Wykład 10 AiR III

Maciej Piotr Jankowski

WYKŁAD 7. Obraz z wykrytymi krawędziami: gdzie 1 - wartość konturu, 0 - wartość tła.

3. FUNKCJA LINIOWA. gdzie ; ół,.

WYMAGANIE EDUKACYJNE Z MATEMATYKI W KLASIE II GIMNAZJUM. dopuszczającą dostateczną dobrą bardzo dobrą celującą

Przewodnik po soczewkach

Zakres na egzaminy poprawkowe w r. szk. 2013/14 /nauczyciel M.Tatar/

Definicja obrotu: Definicja elementów obrotu:

WYMAGANIA EDUKACYJNE Z MATEMATYKI W KLASIE II W PUBLICZNYM GIMNAZJUM NR 2 W ZESPOLE SZKÓŁ W RUDKACH

Algorytm. a programowanie -

CECHY BIOMETRYCZNE: ODCISK PALCA

Arkusz maturalny nr 2 poziom podstawowy ZADANIA ZAMKNIĘTE. Rozwiązania. Wartość bezwzględna jest odległością na osi liczbowej.

Rozpoznawanie Twarzy i Systemy Biometryczne

WYKŁAD 10. kodem pierwotnym krzywej jest ciąg par współrzędnych x, y kolejnych punktów krzywej: (x 1, y 1 ), (x 2, y 2 ),...

Grafika rastrowa (bitmapa)-

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

Grafika Komputerowa Wykład 5. Potok Renderowania Oświetlenie. mgr inż. Michał Chwesiuk 1/38

Przetwarzanie obrazu

Grafika Komputerowa Wykład 2. Przetwarzanie obrazów. mgr inż. Michał Chwesiuk 1/38

Przekształcenia punktowe

Kolorowanie płaszczyzny, prostych i okręgów

Dział I FUNKCJE I ICH WŁASNOŚCI

Maskowanie i selekcja

Wyższa Szkoła Informatyki Stosowanej i Zarządzania

Detekcja punktów zainteresowania

Analiza obrazów - sprawozdanie nr 3

FUNKCJA LINIOWA - WYKRES

Filtracja nieliniowa obrazu

Uniwersytet Mikołaja Kopernika w Toruniu. Egzamin wstępny z matematyki

Animowana grafika 3D. Opracowanie: J. Kęsik.

Laboratorium. Cyfrowe przetwarzanie sygnałów. Ćwiczenie 9. Przetwarzanie sygnałów wizyjnych. Politechnika Świętokrzyska.

KURS WSPOMAGAJĄCY PRZYGOTOWANIA DO MATURY Z MATEMATYKI ZDAJ MATMĘ NA MAKSA. przyjmuje wartości większe od funkcji dokładnie w przedziale

Animacje z zastosowaniem suwaka i przycisku

FUNKCJA LINIOWA, RÓWNANIA I UKŁADY RÓWNAŃ LINIOWYCH

Automatyczne nastawianie ostrości

Ćwiczenie 6. Transformacje skali szarości obrazów

Przedmiotowe zasady oceniania i wymagania edukacyjne z matematyki dla klasy drugiej gimnazjum

KONSTRUKCJA TRÓJKĄTA 1 KONSTRUKCJA TRÓJKĄTA 2 KONSTRUKCJA CZWOROKĄTA KONSTRUKCJA OKRĘGU KONSTRUKCJA STYCZNYCH

========================= Zapisujemy naszą funkcję kwadratową w postaci kanonicznej: 2

Interpretacja gestów dłoni w sekwencji obrazów cyfrowych. autor: Karol Czapnik opiekun: prof. dr hab. Włodzimierz Kasprzak

PRÓBNY EGZAMIN MATURALNY Z MATEMATYKI

Szukanie rozwiązań funkcji uwikłanych (równań nieliniowych)

POB Odpowiedzi na pytania

Segmentacja obrazów cyfrowych z zastosowaniem teorii grafów - wstęp. autor: Łukasz Chlebda

Wykrywanie twarzy na zdjęciach przy pomocy kaskad

Osiągnięcia ponadprzedmiotowe

Proste metody przetwarzania obrazu

WYMAGANIA EDUKACYJNE Z MATEMATYKI 2016/2017 (zakres podstawowy) klasa 3abc

Diagnostyka obrazowa

Osiągnięcia ponadprzedmiotowe

6. Algorytmy ochrony przed zagłodzeniem dla systemów Linux i Windows NT.

IRONCAD. TriBall IRONCAD Narzędzie pozycjonujące

Wyższa Szkoła Informatyki Stosowanej i Zarządzania

Transkrypt:

Spis treści 1 Wprowadzenie...2 1.1 Interakcja człowieka z maszyną...2 1.2 Cel i zakres pracy...2 2 Przedstawienie problemu...4 2.1 Zadanie obserwuj i uchwyć...4 2.2 Stan techniki światowej...4 3 Analiza rozwiązań omawianego problemu...6 3.1 Dekompozycja zadań wizji komputerowej...6 3.2 Przykłady możliwych rozwiązań...7 3.3 Wnioski...11 4 Projekt systemu...12 4.1 Wymagania wobec systemu...12 4.1.1 Wymagania funkcjonalne...12 4.1.2 Wymagania niefunkcjonalne...13 4.2 Struktura rozwiązania...13 4.3 Technologie rozwiązania...16 5 Analiza kolorowa obrazu...17 5.1 Segmentacja kolorowa...17 5.2 Redukcja szumu w obrazie...23 5.3 Tworzenie obrazu krawędziowego...25 5.4 Wyznaczanie konturów obiektów w obrazie...26 6 Rozpoznanie obiektu...29 6.1 Wyznaczanie prymitywów w obrazie...29 6.2 Algorytm przeszukiwania dla problemu z ograniczeniami (CSP)...40 6.3 Rozpoznawanie obiektów jako problem CSP...43 6.4 Śledzenie rozpoznanego obiektu...50 7 Implementacja aplikacji wizyjnej...52 7.1 Moduły programu...52 7.2 Diagramy klas...53 7.3 Diagramy interakcji...58 8 Wyniki testów...61 8.1 Ilustracje etapów analizy...61 8.2 Serie testowe...64 8.3 Obserwacje i wnioski...75 9 Podsumowanie...77 Bibliografia...78 Zawartość płyty DVD...79 Załącznik...80 1

1 Wprowadzenie 1.1 Interakcja człowieka z maszyną Cyfrowe przetwarzanie obrazów jest zagadnieniem badanym od wielu lat. Jednym z problemów w tej dziedzinie jest rozpoznawanie przedmiotów w obrazie cyfrowym. Obecnie jest to istotny problem w projektowaniu robotów usługowych. Jego rozwiązanie pozwoli na udoskonalenie interakcji robota z człowiekiem. Coraz częściej prowadzone są prace polegające na stworzeniu robotów, które będą pomagały człowiekowi w życiu codziennym. Przykładem może być zastosowanie robotów w szpitalu, gdzie ich rola polegałaby na podawaniu chorym napojów oraz lekarstw. Agencja kosmiczna NASA pracuje nad stworzeniem robota, który byłby asystentem kosmonauty przy pracach w przestrzeni kosmicznej. Jego rola polegać będzie na odbieraniu od kosmonauty niepotrzebnych narzędzi oraz składowanie ich w bezpiecznym miejscu. Dotychczasowy dominujący obszar zastosowań robotyki, czyli przemysł, również skorzysta na rozwoju systemów rozpoznawania obrazów. Zastosowanie systemów wizyjnych może zastąpić stosowanie szeregu skomplikowanych czujników odpowiadających za określenie rozmiaru, położenia, kształtu oraz zorientowania danego przedmiotu w przestrzeni. Może też przyśpieszyć i w pełni zautomatyzować wiele procesów technologicznych. W niniejszej pracy przedmiotami wykrywanymi w obrazie są: kostka Rubika, czyli sześcian, który na każdej ścianie zawiera kolorowe kwadratowe kafelki. Typowa kostka zawiera sześć podstawowych kolorów: czerwony, pomarańczowy, żółty, niebieski, zielony oraz biały. Przestrzenie między kafelkami są koloru czarnego. Pudełko, kubek. 1.2 Cel i zakres pracy Celem pracy jest automatyczne rozpoznawanie i lokalizacja wybranych przedmiotów w obrazie cyfrowym. Dla osiągnięcia tego celu należało przeprowadzić : analizę problemu rozpoznawania obiektów, zaproponować rozwiązanie, czyli algorytmy analizy obrazu, zaprojektować i zaimplementować aplikację, wykonać testowanie aplikacji w laboratorium. 2

Praca składa się z ośmiu rozdziałów. W rozdziale 2 przedstawiono zagadnienia rozwiązywane w pracy. Rozdział 3 stanowi omówienie typowego podejścia do problemów rozpoznawania obiektów w obrazie cyfrowym. W rozdziale 4 przedstawiono projekt systemu, który obejmuje następujące analizy: rozpoznawanie kolorów w obrazach, detekcja krawędzi, detekcja łańcuchów krawędzi, rozpoznawanie obiektu, zbudowanie modelu 3D danego obiektu, śledzenie obiektu. Zastosowane w pracy algorytmy analizy obrazu przedstawiono w rozdziałach 5 i 6. Kolejne rozdziały 7 i 8 dotyczą implementacji aplikacji i jej testowania. Na koniec przedstawiono podsumowanie wykonanych prac. 3

2 Przedstawienie problemu 2.1 Zadanie obserwuj i uchwyć Zadaniem aplikacji jest detekcja, lokalizacja i śledzenie przedmiotów trzymanych przed kamerą przez człowieka. W celu detekcji obiektu przydatne będzie prawidłowe wyznaczenie konturu dłoni w obrazie, na podstawie którego możemy ograniczyć obszar poszukiwań. Po uzyskaniu prawidłowego dopasowania segmentów obrazu z modelem obiektu zostanie zbudowany jego opis 3D (lokalizacja), który umożliwi uchwycenie przedmiotu przez manipulator robota. Aby wspomóc manipulator w procesie uchwycenia został wykonany mechanizm śledzenia obiektu w obrazie. Głównym zadaniem mechanizmu śledzenia jest informowanie o zmianach położenia obiektu trzymanego w dłoni. Gdy te zmiany będą zbyt duże, nie będzie możliwe uchwycenie przedmiotu przez robota. W takiej sytuacji operacja będzie wstrzymana do czasu ustabilizowania się położenia przedmiotu w przestrzeni. 2.2 Stan techniki światowej Na świecie trwają prace nad konstruowaniem robotów, które swoją budową i zachowaniem będą przypominały człowieka. Jednym z takich zespołów dysponuje japońska firma Honda, która stworzyła robota Asimo [7]. Do jego podstawowych funkcji należy: śledzenie i rozpoznawanie obiektów, rozpoznawanie twarzy, rozpoznawanie mowy, rozpoznawanie pomieszczeń, w których się znajduje. Agencja kosmiczna NASA prowadzi prace nad zbudowaniem robotów, które mają pomagać kosmonautom w przestrzeni kosmicznej [8]. Dodatkowo roboty te będą mogły zastąpić całkowicie astronautę przy pracach o podwyższonym ryzyku. Roboty poruszać się będą w przestrzeni kosmicznej za pomocą czterech silników odrzutowych, kontrolowanych przez pokładowy system czujników, które są odpowiedzialne za regulację ich ciągu i mocy. 4

Na rysunku 2.1 znajduje się robot zespołu Honda, a na rysunku 2.2 robot NASA. Rysunek 2.1: Robot Asimo [7] Rysunek 2.2: Robot NASA "Robonaut" [8] 5

3 Analiza rozwiązań omawianego problemu Obrazy cyfrowe są reprezentowane w dwuwymiarowych tablicach złożonych z pikseli, reprezentowanych przez liczby określające ich jasność oraz kolor. Obrazy cyfrowe oprócz samego obiektu, który nas interesuje, zawierają dużo zbędnej informacji o otoczeniu obiektu. Dodatkowo informacja użyteczna jest zakłócona i modyfikowana takimi zjawiskami jak: natężenie i kolor oświetlenia, ilość, rozmieszczenie i charakter źródeł światła, odbicia, nieostrość, różnice w obrazie obiektu w zależności od odległości i orientacji. Dlatego proces analizy obrazu rozbija się na szereg operacji prostszych, takich jak wstępna filtracja, skalowanie, konturowanie, wyodrębnianie obiektów, itd. Ważnym zagadnieniem w przetwarzaniu obrazów jest filtracja, czyli takie przekształcenie obrazu, które poprzez odpowiednią jego zmianę, pozwala na pozbycie się z obrazu niepożądanych efektów (szum, zniekształcenia) lub też na wydobycie użytecznych informacji (np. wzmocnienie krawędzi, poprawianie jakości obrazu). Na skuteczność wyżej wymienionych kroków analizy obrazów ogromny wpływ ma prawidłowa kalibracja kamery w zakresie koloru i ostrości obrazu. Zastosowano kamerę dostępna w laboratorium, Mitsubishi CCD-400, która oferuje szeroką gamę ustawień, przez co możliwe jest precyzyjne jej skalibrowanie. W procesie kalibracji kluczowe znaczenie ma prawidłowe ustawienie balansu bieli. Gdy kamera nie ma na stałe wyznaczonego poziomu bieli, wtedy podczas zmiany oświetlenia lub tła (z ciemnego na jasne) kamera próbuje sama dopasować sobie balans, co powoduje, że zakresy poszczególnych kolorów będą się zmieniały. Kolejnym krokiem jest ustawienie ostrości, bez której nie będzie możliwe szczegółowe wyznaczenie krawędzi. Po takich zabiegach można zabrać się za przetwarzanie obrazu generowanego przez dobrze ustawioną kamerę. 3.1 Dekompozycja zadań wizji komputerowej Pierwszym zadaniem pracy był przegląd i wybór metod analizy obrazu tworzących potok przetwarzania. Wstępnym procesem jest przetworzenie obrazu kolorowego z formatu RGB na YUV. Do celu służy zwykłe przekształcenie macierzowe. Kolejnym krokiem jest segmentacja obrazu ze względu na kolory, polegająca na sklasyfikowaniu pikseli do jednej z sześciu podstawowych barw: czerwony, pomarańczowy, żółty, zielony, niebieski, biały. Reszta barw pikseli jest klasyfikowana jako kolor czarny. Obraz otrzymywany z kamery jest podatny na różnego rodzaju zniekształcenia. Jednym z typowych problemów jest fluktuacja amplitud barw pojawienie się szumu. W celu zredukowania szumu w obrazie po segmentacji można użyć morfologicznych operatorów erozji i dylatacji. W kolejnym kroku zostaje wyznaczony obraz konturowy, który posłuży do wyznaczania 6

prymitywów w obrazie takich jak odcinki proste, łuki, okręgi, elipsy oraz kafelki na kostce Rubika. Na podstawie tak wyznaczonych elementarnych wzorców reprezentacji symbolicznej dokonywane jest rozpoznawanie obiektu 3D. Polega ono na rozpoznaniu widoku trzymanego przedmiotu, oraz wyznaczeniu jego zorientowania w przestrzeni. Ostatecznym krokiem jest śledzenie rozpoznanego obiektu. Operacja ta jest stosowana w celu stwierdzenia czy dany obiekt jest trzymany nieruchomo, ponieważ niemożliwe jest uchwycenie przedmiotu, którego położenie jest niestabilne. Na potrzeby pracy należało również stworzyć narzędzie wizualizacji wyników. Jako wynik końcowy analizy obrazu powinien zostać przedstawiony obraz oryginalny z nałożonym obrazem zawierającym opis rozpoznanego obiektu. Należało stworzyć aplikację, która stanowi implementację kroków analizy obrazu oraz umożliwia podejrzenie wyników działania każdego z użytych algorytmów. W ten sposób uzyskamy możliwość weryfikacji działania poszczególnych algorytmów i w razie potrzeby znaleźć przyczynę błędu. 3.2 Przykłady możliwych rozwiązań Ostateczny zestaw algorytmów został zaproponowany po wielu analizach alternatywnych rozwiązań. Dużo uwagi zostało poświęcone algorytmom do detekcji krawędzi, ponieważ od jakości wyników ich działania zależy, czy obiekty zostaną poprawnie rozpoznane w obrazie. Detekcja krawędzi Podstawową ideą algorytmów detekcji obrazu krawędziowego jest poszukiwanie nieciągłości funkcji obrazu (np. jasności)[1]. Jako krok wstępny stosuje się wygładzanie obrazu w celu usunięcia szumu. Wyróżniamy trzy najbardziej popularne kategorie algorytmów ( operatorów ) detekcji obrazu krawędziowego: Bezpośrednie obliczanie pochodnych funkcji obrazu Dyskretny splot funkcji, realizujący pierwszą lub drugą pochodną funkcji obrazu (maski krawędziowe) Metody łączenia operatorów poprzednich kategorii (1-3) Dyskretne pochodne funkcji obrazu Poszukiwanie raptownych zmian funkcji obrazu można zrealizować poprzez poszukiwanie minimów lub maksimów lokalnych pierwszej pochodnej funkcji obrazu lub poprzez poszukiwanie zerowych wartości drugiej pochodnej. 7

Gradient 2-wymiarowej funkcji ciągłej f x, y ma postać: f x, y x. (3.1) f x, y y f x, y = f x x, y f y x, y = Aproksymacja gradientów dyskretnymi różnicami dla funkcji dyskretnej f x, y, będącej aproksymacją funkcji ciągłej f x, y : f x i, j = f i 1, j f i, j, (3.2) f y i, j = f i, j 1 f i, j, (3.3) f x x, y =lim f x h, y f x, y, (3.4) h 0 h f y x, y =lim f x, y h f x, y, (3.5) h 0 h Wynikiem detekcji krawędzi jest amplituda krawędzi ( s ) lub ( s ' ) i kierunek krawędzi ( r ): s= f 2 x f 2 y lub s ' = f x2 f y2, r=arctan f x, f y. (3.6) Kierunek r odpowiada wektorowi normalnemu w danym punkcie do przebiegu linii konturu (krawędzi) w obrazie. Pierwszym i najprostszym operatorem krawędziowym jest krzyż Robertsa. Jego zasadnicze cechy są następujące: maksymalna amplituda krawędzi wynosi 255 dla obrazów 8 bitowych, pozwala to przyjąć ten sam format reprezentacji dla obrazu wejściowego i wyjściowego, bardzo prosta realizacja w postaci filtracji obrazu dla dwóch specyficznych masek 2x2, z uwagi na niewielkie badane otoczenie (lokalne sąsiedztwo) wynik operacji jest wrażliwy na szum. Operacja krzyża Robertsa polega na obliczaniu dla każdego piksela dyskretnych różnic wzdłuż dwóch kierunków: k x i, j = f i, j f i 1, j 1, (3.7) k y i, j = f i 1, j f i, j 1, (3.8) 8

Operację tę można zrealizować poprzez dyskretny splot z dwoma maskami: [ 1 0 0 1] 1 0 ] k x, [ 0 1 k y. (3.9) Amplituda krawędzi może być wyrażona w dwóch alternatywnych postaciach: s= k x 2 k y 2, s ' = k x k y. (3.10) Kierunek krawędzi jest wyliczany jako: r Roberts =arctg k y k x 3 4. (3.11) Niezbędna jest tu korekta kierunku o kąt 3/ 4, gdyż zastosowane maski (3,9) są obrócone względem osi współrzędnych o kąt /4. Operacja splotu operatory maski Operacja splotu obrazu z funkcją jądra ( g = f h ) wyrażona w dyskretnej postaci wynosi: M N g i, j = h[m,n] f [i m, j n]. (3.12) m= M n= N Operatory krawędziowe realizowane w postaci dyskretnego splotu charakteryzują się stosownym zbiorem masek h[m,n]. Typowe znane operatory krawędziowe stosują maski aproksymujące pierwszą pochodną funkcji obrazu: operator różnic elementów centralnych (maksymalna amplituda krawędzi wynosi 255, prosta implementacja, wrażliwy na szum), operator Sobela (maksymalna amplituda wynosi 2040, prosta implementacja, dobre wyniki), operator Prewitta (maksymalna amplituda wynosi 1020, prosta implementacja, wyniki prawie tak dobre jak dla operatora Sobela ). Maski dla operatora różnic centralnych: [ 1,0,1], [ 1 0 1 ] (3.13) 9

Maski dla operatora Sobela: [ 1 0 1 2 0 2 1] [ 1 2 1, 0 0 0 1 0 1 2 1 ] (3.14) Maski dla operatora Prewitta: [ 1 0 1 1 0 2 1] [ 1 1 1, 0 0 0 1 0 1 2 1 ] (3.15) Operator Laplace'a (aproksymacja drugiej pochodnej) Dla 2-wymiarowej funkcji ciągłej operator Laplace'a definiujemy jako: 2 f x, y = 2 f x 2 2 f y 2 = f xx f yy. (3.16) Dla funkcji dyskretnej aproksymujemy ten operator, wprowadzając: i f i, j = f i 1, j f i, j, i f i, j = f i, j f i 1, j, (3.17) co daje aproksymację: 2 f i, j = i i f i, j j j f i, j =4f i, j f i 1, j f i 1, j f i, j 1 f i, j 1 (3.18) Operator Laplace'a (laplasjan) może być efektywnie realizowany w postaci splotu z pojedynczą maską: [ 0 1 0 1 4 1 ] [ 1 1 1, 1 8 1 0 1 0 1 1 1] [ 1 2 1 ], 2 4 2. (3.19) 1 2 1 Operator Laplace'a daje wynik zero zarówno dla obszaru jednorodnego (stała wartość jasności), jak i dla ekstremów gradientowych. Z powodu tej niejednoznaczności operator Laplace'a nie jest stosowany samodzielnie lecz w kombinacji z innymi operatorami. Metody łączenia operatorów dla detekcji obrazu krawędziowego Kombinacja dwóch lub więcej operatorów krawędziowych może mieć na celu uzyskanie bardziej niezawodnego wyniku, na przykład: Określamy obraz krawędziowy metodą operatora Sobela: 10

' s ik = f 2 2 x f y (3.20) ' i drugi obraz metodą operatora Laplace'a, biorąc: s ' jk = s jk. Określamy wynikowy obraz krawędziowy w oparciu o oba obrazy pomocnicze: h jk ={ 1, jeśli s ' jk ' ' i s ' jk ' ', 0, w przeciwnym razie. (3.21) Kombinacja metod może również mieć na celu obniżenie nakładu obliczeniowego. Wtedy należy postępować następująco: Zastosuj prosty operator krawędziowy do całego obrazu, Wybierz punkty krawędziowe o wystarczająco dużej amplitudzie, Zastosuj bardziej złożony i niezawodny operator krawędziowy tylko dla wybranych uprzednio punktów. 3.3 Wnioski Przyjęto założenie, że projektowana aplikacja powinna umożliwiać detekcję i lokalizację obiektu w czasie rzeczywistym. To spowodowało taki wybór algorytmów i odpowiednich etapów przetwarzania obrazu, aby przy niskiej złożoności obliczeniowej otrzymywać wystarczająco dobre wyniki. Było to istotnym kryterium doboru algorytmów. Wyniki działania powyższych metod do detekcji krawędzi nie przyniosły dobrych rezultatów. Krawędzie otrzymane w obrazie były poszarpane oraz grube. Wymagały one dodatkowych operacji pocieniania oraz uzupełnienia przerw w łańcuchach. Dużym problemem dla metod gradientowych jest detekcja krawędzi w obszarach o małej różnicy w jasności pikseli. Uniemożliwiało to detekcję krawędzi kafelków o ciemnych kolorach na kostce Rubika. Ostatecznie informacją, która posłużyła do detekcji krawędzi jest kolor. W punkcie 5.3 został omówiony algorytm do detekcji obrazu krawędziowego, który został użyty w pracy. Krawędzie otrzymane za pomocą powyższego algorytmu są ciągłe i o szerokości jednego piksela. Przyczyniło się to do znacznego uproszczenia i przyspieszenia algorytmów do wyznaczania konturów w obrazie. 11

4 Projekt systemu 4.1 Wymagania wobec systemu 4.1.1 Wymagania funkcjonalne Główną funkcją projektowanego systemu powinno być rozpoznanie obiektu i śledzenie zmian jego położenia w obrazie. Na ten proces składa się szereg funkcji: Detekcja barw Detekcja krawędzi Wyznaczanie konturów Rozpoznawanie obiektu i jego śledzenie Wymienione wyżej funkcje składają się z szeregu operacji: Detekcja barw składa się z : Wczytanie danych z kamery Przekształcenie przestrzeni RGB na przestrzeń YUV Rozpoznanie kolorów na podstawie YUV Detekcja krawędzi: Zastosowanie operacji erozji i dylatacji w celu redukcji szumu Wyznaczanie krawędzi na podstawie informacji o kolorze Wyznaczanie konturów: Skanowanie obrazu w celu poszukiwania pikseli krawędziowych Śledzenie łańcuchów krawędzi Aproksymacja łańcucha krawędzi liniami prostymi Obliczanie momentów geometrycznych Wyznaczanie punktów charakterystycznych wierzchołków danego konturu 12

Rozpoznanie obiektu i jego śledzenie: Wyznaczenie wzorców elementarnych w obrazie krawędziowym Znalezienie rozwiązania dla modeli obiektów wśród wzorców elementarnych Śledzenie zmian położenia obiektu Dodatkowo system umożliwia użytkownikowi: Podgląd wyników działania poszczególnych etapów Zmiana ustawień dotyczących zakresów kolorów Zapis wyników działania do plików graficznych Wyłączenie śledzenia obiektów 4.1.2 Wymagania niefunkcjonalne Aplikacja jest przeznaczona do uruchamiania na pojedynczym komputerze. Wyniki działania aplikacji są przedstawiane na ekranie monitora. Dodatkowo są wyznaczone dane, które zostaną przekazane dla systemu MROC++, którego główne działanie opiera się na sterowaniu manipulatorem robota. Komunikacja odbywać się będzie poprzez interfejs sieciowy. Umożliwi to uruchomienie aplikacji oraz systemu MROC++ na różnych komputerach. Rozwiązanie takie znacznie wpłynie na wydajność systemu. Maszyna, która będzie odpowiedzialna za sterowanie nie będzie musiała wykonywać obliczeń związanych z przetwarzaniem danych. Do tego celu zostanie użyty komputer o większej mocy obliczeniowej. Innym rozwiązaniem jest użycie jednego komputera o kilku rdzeniach. 4.2 Struktura rozwiązania Aplikacja jest podzielona na dwa główne etapy. Pierwszym etapem jest przetwarzanie obrazu do momentu rozpoznania obiektu. Natomiast w etapie drugim zostanie rozpoznany obiekt, nastąpi jego śledzenie, oraz zostanie przeprowadzona wizualizacja wyników. Obraz otrzymywany jest z kamery za pomocą specjalnej karty do przechwytywania video (frame grabber). Poszczególne ramki obrazu są przekazywane do modułu przetwarzania danych, w którym odbywają się kolejne etapy analizy obrazu (rysunek 4.2). Wynikiem działania powyższego moduły są rozpoznane obiekty w obrazie. Informacje o rozpoznanych obiektach są przekazywane do modułu odpowiedzialnego za wizualizację. Wyniki działania aplikacji są prezentowane użytkownikowi na monitorze. Za pomocą interfejsu graficznego (Gui) można w łatwy sposób przeanalizować wyniki poszczególnych etapów analizy obrazu, 13

oraz dokonać zmian zakresów dla rozpoznawanych kolorów. Dodatkowo interfejs umożliwia wyłączenie mechanizmu śledzenia obiektów. Na rysunku 4.1 została przedstawiona struktura systemu. Gui Monitor Moduł przetwarzania danych Wynik Wizualizacja MROC++ Dane Kamera System operacyjny Rysunek 4.1: Struktura systemu 14

Na rysunku 4.2 została zamieszczona struktura potoku analizy obrazu. Dane wejściowe- obraz Wczytywanie danych z kamery oraz zamiana ich na przestrzeń barw YUV, segmentacja kolorowa Obraz z kolorowymi obszarami jednorodnymi Filtracja polegająca na zastosowaniu erozji i dylatacji Obraz ze zredukowanym szumem oraz z wygładzonymi krawędziami Detekcja krawędzi oraz śledzenie konturów Tablica zawierająca punkty krawędziowe dla konturów Wyznaczony obszar poszukiwań obiektu Rozpoznawanie obiektu Obiekt rozpoznany Tak Nie Śledzenie obiektu Przedstawienie wyników działania aplikacji na ekranie Rysunek 4.2: Struktura potoku analizy obrazu 15

4.3 Technologie rozwiązania Detekcja i lokalizacja przedmiotów w obrazie cyfrowym wiąże się z dużym nakładem obliczeniowym. Zadaniem aplikacji stworzonej na potrzeby pracy jest przetwarzanie obrazu w czasie rzeczywistym. Przyjmujemy tu wymagania dla systemu PAL (25 klatek na sekundę), co oznacza, że przetwarzanie jednej ramki obrazu powinno zająć mniej niż 40 ms. Czas przeznaczony na obliczenia jest bardzo krótki, dlatego algorytmy są dobierane w taki sposób, aby dawały dobre wyniki przy niskim koszcie obliczeniowym. Implementacja systemu wykonana jest w języku C++, który ze względu na wysoką efektywność generowanego kodu wynikowego idealnie się do tego celu nadaje. Obecnie osiągnięto kres szybkość taktowania procesorów, która dla obecnej technologii wynosi około 3,4 Ghz. Alternatywą jest budowanie procesorów składających się z wielu rdzeni. Rozwiązanie wielowątkowe może znacznie poprawić wydajność aplikacji, ponieważ zostaje ona podzielona na wątki, które będą się wykonywały równolegle na różnych rdzeniach. Obecne możliwości techniczne pod warunkiem efektywnego zakodowania odpowiednio dobranych algorytmów pozwalają na zbudowanie aplikacji do rozpoznawania i lokalizacji przedmiotów działającej w czasie rzeczywistym. 16

5 Analiza kolorowa obrazu Pierwszym etapem jaki należy przeprowadzić jest segmentacja kolorowa dla obiektu trzymanego w dłoni. Sposób wyznaczania kolorów został omówiony w rozdziale 5.1. W Kolejnych etapach jest detekcja krawędzi oraz wyznaczanie konturów, które zostały omówione w rozdziałach 5.3 i 5.4. 5.1 Segmentacja kolorowa Wybór przestrzeni barw był jednym z kluczowych etapów analizy pracy. Dla reprezentacji obrazów cyfrowych i telewizji cyfrowej typowo stosowanym modelem jest YUV (lub zbliżony do niego YC b C b ) [1]. W tym przypadku U (lub C b ) i V (lub C r ) są to miary odległości koloru szarego od koloru niebieskiego względem czerwonego. Wykorzystano tu szczególną właściwość ludzkiego oka na zielone światło. Większość informacji o składowej zielonej zawarta jest w jasności Y, a poza nią, dla zapewnienia pełnego koloru, wystarczy jeszcze reprezentować odległości od szarości w kierunku niebieskim i czerwonym. Zaletą powyższych modeli jest liniowa zależność od modelu RGB, co oznacza szybką i efektywną transformację pomiędzy tymi modelami. Zależność pomiędzy YUV a RGB jest zadana wzorem: [ Y U V ] = [ 0.2989 0.5866 0.1145 0.1473 0.2891 0.4364 0.6150 0.5145 0.1005][ R B] G (5.1) Na rysunku 5.1 została przedstawiona przestrzeń YUV dla luminacji Y =128 : Rysunek 5.1: Przestrzeń YUV dla luminancji Y=128 [8] 17

W tej przestrzeni kolor biały oraz czarny leżą w centrum osi współrzędnych. Można je odróżnić od siebie za pomocą jasności Y. Przestrzeń ta jest odpowiednia do ustawiania balansu bieli, gdyż dobrze skalibrowana kamera prowadzi do reprezentacji bieli w centrum przestrzeni. Podobnie jest dla koloru czarnego. Poniżej został zamieszczony przykład zamiany RGB na YUV. Na rysunku 5.2 znajduje się oryginalny obraz z kamery, rysunki 5.3-5.5 zawierają odpowiednie składowe. Rysunek 5.2: Obraz RGB Rysunek 5.3: Składowa Y Rysunek 5.4: Składowa U Rysunek 5.5: Składowa V Kolejnym krokiem w segmentacji w oparciu o barwę może być ujednolicenie kolorów drogą uniezależnienia od jasności. W tym celu zastosowana została normalizacja składowych U i V względem jasności Y. 18

Poniższe wzory przedstawiają w jaki sposób zostało to dokonane: Y =0.2989R 0.5866G 0.1145B U ' =U 128/Y V ' =V 128/Y. (5.2) Uzasadnienie tego kroku ma charakter eksperymentalny [1]. Stosując takie przekształcenie należy uważać, aby jasność danego piksela była większa od zera, ponieważ dla pikseli o jasności zero nie jest możliwe rozpoznanie barwy. Rysunki 5.6 i 5.7 przedstawiają histogramy dla U i V przed normalizacją. Rysunek 5.6: Histogram dla składowej U Rysunek 5.7: Histogram dla składowej V Dla obu tych histogramów przeważają piki dla wartości 128. Są to piksele należące do tła, które jak widać na zdjęciach ma kolor czarny. Inne maksima dla pozostałych kolorów są znacznie przygaszone, gdyż nieliniowe zależności od jasności prowadzą do rozmycia koloru. Dlatego, aby częściowo zniwelować to rozmycie i uzyskać większe wartości maksimów histogramu stosujemy normalizację względem jasności. Na rysunkach 5.8 i 5.9 przedstawione są obrazy po normalizacji a na rysunkach 5.10 i 5.11 ich histogramy. 19

Rysunek 5.8: Obraz dla składowej U po normalizacji względem Y = 128 Rysunek 5.9: Obraz dla składowej V po normalizacji względem Y = 128 Rysunek 5.10: Histogram dla składowej U po normalizacji względem Y = 128 Rysunek 5.11: Histogram dla składowej V po normalizacji względem Y = 128 Po normalizacji widać, że piki, które miały małą wartość zostały wzmocnione. Oznacza to, że barwy na powierzchni kostki zostały bardziej ujednolicone, a przedziały, do których poszczególne kolory należą, zostały zmniejszone. Jednak dla dużego obszaru ciężko jest wyznaczyć przedziały na histogramie dla kolorów kostki. Dlatego w pracy nie stosuję analizy histogramów, lecz ustalone sztywno progi. Taka analiza nie zależy od koloru otoczenia, ani od wielkości obrazu. Na podstawie obrazów pochodzących ze skalibrowanej kamery dla poszczególnych zakresów zostały wyznaczone następujące przedziały (tabela 5.1): 20

Kolor Składowa Y Składowa U Składowa V Czerwony 50-140 70-150 160-255 Pomarańczowy 140-210 50-150 160-255 Niebieski 70-240 140-255 1-110 Zielony 70-240 1-140 1-115 Biały 190-255 115-140 115-135 Żółty 118-150 60-115 120-165 Ręka 105-220 95-130 130-170 Tabela 5.1: Przedziały dla poszczególnych kolorów w przestrzeni YUV przyjęte w niniejszej pracy. Kolory, których wartości nie pokrywają się z wyznaczonymi wyżej zakresami przyjmują barwę czarną. Poniżej w tabeli 5.2 przedstawione są reprezentacje bitowe poszczególnych kolorów. Wartości bitowe są tak dobrane, żeby każdy kolor reprezentowany był różnym bitem. Taka nadmiarowa reprezentacja znacznie przyspieszyła działanie algorytmów, które polegają na porównywaniu wartości poszczególnych pikseli. Dzięki temu rozwiązaniu zostały też zoptymalizowane algorytmy do redukcji szumu oraz do wyznaczania krawędzi. Kolor Czarny 00000001 Czerwony 00000010 Pomarańczowy 00000100 Niebieski 00001000 Zielony 00010000 Biały 00100000 Żółty 01000000 Ręka 10000000 Reprezentacja bitowa Tabela 5.2: Reprezentacje bitowe poszczególnych kolorów. Do dalszego przetwarzania wyznaczone zostały dwa obrazy. Pierwszy zawiera obszar zajmowany przez dłoń, natomiast drugi powstał przez odjęcie obszaru dłoni od obrazu oryginalnego. Poniżej na rysunku 5.12 został zamieszczony obraz oryginalny otrzymany w laboratorium z kamery, obraz 5.13 przedstawia wyznaczony kolor dla skóry ludzkiej, a na obrazie 5.14 wyznaczone zostały kolory dla samego obiektu, na podstawie zakresów z tabeli 5.1. 21

Rysunek 5.12: Obraz oryginalny z kamery Rysunek 5.13: Obraz z wyznaczonym kolorem dla skóry ludzkiej Rysunek 5.14: Obraz z wyznaczonymi kolorami dla obiektu 22

Przy prawidłowo dobranych zakresach możliwe jest usunięcie koloru należącego do skóry ludzkiej. W wyniku tej operacji w obrazie pozostaje obiekt wraz z delikatnym zarysem konturu dłoni. Dłoń zostanie całkowicie usunięta w dalszych etapach dzięki zastosowaniu morfologicznych operatorów erozji i dylatacji. Pozostaną jedynie krawędzie należące do obiektu trzymanego w dłoni. 5.2 Redukcja szumu w obrazie Jednym z niepożądanych zjawisk występujących w obrazie jest szum. W celu jego usunięcia zostały zastosowane filtry realizujące operacje erozji i dylatacji. Działanie tych filtrów i ich implementacja są bardzo proste. Ich działanie polega na sprawdzaniu lokalnego sąsiedztwa i odpowiednim ustawieniu wartości centralnego piksela. W celu zwiększenia wydajności działania algorytmów erozji i dylatacji w implementacji zostały zastosowane operacje bitowe. Podany wzór zawiera macierz zgodnie, z którą sprawdzane jest sąsiedztwo: A=[ a b c d P e f g h]. (5.3) Erozja Dla centralnego piksela P, którego wartość jest większa od zera sprawdzane jest lokalne sąsiedztwo. Za sąsiadów uznawane są te piksele, które w obrębie danej maski mają niezerowe wartości. Gdy dany piksel ma ośmiu niezerowych sąsiadów, jest pozostawiany w obrazie wynikowym, w przeciwnym przypadku jest zerowany. Jako rezultat działania filtra erozji otrzymujemy obraz, w którym został zredukowany szum oraz część użytecznej informacji. Aby przywrócić ewentualnie utracone dane stosuje się dylatację. W celu usprawnienia algorytmu zostały wykorzystane bitowe operatory sumy i iloczynu. Warunkiem wykonania sprawdzania sąsiedztwa danego piksela centralnego P jest jego wartość różna od koloru czarnego. Można to sprawdzić za pomocą wyrażenia :! pixelvalue &0x0001. (5.4) Tylko kolor czarny ma jedynkę na ostatniej pozycji (tabela 5.2), więc wykorzystując podaną maskę można w szybki sposób sprawdzić wartość danego piksela. Warunkiem na to aby piksel centralny był zerowany, jest wystąpienie chociaż jednego sąsiada będącego koloru czarnego. W celu sprawdzenia sąsiedztwa piksela centralnego należy wykonać operacje: a b c d e f g h &0x0001. (5.5) Teraz wystarczy jedynie sprawdzić, czy na pozycji najmniej znaczącej jest jedynka. 23

Jeżeli tak, to oznacza, że wśród sąsiadów był co najmniej jeden piksel czarny. Wykonanie ośmiu operacji sumy oraz jednego iloczynu bitowego jest znacznie mniej kosztowne niż sprawdzenie ośmiu warunków, co miało miejsce w poprzedniej wersji algorytmu. Miało to ogromny wpływ na szybkość obliczeń, ponieważ czas zmniejszył się z 50 ms do około 5 ms dla całego obrazu w rozdzielczości 768x576. Obliczenia wykonywane były na procesorze Intel Core 2 Duo E8400 3.0 Ghz. Dylatacja Warunek startu sprawdzania lokalnego sąsiedztwa jest taki sam jak w przypadku erozji. Różnica polega na tym, że miejsca, w których brakuje sąsiadów, są uzupełniane wartością piksela centralnego. W rezultacie otrzymujemy obraz ze zredukowanym szumem, a reszta danych, która jest ważna została przywrócona do początkowego stanu. Poniżej zostały zamieszczone kolejne etapy redukcji szumu. Rysunek 5.15 zawiera obraz zawierający szum w postaci małych grup zielonych pikseli, rysunek 5.16 przedstawia rezultat działania filtra erozji, natomiast rysunek 5.17 jest wynikiem działania filtra dylatacji. Rysunek 5.15: Obraz zawierający szum w postaci małych grup zielonych pikseli Rysunek 5.16: Wynik działania erozji Rysunek 5.17: Wynik działania dylatacji 24

5.3 Tworzenie obrazu krawędziowego Wybór sposobu wyznaczania krawędzi był oparty na wielu analizach zdjęć. Okazało się, że informacją, która posłużyła do ich wyznaczenia, jest kolor. Całkowicie zawiodły metody gradientowe, w których detekcja krawędzi oparta jest na różnicach jasności pikseli. Działanie i implementacja algorytmu jest bardzo prosta. Metoda ta opiera się na sprawdzaniu lokalnego sąsiedztwa według podanej maski: [ X a X ] b P c. (5.6) X d X Gdy kolor piksela centralnego P jest inny niż kolor czarny, wtedy sprawdzane jest dla niego sąsiedztwo. Gdy ma czterech niezerowych sąsiadów, wtedy taki piksel jest kasowany, w przeciwnym wypadku jest oznaczony jako piksel krawędziowy. Podobnie jak w przypadku erozji i dylatacji zastosowane zostały tutaj operacje bitowe sumy oraz iloczynu. Warunek sprawdzenia czy piksel centralny P jest koloru czarnego:! P &0x0001. (5.7) operację: W celu sprawdzenia czy dany piksel centralny P leży na krawędzi, należy wykonać a b c d & 0x0001. (5.8) Poniżej przedstawiono wyniki działania algorytmu do detekcji krawędzi. Rysunek 5.18 zawiera obraz po dopasowaniu kolorów przez algorytm opisany w punkcie 5.1. Na rysunku 5.19 jest przedstawiony wynik działania algorytmu do detekcji krawędzi. Rysunek 5.18: Obraz z wyznaczonymi kolorami. Rysunek 5.19: Wynik działania algorytmu do detekcji krawędzi. Jak widać algorytm ten daje bardzo dobre wyniki. Złożoność obliczeniowa jest mniejsza niż dla operatorów gradientowych. Otrzymane krawędzie są ciągłe i o szerokości jednego piksela, dlatego nie jest konieczne pocienianie krawędzi. 25

5.4 Wyznaczanie konturów obiektów w obrazie Warunkiem do prawidłowego działania algorytmu jest to, aby łańcuchy krawędziowe były ciągłe i nieposzarpane. Algorytm zbudowany jest z dwóch części. Pierwsza część jest odpowiedzialna za sprawdzenie każdego piksela krawędziowego w obrazie. Zadanie to jest realizowane za pomocą funkcji FindContour, której definicja jest przedstawiona w tabeli 5.3. Gdy dana funkcja natrafi na piksel krawędziowy, algorytm przechodzi do części drugiej. Druga część odpowiedzialna jest za śledzenie łańcucha konturowego, którego punkt startowy był określony w części pierwszej. Szukanie kolejnych pikseli w łańcuchu krawędziowym odbywa się zgodnie z ruchem wskazówek zegara za pomocą maski: [ 3 2 1 7] 4 P 0. (5.9) 5 6 Numer piksela, od którego zaczynamy przeszukiwanie sąsiedztwa wyznaczamy za pomocą równania: S=K 3%8 (5.10) S oznacza numer piksela, od którego rozpoczęte będzie poszukiwanie kolejnego piksela krawędziowego. K kierunek, w którym został znaleziony piksel centralny P w poprzednim kroku. Punkty, które należą do danego łańcucha są przechowywane w tablicy. Gdy algorytm ten dojdzie do punktu startowego, wtedy taki kontur jest oznaczany jako zamknięty, w przeciwnym wypadku jest to kontur otwarty. Odpowiedzialna ze realizację drugiej części jest funkcja Tracer(int y, int x), która została przedstawiona w tabeli 5.4. Jako argumenty przyjmuje ona współrzędne piksela centralnego. FindContour( Image src) FOR Dla każdego nie wizytowanego piksela w obrazie, wywołaj funkcję Tracer Wywołaj funkcje Tracer i ustaw status piksela na wizytowany IF znaleziono łańcuch zamknięty THEN Dodanie go do listy ContourList ELSE Pobranie kolejnego punktu startowego UNTIL Sprawdzono wszystkie piksele w obrazie Tabela 5.3: Definicja funkcji FindContour 26

Tracer(int y, int x) DO Szukaj sąsiada IF THEN Jeżeli zostanie znaleziony sąsiad S Sprawdź status IF THEN ELSE IF THEN Nie wizytowany Ustaw status S na wizytowany i dodaj do listy Wizytowany UNTIL Brak sąsiada Tabela 5.4: Definicja funkcji Tracer Czy jest to punkt startowy, jeśli tak to zaznacz, że jest to kontur zamknięty i zakończ działanie Na rysunkach 5.20 5.29 zostały przedstawione kolejne kroki działania algorytmu. Rysunek 5.20: Punkt startowy, czarne strzałki pokazują w jakich kierunkach jest skanowany cały obraz przez funkcje FindContour. Niebieskie strzałki pokazują sposób poszukiwania Rysunek 5.21: Krok pierwszy funkcji Tracer Rysunek 5.22: Krok drugi Rysunek 5.23: Krok trzeci 27

Rysunek 5.24: Krok czwarty Rysunek 5.25: Krok piąty Rysunek 5.26: Krok szósty Rysunek 5.27: Krok siódmy Rysunek 5.28: Krok ósmy Rysunek 5.29: Stan końcowy działania algorytmu Na rysunku 5.20 pokazany jest warunek startu, którym jest znalezienie niezerowego piksela P poprzedzonego zerowym sąsiadem w kierunku czwartym (5.9). Dla tak znalezionego piksela na rysunkach 5.21-5.29 pokazane są kolejne wywołania funkcji Tracer(). Kolorem różowym są zaznaczone piksele, które nie były jeszcze sprawdzane. Warunkiem stopu jest osiągnięcie punktu początkowego lub koniec łańcucha konturowego. 28

6 Rozpoznanie obiektu Do rozpoznawania obiektów zostały wykorzystane wzorce elementarne: linia prosta, łuk, okrąg, elipsa oraz kafelki na kostce Rubika. W celu rozpoznania obiektu budowany jest graf połączeń dla znalezionych wzorców w obrazie. W pracy rozpoznawanymi obiektami są: kostka Rubika, pudełko oraz kubek. 6.1 Wyznaczanie prymitywów w obrazie Rozpoznawanie obiektów jest procesem dość skomplikowanym i złożonym. W celu jego przyspieszenia łańcuchy krawędzi zostały aproksymowane liniami prostymi. Punkty łączące te linie określone są mianem punktów charakterystycznych. Reszta operacji potrzebnych do rozpoznania obiektów będzie się opierać o te punkty. Ze względu na małe wymiary kafelków na kostce Rubika aproksymacja konturów segmentami linii prostych nie przyniosła zadowalających rezultatów, dlatego ich detekcja odbywa się w oparciu o obliczanie momentów geometrycznych. Obliczanie momentów geometrycznych Momenty geometryczne służą do wyszukiwania w obrazie obiektów o określonym kształcie. Ich właściwości pozwalają na dokładne określenie szukanego kształtu, bez względu na jego rozmiar, położenie, obrót czy translację. Dwumiarowy moment rzędu (p+q) obliczany dla funkcji f(x,y) jest definiowany jako: m pq = x p y q f x, y dxdy. (6.1) Moment centralny f(x,y) jest definiowany jako: M pq = x x 0 p y y 0 q f x, y dxdy (6.2) gdzie: x 0 =m 10 / m 00 i y 0 =m 01 / m 00 Dla obrazu cyfrowego podwójne całki można aproksymować sumami. Dla kwadratowej matrycy o rozmiarach [n x n] składającej się z punktów x ij otrzymujemy: n n m pq = i p j q x ij. (6.3) i=1 j=1 29

Środek ciężkości: i o =m 10 / m 00, j o =m 01 /m 00 (6.4) Momenty centralne można przedstawić za pomocą momentów zwykłych : M 00 =m 00 (6.5) M 01 =m 01 m 01 /m 00 m 00 (6.6) M 10 =m 10 m 10 /m 00 m 00 (6.7) M 11 =m 11 m 10 m 01 / m 00 (6.8) M 20 =m 20 m 2 10 /m 00 (6.9) M 02 =m 02 m 2 01 /m 00 (6.10) M 21 =m 21 2m 11 i 0 m 20 j 0 2m 01 i 0 2 M 12 =m 12 2m 11 j 0 m 02 i 0 2m 10 j 0 2 M 30 =m 30 3m 20 i 0 2m 10 i 0 2 M 03 =m 03 3m 02 j 0 2m 01 j 0 2 (6.11) (6.12) (6.13) (6.14) Niezmienniki momentowe : 2 M1= M 20 M 02 /m 00 M2= { M 20 M 02 2 4M 2 4 11 }/m 00 M3={ M 30 3M 12 2 3M 21 M 03 2 5 }/m 00 (6.15) (6.16) (6.17) M4= { M 30 M 12 2 M 21 M 03 2 5 }/m 00 (6.18) M5 = { M 30 3M 12 M 30 M 12 [ M 30 M 12 2 3 M 21 M 03 2 ] + 3M 21 M 03 M 21 M 03 [3 M 30 M 12 2 M 21 M 03 2 ] }/m (6.19) 10 00 M6 ={ M 20 M 02 [ M 30 M 12 2 M 21 M 03 2 ] (6.20) 7 + 4M 11 M 30 M 12 M 21 M 03 }/m 00 M7= M 20 M 02 M 2 4 11 /m 00 M8= M 30 M 12 M 21 M 03 M 2 12 M 2 5 21 /m 00 (6.21) (6.22) M9= {M 20 M 21 M 03 M 2 12 M 02 M 03 M 12 M 2 7 21 M 11 M 30 M 03 M 12 M 21 }/m 0 (6.23) M10= { M 30 M 03 M 12 M 21 2 4 M 30 M 12 M 2 10 21 M 03 M 21 M 12 }/m 00 (6.24) Na podstawie powyższych wzorów dokonywane są obliczenia dla punktów konturowych. W celu określenia momentów dla poszukiwanych kafelków obliczenia były przeprowadzone na kilkudziesięciu obrazach zawierających różne rzuty kostki. Obliczenia 30

zostały również przeprowadzone dla obrazów zawierających różne figury. Na podstawie zebranych danych okazało się, że do wyznaczenia kafelków na kostce dobrze nadają się momenty: M1 >= 1.0 M2 <= 2.5 M3 <= 0.5 M7 >= 0.1 Wśród pozostawionych konturów istnieje możliwość, że znajdują się takie, które nie są kafelkami na kostce. Dzieje się tak dlatego, że momenty były liczone też dla kafelków widzianych pod różnymi kątami w stosunku do kamery. Kształt ich nie przypominał wtedy kwadratów, lecz ich rzuty perspektywiczne. Dlatego niektóre kontury mogą mieć momenty mieszczące się w podanych zakresach, ale ich kształt jest całkiem odmienny od kafelków na kostce. W celu ostatecznej weryfikacji wyznaczonych konturów został użyty współczynnik kształtu Malinowskiej, który jest określony następującym wzorem: L długość konturu S pole konturu W = L 2 S 1. (6.25) Pole konturu jest obliczane jako pole czworokąta wpisanego w dany kontur. Natomiast długość jest taka, jaką rzeczywiście ma obiekt w obrazie. Na podstawie analizy wielu obrazów, na których widoczna była jedna lub więcej ściana kostki, okazało się że współczynnik dla kafelków przyjmuje wartości mniejsze niż 0.4 i większe od zera. Dzięki tym obliczeniom ostatecznie można wyznaczyć kontury, które są kafelkami na kostce. Kontury, które nie spełniają powyższych warunków, są aproksymowane segmentami linii prostych. Dla konturów, które zostały zaklasyfikowane jako kafelki na kostce wyznaczane są wierzchołki oraz proste, które je łączą. Problem ten jest prosty, ponieważ dotyczy konturów, które są czworokątami. Algorytm dzieli się na dwa etapy, przy czym każdy z etapów zawiera cztery kroki. W pierwszym są poszukiwane wierzchołki konturu, natomiast w drugim są wyznaczane równania prostych przez nie przechodzących. Detekcja wierzchołków: Podczas obliczania momentów geometrycznych zostały wyznaczone środki konturów (6.4). Na tej podstawie w pierwszym kroku jest poszukiwany punkt konturowy, który jest najbardziej oddalony od środka. Do tego celu został wykorzystany wzór na odległość dwóch punktów na płaszczyźnie : x j x k 2 y j y k 2 (6.26) 31

W kroku drugim szukamy najbardziej oddalonego punktu od poprzednio znalezionego. Będzie nim punkt znajdujący się po przeciwnej stronie. Dla takich punktów wyznaczane jest równanie prostej przez nie przechodzącej. Równanie prostej przechodzącej przez dwa punkty x j, y j, x k, y k : x y i y k y x k x j = y j x k x j x j y k y j (6.27) ax by=c,a 2 b 2 0 (6.28) W korku trzecim i czwartym szukane są najbardziej oddalone punkty od prostej, która została wyznaczona w kroku drugim. W tym celu przeszukiwane są łańcuchy konturowe znajdujące się nad prostą i pod nią. W rezultacie otrzymujemy pozostałe dwa wierzchołki. Odległość s i punktu x i, y i od prostej: s i = ax i by i c a 2 b 2. (6.29) Na rysunkach 6.1 6.3 zostały przedstawione kolejne kroki algorytmu. Rysunek 6.1: Krok pierwszy Rysunek 6.2: Krok drugi Rysunek 6.3: Krok trzeci i czwarty Na podstawie znalezionych wierzchołków w etapie drugim wyznaczane są równania czterech łączących je prostych. Operacja ta jest powtarzana dla każdego konturu. Rezultaty tak otrzymanych krawędzi w dużym stopniu pokrywają się z obrazem rzeczywistym. Na rysunku 6.4 przedstawiony jest obraz z wyznaczonymi wierzchołkami, na rysunku 6.5 przedstawiony jest obraz zawierający wyznaczone proste, które tworzą krawędzie kafelków. 32

Rysunek 6.4: Obraz z wyznaczonymi wierzchołkami konturów Rysunek 6.5: Obraz zbudowanych kafelków na kostce Aproksymacja krawędzi segmentami linii prostych Działanie algorytmu jest bardzo proste, a jego budowa oparta jest o rekurencyjną funkcję splitchain() (tabela 6.1). Argumentami funkcji są punkty startowy oraz końcowy podziału łańcucha krawędziowego. W każdym wywołaniu funkcji splitchain() szukany jest najbardziej oddalony punkt krawędziowy od prostej przechodzącej przez punkty podziału. Jeżeli odległość jest większa niż zadane minimum, wtedy dla łańcucha krawędziowego przeprowadzany jest nowy podział w miejscu znalezionego punktu. Dla nowo powstałych odcinków przeprowadzane są wywołania funkcji splitchain(). W przeciwnym wypadku funkcja kończy działanie dla tego odcinka łańcucha krawędziowego. Warunkiem stopu wykonywania się algorytmu jest to, żeby maksymalne odległości pikseli krawędziowych do wyznaczonych prostych były mniejsze niż podane kryterium podziału. SplitChain(a,b) W tabeli 6.1 została przedstawiona rekurencyjna definicja funkcji splitchain(). Zbuduj prostą k o początku w punkcie a i końcu w punkcie b. Znajdź największa odległość punktu c krawędziowego pomiędzy punktami a i b od prostej k IF THEN Odległość jest większa niż podane minimum podziału Dodaj prosta k do zbioru segmentów liniowych, podziel łańcuch ab na ac i cb Wywołaj SplitChain(a,c) Wywołaj SplitChain(c,b) ELSE Zakończ działanie Tabela 6.1: Rekurencyjna definicja funkcji SplitChain() 33

Na rysunku 6.6-6.9 przedstawione są kolejne kroki działania algorytmu do aproksymacji krawędzi liniami prostymi. Kolorem niebieskim została zaznaczona prosta, łącząca początek i koniec łańcucha, kolorem zielonym zaznaczona jest największa odległość od wyznaczonej prostej do pikseli krawędziowych znajdujących się pomiędzy początkowym i końcowym punktem podziału. Rysunek 6.6: Łańcuch krawędziowy Rysunek 6.7: Pierwsze wywołanie funkcji spitchain() Rysunek 6.8: Wywołanie rekurencyjne funkcji splitchain(), dla nowych punktów podziału Rysunek 6.9: Koniec działania funkcji splitchain() Detekcja łuków, elips oraz okręgów Operacja ta jest przeprowadzana w oparciu o wyznaczone wcześniej segmenty linii prostych. Działanie algorytmu składa się z czterech etapów: Znalezienie par segmentów liniowych, które tworzą łuki Dodanie pozostałych segmentów liniowych do znalezionych łuków Łączenie ze sobą łuków Sprawdzanie kształtów połączonych łuków 34

Znalezienie par segmentów liniowych, które tworzą łuki Wśród znalezionych segmentów liniowych wybierane są segmenty liniowe, z których po połączeniu można otrzymać łuk. Wynikiem działania pierwszego etapu są łuki zawierające po dwa połączone segmenty liniowe. W tabeli 6.2 został przedstawiony zapis działania algorytmu. FOR IF THEN UNTIL Dla każdego segmentu liniowego s1 znalezionego w obrazie Znajdź sąsiedni segment liniowy s2 połączony z s1 Wyznacz punkty skrajne połączonych segmentów i oznacz je jako A i B, zbuduj prosta k przechodząca przez te punkty Wyznacz prosta l prostopadłą do prostej k i przechodzącą przez środek odcinka AB Znajdź punkt przecięcia prostej l oraz łańcucha konturowego IF THEN Sprawdź czy kontur pomiędzy punktami A i B tworzy krzywiznę Dodaj nowy łuk i przypisz do niego segmenty liniowe s1 i s2 Usuń z listy segment s2 Sprawdzono wszystkie segmenty liniowe Tabela 6.2: Algorytm łączenia par segmentów liniowych w łuki Na rysunku 6.10 został przedstawiony pierwszy etap działania algorytmu do łączenia par segmentów liniowych w łuki. Rysunek 6.10: Pierwszy etap działania algorytmu Na rysunku 6.10 przedstawiony został pierwszy krok działania algorytmu. Dla dwóch sąsiednich segmentów liniowych wyznaczane są następujące parametry. Punkty A oraz B są skrajnymi punktami połączonych segmentów, punkt D jest punktem centralnym odcinka AB. Obliczany jest kąt nachylenia prostej k przechodzącej przez punkty A i B do osi współrzędnych OX. Prosta l jest prostopadła do prostej k i przechodzi przez punkt D. 35

Punkt C jest znajdowany na podstawie przecięcia prostej l oraz łańcucha konturowego. Kolejnym etapem jest weryfikacja, czy połączone segmenty liniowe tworzą krzywiznę. W tym celu powstała metoda Check(), która na podstawie wcześniej wyznaczonych parametrów sprawdza, czy można utworzyć łuk z połączenia segmentów linowych AC oraz CB. Powyższe parametry są wyznaczane dla wszystkich par połączonych segmentów liniowych. Rysunek 6.11: Sprawdzenie wszystkich par segmentów liniowych Rysunek 6.11 przedstawia w jaki sposób algorytm sprawdza kolejne segmenty liniowe. Kolejnymi segmentami liniowym, które zostaną sprawdzone są BJ oraz JF. Podobnie jak dla pierwszej pary segmentów liniowych AC i CB wyznaczane są skrajne punkty B i F, punkt G - środek odcinka BF oraz punkt J leżący na przecięciu się prostej n oraz łańcucha konturowego. W tym przypadku nie można aproksymować elipsą kontur BJF, więc segmenty liniowe BJ oraz JF nie zostaną połączone ze sobą. Ostatnią parą segmentów liniowych, które będą sprawdzane, są JF i FE. Postępując analogicznie jak w poprzednim przypadku sprawdzamy, czy kontur JFE można aproksymować elipsą. Do sprawdzania, czy można połączyć dwa segmenty liniowe w łuk wykorzystywana jest metoda Check(). Wynikiem działania powyższego algorytmu są znalezione łuki: ACB i JFE. Szczegółowy opis działania metody Check() Metoda działa w oparciu o wcześniej wyznaczone parametry: a - połowa dużej osi elipsy, odcinek AD b - połowa małej osi elipsy, odcinek CD - kąt nachylenia prostej k do osi OX zbiór segmentów liniowych należących do łuków AC oraz CB 36

Rysunek 6.12: Aproksymacja elipsy o parametrach a,b znajdującej się w I i II ćwiartce układu współrzędnych za pomocą prostych y= b a x a oraz y= b a x a W początkowej fazie metoda oblicza błąd aproksymacji średniokwadratowej funkcji g x przez f x. Funkcja g x opisuje elipsę o powyższych parametrach, natomiast funkcja f x jest prostą przechodząca przez punkty AC oraz CB. Aproksymacja dokonywana jest wyłącznie w dyskretnych punktach x i, i=0,1,2,...n z zakresu [ A; A]. Wyznaczamy błąd aproksymacji średniokwadratowej funkcji g x przez f x za pomocą wzoru: n S f,g = [ f x i g x i ] 2. (6.30) i=0 W kolejnym kroku należy przesunąć kontur ACB do początku układu współrzędnych. W tym celu został wyznaczony centralny punkt D odcinka AB z rysunku 6.11, przesunięcia dokonujemy za pomocą wzorów: x' =x x D, y'= y y D. Po przesunięciu do środka układu współrzędnych wzorzec zdefiniowany jest za pomocą współrzędnych x', y'. Otrzymujemy funkcję wzorca h x', y'. Następnie dokonujemy obrotu wzorca na oś OX o kąt za pomocą równań: x ' sin sin cos x y. (6.31) y' = cos Dla przekształconego wzorca h x', y' obliczamy błąd średniokwadratowy: n S 1 h,g = [ h x i g x i ] 2. (6.32) i=0 Jeżeli S 1 jest mniejsze niż S, to wtedy segmenty liniowe można zaklasyfikować jako łuk. 37

W tabeli 6.3 została przedstawiona definicja funkcji Check(a, b,, linesegments). Parametry, jakie są przekazywane do metody, zostały opisane powyżej. Check( a, b,, linesegments) Oblicz błąd S średniokwadratowy pomiędzy funkcją g x i f x DO UNTIL IF THEN Dla każdego punktu P konturowego znajdującego się w segmentach liniowych Przesuń P do początku układu współrzędnych względem punktu D i oznacz jako P ' Dokonaj rotacji P ' względem początku układu współrzędnych o kąt i oznacz jako P ' ' ' ' Zbiór punktów P i, i 0..n oznacz funkcją h x Oblicz błąd S 1 średniokwadratowy pomiędzy funkcją g x i h x Przekształcono wszystkie punkty konturowe należące do sprawdzanych segmentów liniowych S 1 < S Połącz segmenty liniowe w łuk UNTIL Sprawdzono wszystkie łuki Tabela 6.3: Definicja funkcji Check() Dodanie pozostałych segmentów liniowych do znalezionych łuków W wyniku działania pierwszego etapu są znalezione dwa łuki ACB i JFE oraz jeden segment liniowy BJ. W etapie drugim dla każdego łuku algorytm sprawdza, czy można dodać segmenty liniowe, które nie zostały dodane w etapie pierwszym. Działanie algorytmu jest analogiczne, jak w etapie pierwszym. Do sprawdzenia czy dany segment liniowy można dodać do łuku wykorzystywana jest metoda Check(). Wynikiem działania etapu drugiego są dwa łuki ACBJ oraz JFE. Na rysunku 6.13 przedstawiony został wynik drugiego etapu. Rysunek 6.13: Wynik działania algorytmu w etapie drugim 38

W tabeli 6.4 został przedstawiony algorytm łączenia pozostałych segmentów liniowych do znalezionych wcześniej łuków. FOR IF THEN Dla każdego łuku ł 1 znalezionego w pierwszym kroku Znajdź segment liniowy s 1 połączony z łukiem Wyznacz punkty skrajne łuku oraz segmentu liniowego i oznacz je jako A i B, zbuduj prosta k przechodząca przez te punkty Wyznacz prosta l prostopadłą do prostej k i przechodzącą przez środek odcinka AB Znajdź punkt przecięcia prostej l oraz łańcucha konturowego IF Sprawdź czy kontur pomiędzy punktami A i B tworzy krzywiznę THEN Dodaj do nowy łuk powstały z połączenia łuku ł 1 i segmentu s 1 Usuń z listy ł 1 oraz s 1 UNTIL Sprawdzono wszystkie łuki Tabela 6.4: Algorytm łączenia pozostałych segmentów liniowych do istniejących łuków Łączenie ze sobą łuków W etapie trzecim algorytm sprawdza czy sąsiednie łuki można ze sobą połączyć. Po każdym połączeniu dwóch łuków sprawdzane jest to czy tworzą zamknięty kontur, jeżeli tak to algorytm sprawdza czy można taki kontur aproksymować elipsą lub okręgiem. Na rysunku 6.13 zostały znalezione dwa łuki ACBJ oraz JFE. Ze względu na to, że po połączeniu nie można ich aproksymować elipsą, nie zostaną połączone w jeden łuk. W tabeli 6.5 został przedstawiony algorytm, który sprawdza czy można połączyć ze sobą łuki. FOR Dla każdego łuku ł 1 wyznaczonego w kroku drugim IF Znajdź łuk ł 2 połączony z łukiem ł 1 THEN Wyznacz punkty skrajne połączonych łuków i oznacz je jako A i B, zbuduj prosta k przechodząca przez te punkty Wyznacz prosta l prostopadłą do prostej k i przechodzącą przez środek odcinka AB Znajdź punkty przecięcia prostej l oraz łańcucha konturowego IF Znaleziono dwa punkty leżące po obu stronach prostej k THEN IF Łuki ł 1 i ł 2 tworzą zamknięty kontur IF THEN THEN Sprawdź czy można łuki aproksymować elipsa lub okręgiem i dodaj do listy Znaleziono jeden punkt IF Sprawdź czy łuki ł 1 i ł 2 można połączyć ze sobą THEN Dodaj do nowy łuk utworzony z łuków ł 1 i ł 2, usuń z listy ł 1 i ł 2 UNTIL Sprawdzono wszystkie łuki Tabela 6.5: Algorytm, który sprawdza, czy można połączyć ze sobą łuki. 39